[보안]SHA256 암호화 적용하기
by 코딩무비반응형
SHA256이란?
SHA(Secure Hash Algorithm)의 한 종류로 256비트로 구성되어 있는 64자리의 문자열을 반환한다. 일반적으로 비밀번호 암호화시 SHA256 알고리즘을 사용한다.
- 평문을 암호화했을 때 다시 평문으로 복호화할 수 없는 암호화인 단방향 암호화 알고리즘을 기반으로 한다.
- 키의 경우 난수인 uuid을 이용한다.(중복이 거의 발생하지 않는다.)
- SHA256의 경우 임의의 입력 값을 받아 256bit(32byte)로 64자리 문자열을 반환한다.
암호화 클래스
public class OpenCrypt {
public static byte[] getSHA256(String source, String salt) {
byte byteData[] = null;
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(source.getBytes());
md.update(salt.getBytes());
byteData = md.digest();
System.out.println("원문: " + source + " SHA-256: " + byteData.length + "," + byteArrayToHex(byteData));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return byteData;
}
public static byte[] generateKey(String algorithm, int keySize) throws NoSuchAlgorithmException {
KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
keyGenerator.init(keySize);
SecretKey key = keyGenerator.generateKey();
return key.getEncoded();
}
public static byte[] hexToByteArray(String hex) {
if (hex == null || hex.length() == 0) {
return null;
}
byte[] ba = new byte[hex.length() / 2];
for (int i = 0; i < ba.length; i++) {
ba[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16);
}
return ba;
}
// byte[] to hex
public static String byteArrayToHex(byte[] ba) {
if (ba == null || ba.length == 0) {
return null;
}
StringBuffer sb = new StringBuffer(ba.length * 2);
String hexNumber;
for (int x = 0; x < ba.length; x++) {
hexNumber = "0" + Integer.toHexString(0xff & ba[x]);
sb.append(hexNumber.substring(hexNumber.length() - 2));
}
return sb.toString();
}
}
유저별 salt값을 다르게 설정하여 해커가 레인보우 테이블을 이용하여 접근할 수 없게 할 수 있다.
UUID.randomUUID().toString()
그리고 그 salt 값을 db 테이블에 저장하고, 로그인시 db의 salt값을 이용하여 암호화한 것과 일치여부를 판단한다.
반응형
블로그의 정보
코딩무비
코딩무비