|
| 1 | +package com.offnal.shifterz.global.util.encrypt; |
| 2 | + |
| 3 | +import com.offnal.shifterz.global.util.encrypt.impl.aes.AESEncryptor; |
| 4 | +import com.offnal.shifterz.global.util.encrypt.impl.sha.SHAEncryptor; |
| 5 | +import com.offnal.shifterz.global.util.encrypt.impl.sha.SHAType; |
| 6 | +import lombok.NonNull; |
| 7 | +import org.springframework.beans.factory.annotation.Value; |
| 8 | +import org.springframework.stereotype.Component; |
| 9 | + |
| 10 | +import java.io.File; |
| 11 | + |
| 12 | +/** |
| 13 | + * 암호화 및 해시 유틸리티 클래스입니다. |
| 14 | + * <p> |
| 15 | + * AES 암호화와 SHA 해시 기능을 제공하는 통합 유틸리티로, |
| 16 | + * 어플리케이션 내의 암호화 작업을 간편하게 수행할 수 있도록 돕습니다. |
| 17 | + * </p> |
| 18 | + */ |
| 19 | +@Component |
| 20 | +public class EncryptUtil { |
| 21 | + private final AESEncryptor aesEncryptor; |
| 22 | + private final SHAEncryptor sha256Encryptor; |
| 23 | + private final SHAEncryptor sha512Encryptor; |
| 24 | + |
| 25 | + /** |
| 26 | + * EncryptUtil 생성자. |
| 27 | + * <p> |
| 28 | + * application.yml 파일에서 설정된 AES 키를 사용하여 AES 암호화 인스턴스를 초기화하고, |
| 29 | + * SHA-256 및 SHA-512 해시 인스턴스를 생성합니다. |
| 30 | + * </p> |
| 31 | + * |
| 32 | + * @param aesKey AES 암호화에 사용할 비밀 키 |
| 33 | + * @throws IllegalArgumentException AES 키가 null이거나 비어있을 경우 발생 |
| 34 | + */ |
| 35 | + private EncryptUtil(@Value("${encrypt.aes.key}") String aesKey) { |
| 36 | + if (aesKey == null || aesKey.isEmpty()) { |
| 37 | + throw new IllegalArgumentException("AES 키는 null이거나 빈 문자열일 수 없습니다."); |
| 38 | + } |
| 39 | + this.aesEncryptor = new AESEncryptor(aesKey); |
| 40 | + this.sha256Encryptor = new SHAEncryptor(SHAType.SHA256); |
| 41 | + this.sha512Encryptor = new SHAEncryptor(SHAType.SHA512); |
| 42 | + } |
| 43 | + |
| 44 | + /** |
| 45 | + * 주어진 평문을 AES 알고리즘으로 암호화하여 Base64 문자열로 반환합니다. |
| 46 | + * |
| 47 | + * @param plainText 암호화할 평문 |
| 48 | + * @return Base64로 인코딩된 암호화 문자열 |
| 49 | + */ |
| 50 | + public String encryptAES(@NonNull String plainText) { |
| 51 | + return aesEncryptor.encryptToBase64(plainText); |
| 52 | + } |
| 53 | + |
| 54 | + /** |
| 55 | + * Base64로 인코딩된 AES 암호문을 복호화하여 평문으로 반환합니다. |
| 56 | + * |
| 57 | + * @param base64EncodedText Base64로 인코딩된 암호화 문자열 |
| 58 | + * @return 복호화된 평문 |
| 59 | + */ |
| 60 | + public String decryptAES(@NonNull String base64EncodedText) { |
| 61 | + return aesEncryptor.decryptFromBase64(base64EncodedText); |
| 62 | + } |
| 63 | + |
| 64 | + /** |
| 65 | + * 파일을 AES 알고리즘으로 암호화합니다. |
| 66 | + * |
| 67 | + * @param plainFile 암호화할 원본 파일 |
| 68 | + * @param encryptedFile 암호화된 데이터가 저장될 대상 파일 |
| 69 | + */ |
| 70 | + public void encryptFile(@NonNull File plainFile, @NonNull File encryptedFile) { |
| 71 | + aesEncryptor.encryptFile(plainFile, encryptedFile); |
| 72 | + } |
| 73 | + |
| 74 | + /** |
| 75 | + * 암호화된 파일을 AES 알고리즘으로 복호화합니다. |
| 76 | + * |
| 77 | + * @param encryptedFile 암호화된 파일 |
| 78 | + * @param plainFile 복호화된 데이터가 저장될 대상 파일 |
| 79 | + */ |
| 80 | + public void decryptFile(@NonNull File encryptedFile, @NonNull File plainFile) { |
| 81 | + aesEncryptor.decryptFile(encryptedFile, plainFile); |
| 82 | + } |
| 83 | + |
| 84 | + /** |
| 85 | + * 주어진 평문을 SHA-256 알고리즘으로 해시하여 16진수 문자열로 반환합니다. |
| 86 | + * |
| 87 | + * @param plainText 해시할 평문 |
| 88 | + * @return SHA-256 해시값 (16진수 문자열) |
| 89 | + */ |
| 90 | + public String hashSHA256(@NonNull String plainText) { |
| 91 | + return sha256Encryptor.encryptToHex(plainText); |
| 92 | + } |
| 93 | + |
| 94 | + /** |
| 95 | + * 평문이 주어진 SHA-256 해시값과 일치하는지 검증합니다. |
| 96 | + * |
| 97 | + * @param plainText 검증할 평문 |
| 98 | + * @param hashedText 비교할 SHA-256 해시값 |
| 99 | + * @return 일치하면 true, 그렇지 않으면 false |
| 100 | + */ |
| 101 | + public boolean verifySHA256(@NonNull String plainText, @NonNull String hashedText) { |
| 102 | + return sha256Encryptor.matches(plainText, hashedText); |
| 103 | + } |
| 104 | + |
| 105 | + /** |
| 106 | + * 주어진 평문을 SHA-512 알고리즘으로 해시하여 16진수 문자열로 반환합니다. |
| 107 | + * |
| 108 | + * @param plainText 해시할 평문 |
| 109 | + * @return SHA-512 해시값 (16진수 문자열) |
| 110 | + */ |
| 111 | + public String hashSHA512(@NonNull String plainText) { |
| 112 | + return sha512Encryptor.encryptToHex(plainText); |
| 113 | + } |
| 114 | + |
| 115 | + /** |
| 116 | + * 평문이 주어진 SHA-512 해시값과 일치하는지 검증합니다. |
| 117 | + * |
| 118 | + * @param plainText 검증할 평문 |
| 119 | + * @param hashedText 비교할 SHA-512 해시값 |
| 120 | + * @return 일치하면 true, 그렇지 않으면 false |
| 121 | + */ |
| 122 | + public boolean verifySHA512(@NonNull String plainText, @NonNull String hashedText) { |
| 123 | + return sha512Encryptor.matches(plainText, hashedText); |
| 124 | + } |
| 125 | +} |
0 commit comments