Skip to content

Commit 34eefa7

Browse files
authored
[OFFNAL-32/feat][jskoo] 암호화 유틸 개발
[OFFNAL-32/feat][jskoo] 암호화 유틸 개발
2 parents eeca2b8 + a40245b commit 34eefa7

File tree

10 files changed

+909
-1
lines changed

10 files changed

+909
-1
lines changed

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ dependencies {
6565
// aws s3
6666
implementation 'io.awspring.cloud:spring-cloud-aws-starter-s3:3.4.0'
6767
implementation 'org.springframework.boot:spring-boot-starter-actuator'
68+
69+
// Apache Commons Codec
70+
implementation 'commons-codec:commons-codec:1.21.0'
6871
}
6972

7073
tasks.named('test') {
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
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+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.offnal.shifterz.global.util.encrypt;
2+
3+
/**
4+
* 단방향 암호화(해시) 기능을 정의하는 인터페이스입니다.
5+
* <p>
6+
* 주로 데이터 무결성 검증 등 복호화가 필요 없는 데이터 보호에 사용됩니다.
7+
* </p>
8+
*/
9+
public interface OneWayEncryptor {
10+
11+
/**
12+
* 평문을 암호화(해시)하여 바이트 배열로 반환합니다.
13+
*
14+
* @param plainText 암호화할 평문
15+
* @return 암호화된 바이트 배열
16+
*/
17+
byte[] encrypt(String plainText);
18+
19+
/**
20+
* 평문을 암호화(해시)하여 16진수 문자열로 반환합니다.
21+
*
22+
* @param plainText 암호화할 평문
23+
* @return 암호화된 해시값 (16진수 문자열)
24+
*/
25+
String encryptToHex(String plainText);
26+
27+
/**
28+
* 평문이 주어진 암호화된 바이트 배열과 일치하는지 검증합니다.
29+
*
30+
* @param plainText 검증할 평문
31+
* @param hashedText 비교할 암호화된 바이트 배열
32+
* @return 일치 여부 (true/false)
33+
*/
34+
boolean matches(String plainText, byte[] hashedText);
35+
36+
/**
37+
* 평문이 주어진 암호화된 해시 문자열과 일치하는지 검증합니다.
38+
*
39+
* @param plainText 검증할 평문
40+
* @param hashedText 비교할 암호화된 해시 문자열
41+
* @return 일치 여부 (true/false)
42+
*/
43+
boolean matches(String plainText, String hashedText);
44+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.offnal.shifterz.global.util.encrypt;
2+
3+
import java.io.File;
4+
5+
/**
6+
* 양방향 암호화(대칭키/비대칭키) 기능을 정의하는 인터페이스입니다.
7+
* <p>
8+
* 암호화와 복호화가 모두 가능한 알고리즘을 사용하여 데이터의 기밀성을 보장합니다.
9+
* </p>
10+
*/
11+
public interface TwoWayEncryptor {
12+
13+
/**
14+
* 평문을 암호화하여 바이트 배열로 반환합니다.
15+
*
16+
* @param plainText 암호화할 평문
17+
* @return 암호화된 데이터 (바이트 배열)
18+
*/
19+
byte[] encrypt(String plainText);
20+
21+
/**
22+
* 원본 파일을 암호화하여 대상 파일로 저장합니다.
23+
*
24+
* @param plainFile 암호화할 원본 파일
25+
* @param encryptedFile 암호화된 데이터가 저장될 대상 파일
26+
*/
27+
void encryptFile(File plainFile, File encryptedFile);
28+
29+
/**
30+
* 평문을 암호화하여 Base64 인코딩된 문자열로 반환합니다.
31+
*
32+
* @param plainText 암호화할 평문
33+
* @return Base64로 인코딩된 암호문
34+
*/
35+
String encryptToBase64(String plainText);
36+
37+
/**
38+
* 암호화된 바이트 배열을 복호화하여 평문으로 반환합니다.
39+
*
40+
* @param encryptedArray 복호화할 암호화 데이터 (바이트 배열)
41+
* @return 복호화된 평문
42+
*/
43+
String decrypt(byte[] encryptedArray);
44+
45+
/**
46+
* 암호화된 파일을 복호화하여 대상 파일로 저장합니다.
47+
*
48+
* @param encryptedFile 복호화할 암호화된 파일
49+
* @param plainFile 복호화된 데이터가 저장될 대상 파일
50+
*/
51+
void decryptFile(File encryptedFile, File plainFile);
52+
53+
/**
54+
* Base64로 인코딩된 암호문을 복호화하여 평문으로 반환합니다.
55+
*
56+
* @param base64EncodedText Base64로 인코딩된 암호문
57+
* @return 복호화된 평문
58+
*/
59+
String decryptFromBase64(String base64EncodedText);
60+
}

0 commit comments

Comments
 (0)