hash 함수를 이용하여 암호화한 해쉬값은 복호화가 불가능하다.
암호화된 해쉬값과 평문(사용자의 비밀번호라던지)을 비교하기 위해서는
암호화된 해쉬값을 비교한다.
참고 : https://medium.com/shell-tharsis/hash-collision-5891d7dde54f
hash 함수가 서로 다른 두 입력에 대해 동일한 출력 값을 나타내는 경우
어떤 hash 함수를 사용하더라도 비둘기집의 원리로 인해 해쉬 충돌은 피할 수 없다.
hash + salt
hash에 소금친다는 표현을 사용하던데 ㅋㅋㅋ
해쉬값에 매번 바뀌는 salt를 붙여서 데이터를 안전하게 저장하고
무결성을 보장하는데 사용되는 방법!
DB에 저장된 사용자의 비밀번호가 해쉬값 + salt 로 저장이 되었고
salt는 매번 바뀌는 값인데 어떻게 비교가 가능해 ?
Spring Security에는 BCryptPasswordEncoder 라는 해쉬 알고리즘을 이용하여 비밀번호를 암호화해주는 클래스가 있는데,
뭐.. 수학적인 공식을 이용해서 matches라는 메서드가 다 해주더라고
@Slf4j
public class BcryptPasswordEncoderTest {
@Test
public void testEncode() {
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encoded = passwordEncoder.encode("test123");
log.info("encoded : {}", encoded);
boolean result = passwordEncoder.matches("test123", "$2a$10$VbH05m/0tbkPA/tBjy7nCeFmJS.vNNvgot8B5FCW8dbuS1OJgXN.2");
log.info("result {}", result);
Assertions.assertTrue(result);
}
}
코드 복기 .. !
아 ~ 그런게 있다는구나 ~ 정도의 수준으로 공부해온 지금까지의 나를 반성한다..! 선생님이 정말 치밀하게 구석구석 잘 가르쳐주신 덕분에 막막하기만 했던 Spring이 점점 더 재밌어진다. BCrypt라는것도 내장되어있고 진짜 짱인걸 ~ 그리고 그게 왜 필요한지도 알지롱 ~ 아 ~~ 너무 재밌다!!! 그런데 이제 한가지 내가 부족하다고 느꼈던 점은 자바에 대한 기초지식이 너무 얉다..? 뭔가 잘 활용하고 싶은데 자바에 대한 지식이 부족하다보니 로직을 이해하는 부분이 좀 버벅인다 .. 오늘 자바 학원 알아봤는데 마땅한 곳이 없어서 인강을 알아보는 중이다. 자바 기초 틈틈히 공부한다 !!!!!!!!!!!!! 부족한게 있으면 없애면 돼 ! 나는 할 수 있어 ! 이유는 몰라 ! > . <