암호화 알고리즘 종류 / Java 암호화 유틸 개발 / AES256, Base64 등 암복호화 방법
단방향 암호화
복호화 불가하여 비밀번호 암호화에 적합합니다.
SHA-256
사용자가 입력한 비밀번호를 암호화 후 SHA-256 해시 앞 16자리를 잘라서 유저 테이블 비밀번호 컬럼에 저장된 SHA-256 해시 앞 16자리와 비교하여 로그인하기도 합니다.
SHA-512
SHA-256보다 자릿수가 훨씬 길고, 보안이 강화된 암호화 알고리즘입니다.
MD5
128비트 고정 길이의 출력값을 가집니다.
양방향 암호화
복호화 가능합니다.
비밀키 암호화 기법
대칭형 암호화이고 비밀키로 암/복호화합니다.
- 블록 암호화 방식 : DES, AES 등
- 스트림 암호화 방식 : LFSR, RC4 등
공개키 암호화 기법
비대칭형 암호화이고 공개키로 암호화, 개인키로 복호화합니다.
- RSA 등
SHA512 암호화 방법
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.security.MessageDigest;
@Slf4j
@Component
public class SHA512Util {
public String getSHA512(String raw) throws Exception {
MessageDigest md = MessageDigest.getInstance("SHA-512");
md.update(raw.getBytes());
byte[] msgb = md.digest();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < msgb.length; i++) {
String tmp = Integer.toHexString(msgb[i] & 0xFF);
while (tmp.length() < 2)
tmp = "0" + tmp;
sb.append(tmp.substring(tmp.length() - 2));
}
return sb.toString();
}
}
위 SHA512 유틸 생성 후 암호화 가능합니다.
AES256 암복호화 방법
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Key;
public class AES256Util {
private byte[] iv;
private byte[] sessionKey;
private Key keySpec;
public AES256Util(String key) {
try {
this.iv = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
sessionKey = key.substring(0, 32).getBytes(StandardCharsets.UTF_8);
SecretKeySpec secretKeySpec = new SecretKeySpec(sessionKey, "AES");
this.keySpec = secretKeySpec;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 암호화
public String aesEncode(String str) {
try {
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));
byte[] encrypted = c.doFinal(str.getBytes("UTF-8"));
String enStr = new String(Base64.encodeBase64(encrypted));
return enStr;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//복호화
public String aesDecode(String str) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
SecretKeySpec secretKeySpec = new SecretKeySpec(sessionKey, "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] cipheredText = cipher.doFinal(Base64.decodeBase64(str));
return (new String(cipheredText, "UTF-8"));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
AES256Util 암호화 예시
AES256Util aes256Util = new AES256Util("32자리키값");
String encStr = aes256Util.aesEncode("암호화할값");
base64 암복호화 방법
import java.util.Base64;
public class Base64Util {
public String base64Encode(String str) throws UnsupportedEncodingException {
String result = "";
byte[] targetBytes = str.getBytes("UTF-8");
Base64.Encoder encoder = Base64.getEncoder();
String encodedString = encoder.encodeToString(targetBytes);
result = encodedString;
return result;
}
public String base64Decode(String str) throws UnsupportedEncodingException {
String result = "";
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedBytes2 = decoder.decode(str);
result = new String(decodedBytes2, "UTF-8");
return result;
}
}
base64 암호화 예시
Base64Util base64Util = new Base64Util();
String encStr = base64Util.base64Encode("암호화할값");
Leave a comment