일지이기 때문에 일기의 성격이 더 강합니다.

SHA256
SHA256 또한 MD5와 같은 해싱 중 하나이다. SHA-2 계열로, 128비트였던 MD5보다 긴 256비트로 현재로서는 권장되는 방법이다. 다만 후술할 SALT 및 키 스트레칭과 함께 사용되는 편이다. 사용 코드는 다음과 같다.
public static String sha256(String msg) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA256");
md.update(msg.getBytes());
return bytesToHex(md.digest());
}
public static String bytesToHex(byte[] bytes){
StringBuilder builder = new StringBuilder();
for(byte b : bytes){
builder.append(String.format("%02x", b));
}
return builder.toString();
}
MD5와 같이 16진수이지만 좀 더 깔끔하게 다듬어서 SHA-256을 사용한다.
보다시피 핵심은 MessageDigest.getInstance()로서, MD5의 경우 MD5를 적었지만, SHA256은 SHA-256으로 적었다. 이후는 MD5와 비슷하지만 StringBuilder 등 사용하여 좀 더 깔끔하게 다듬었다(필드 저장 등을 생략하고, toHex과정을 String.format으로 더 간단하게 하였다).
SALT
다만 SHA-256와 같이 해시만 사용할 경우 브루트 포스 공격과 같은 무차별 대입을 통하여 해시값을 비교하여 알 수 있고, 최근에는 이 SHA-256에 대한 레인보우 테이블 또한 존재하기 때문에 SALT 및 키 스트레칭을 사용한다. 키 스트레칭의 경우 SHA-256과 같은 해싱을 N번 반복하여 만드는 것이다.
SALT는 SecureRandom이라는 클래스를 사용하여 만드는 난수값으로, 회원 별로 별도의 서버에 저장하여(해시 값이 있는 서버와 다른 서버를 사용해야한다.) 해당 회원이 로그인 할 때 DB에서 값을 불러와 해시와 같이 조합하여 사용하게 된다. 따라서 SHA-256을 사용하더라도 각 회원별로, 그리고 사이트별 마다 SALT와 키스트레칭으로 복잡한 값이 만들어짐으로써 데이터가 누출되더라도 쉬이 로그인하지 못하도록 하는 것이다.
public static String getSALT() throws Exception {
SecureRandom rnd = new SecureRandom();
byte[] temp = new byte[SALT_SIZE];
rnd.nextBytes(temp);
return Byte_to_String(temp);
}
public static String Byte_to_String(byte[] temp){
StringBuilder sb = new StringBuilder();
for (byte a : temp){
sb.append(String.format("%02x", a));
}
return sb.toString();
}
public static String Hashing(byte[] password, String salt) throws Exception {
MessageDigest md = MessageDigest.getInstance("SHA-256");
for (int i = 0; i < 10000; i++) {
String temp = Byte_to_String(password) + salt;
md.update(temp.getBytes());
password = md.digest();
}
return Byte_to_String(password);
}
최근 비밀번호용 해싱으로는 PBKDF2 / bcrypt / Argon2와 같은 것이 존재한다. 실무에서는 키 스트레칭을 여러번 돌리는 것보다는 이런 것들을 사용하는 경우가 더 많다고.
덧붙임
SALT값을 사용자 정보와 같은 테이블에 저장해두기도 하는데, 서버를 하나 더 돌리는 비용(관리 비용) 등 때문에 그렇다고 한다. 하지만 보안상으로는 둘이 나누는 것이 좋다고.
'부트캠프 일지 > Java 풀스택 과정 강의' 카테고리의 다른 글
| [Java 풀스택 과정 강의] 3월 19일 (0) | 2026.03.20 |
|---|---|
| [Java 풀스택 과정 강의] 3월 18일 (0) | 2026.03.19 |
| [Java 풀스택 과정 강의] 3월 16일 (0) | 2026.03.19 |
| [Java 풀스택 과정 강의] 3월 13일 (0) | 2026.03.14 |
| [Java 풀스택 과정 강의] 3월 12일 (0) | 2026.03.14 |