Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- CKA
- 기록으로 실력을 쌓자
- Kubernetes
- kotlin querydsl
- kotlin
- 공부
- Pinpoint
- Elasticsearch
- Linux
- AI
- 정보처리기사 실기
- 오블완
- aws
- mysql 튜닝
- AWS EKS
- kotlin coroutine
- MySQL
- APM
- CKA 기출문제
- PETERICA
- 정보처리기사실기 기출문제
- CloudWatch
- 코틀린 코루틴의 정석
- minikube
- kotlin spring
- 정보처리기사 실기 기출문제
- Java
- 티스토리챌린지
- IntelliJ
- Spring
Archives
- Today
- Total
피터의 개발이야기
[JAVA] 양방향 암호화기법 AES_ENCRYPT, AES_DECRPYT 본문
반응형
데이터의 암호화를 위해 개발하였던 것을 정리하도록 하겠습니다.
CryptUtil
package com.peterica.swagger.util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import org.apache.commons.codec.binary.Hex;
@Component
@Slf4j
public class CryptUtil {
private static String db_secret_key="암호화키";
// 암호화
public String generateEncryptedKey(String passKey) {
String strKey = getSHA512();
try {
final Cipher encryptCipher = Cipher.getInstance("AES");
encryptCipher.init(Cipher.ENCRYPT_MODE, generateMySQLAESKey(strKey, "UTF-8"));
return new String(Hex.encodeHex(encryptCipher.doFinal(passKey.getBytes("UTF-8")))).toUpperCase();
} catch (Exception e) {
log.error("Encrypted Key Error", e);
return null;
}
}
// 복호화
public static String generateKeyDecrypt(String passwordhex) {
String strKey = getSHA512();
try {
final Cipher decryptCipher = Cipher.getInstance("AES");
decryptCipher.init(Cipher.DECRYPT_MODE, generateMySQLAESKey(strKey, "UTF-8"));
return new String(decryptCipher.doFinal(Hex.decodeHex(passwordhex.toCharArray())));
} catch (Exception e) {
log.error("Key Decrypted Error", e);
return null;
}
}
private static SecretKeySpec generateMySQLAESKey(final String key, final String encoding) {
try {
final byte[] finalKey = new byte[16];
int i = 0;
for(byte b : key.getBytes(encoding))
finalKey[i++%16] ^= b;
return new SecretKeySpec(finalKey, "AES");
} catch(UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
// SHA512
private static String getSHA512() {
String toReturn = null;
try {
MessageDigest digest = MessageDigest.getInstance("SHA-512");
digest.reset();
digest.update(db_secret_key.getBytes("utf8"));
toReturn = String.format("%0128x", new BigInteger(1, digest.digest()));
} catch (Exception e) {
e.printStackTrace();
}
return toReturn;
}
}
Test
@Test
void cryptEncTest(){
String encStr = cryptUtil.generateEncryptedKey("암호할 대상");
System.out.println(encStr);
// 1243B4EE1CEB166505A52813487E1D325BE39F417D10D57A07A102DE7F01E0DB
}
@Test
void cryptDecTest(){
System.out.println(cryptUtil.generateKeyDecrypt("1243B4EE1CEB166505A52813487E1D325BE39F417D10D57A07A102DE7F01E0DB"));
// 암호화 대상
}
Mysql AES_ENCRYPT
select HEX(AES_ENCRYPT('암호할 대상', SHA2('암호화키', 512))) encrypt;
Mysql AEC_DECRYPT
select AES_DECRYPT(unhex('1243B4EE1CEB166505A52813487E1D325BE39F417D10D57A07A102DE7F01E0DB'), SHA2('암호화키', 512)) AS text;
소스는 여기에 있습니다.
반응형
'Programming > JAVA' 카테고리의 다른 글
[JAVA] 자바 파일 입출력, 커스컴 AutoCloseable (0) | 2021.01.17 |
---|---|
[JAVA] CSV 파일 만들기 (2) | 2021.01.14 |
[JAVA] JAVA 연습문제 풀어볼 수 있는 곳 (0) | 2020.12.19 |
[JAVA] Tomcat OutOfMemory시 톰캣 자동 재시작 (0) | 2020.12.17 |
[JAVA] HashMap, LinkedHashMap 차이점 및 사용법 (0) | 2020.12.05 |
Comments