쌓고 쌓다

BCryptPasswordEncoder.encode 값이 매번 달라지는 이유 및 비교방법 본문

프로그래밍/spring

BCryptPasswordEncoder.encode 값이 매번 달라지는 이유 및 비교방법

승민아 2024. 1. 20. 15:07

"/login"으로 로그인을 시도하여 

 

System.out.println("로그인 시도한 pwd = " + member.getLoginPwd());
String encodePwd = bCryptPasswordEncoder.encode(member.getLoginPwd());
System.out.println("로그인시 입력한 비밀번호를 인코딩한 결과 = " + encodePwd);

인코딩된 비밀번호 로그를 출력해보았다.

 

 

 

로그인 시도한 pwd = 1234
로그인시 입력한 비밀번호를 인코딩한 결과 = $2a$10$Jr8A352R8VZcfnN/SP5vCubnL2TZSUm4FSNioawR.VZ5X7i2kvldu

로그인 시도한 pwd = 1234
로그인시 입력한 비밀번호를 인코딩한 결과 = $2a$10$Vf/peAOPOqPhDwyC8UuHK.68Ps2kLU3DZmV7EyzDrFmEw57NHlsMG

인코딩시 결과가 계속 바뀐다.

 

앞전에 회원가입 코드를 작성하며

bCryptPasswordEncoder.encode를 다뤘는데

그때도 뭔가 암호화된 결과 테이블이 있다면 복호화도 가능할거라 생각했었는데

 

역시나 간단한 암호화 알고리즘이 아니였다.

 

 

간단히 다음과 같이 입력한 비밀번호를 암호화하여 DB에 저장된 비밀번호를 equals로 비교하면 될 것 같았지만

if(input.equals(findMember.getLoginPwd())) {
    return "로그인 성공";
} else {
    System.out.println("비밀번호가 틀림");
}

계속 일치하지 않게된다.

 

BCrypt는 추가적인 정보 Salt와 함께 동작하기에

동일한 입력에 대해서도 다른 결과값을 만들어낸다.

 

그래서 equals 함수가 아닌

BCryptPasswordEncoder.matches를 사용하여 비밀번호 비교가 가능하다.

 

다음과 같이 matches 함수를 사용한다.

if(bCryptPasswordEncoder.matches(member.getLoginPwd(), findMember.getLoginPwd())) {
    return "로그인 성공";
} else {
    return "비밀번호가 틀림";
}

 

날것의 비밀번호(사용자가 입력한 그 자체 문자열), 암호화된 비밀번호(DB에 저장되어 있는 비밀번호)를 순서대로 입력한다.

Comments