위 에서 말했듯이 비밀번호는 노출 및 유출 시 사용자에게 큰 피해가 갈 수 있어 절대적으로 막아야한다.
문제점
해결 방안
암호화란 암호키와 알고리즘 기반으로 평문을 암호문으로 재구성하여 무결성 및 기밀성을 확보하는 기술.
출처 https://blog.skby.net/암호화-encryption/
해싱이란 입력값에 수학적 알고리즘(해시 함수)을 적용하여 고정된 크기의 문자열을 출력하는 과정
Salt란 해싱되기 전에 추가적인 문자열을 더하여 해싱하는 방식
공격자가 무차별 대입을 통해 하나의 해시값(암호화된 비밀번호)에 대해 원 메시지를 찾았다면 공격자는 해당 해시 값을 가진 모든 사용자의 비밀번호를 알게 되는 것으로 이러한 상황을 막기위해 메시지에 Adding salt 작업을 하는 것
@Component
public class CustomEncryptionComponent {
public String encryptPassword(String email, String password) {
try {
KeySpec spec = new PBEKeySpec(password.toCharArray(), getSalt(email), 85319, 128);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] hash = factory.generateSecret(spec).getEncoded();
return Base64.getEncoder().encodeToString(hash);
} catch (NoSuchAlgorithmException | UnsupportedEncodingException
| InvalidKeySpecException e) {
throw new RuntimeException(e);
}
}
private byte[] getSalt(String email)
throws UnsupportedEncodingException, NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-512");
byte[] key = email.getBytes(StandardCharsets.UTF_8);
return digest.digest(key);
}
}
Digest란? 암호화 알고리즘을 통해 출련된 해시 값
ex) ,SHA-512 알고리즘을 사용하여 "Hello, World!"라는 문자열을 해시하면 생성된 512비트 길이의 해시 값