비밀번호 암호화 생성과 관련된 질문입니다.
본문
비회원 글쓰기 해서
저장한 비밀번호 'abcd'가 'sha256:12000:1iclHpgZ4qqsxUjlBviqo4+YlloGV/Dc:VFRzETIEo2UkxXzSTOIxlYcKchZ+CO45'
이렇게 db에 저장되었군요.
정식으로 회원가입해서
비밀번호로 저장한 'abcd'가
sha256:12000:zFwjJVqT2C/hukUroseuJH17vOPVY5aC:Lfpm8Rqk+Be2mpOZxv4S3kwjpBwrd1KG
이렇게 저장되었습니다.
똑같은 문자열
'abcd'인데 암호화된 값이 달라지네요.
무슨 원리인가요?
답변 2
비밀번호를 암호화할 때, 일반적으로 salt라는 무작위 문자열이 추가됩니다. 이 salt는 비밀호와 함께 해시 함수에 전달되어, 같은 비밀호라도 다른 해시 값을 생성하게 됩니다. 이렇게 함으로써, 비밀호가 노출되더라도 해시 값이 다르기 때문에, 비밀번호의 안전성이 높아집니다.
예를 들어, 위에서 언급한 sha256:12000:1iclHpgZ4qqsxUjlBviqo4+YlloGV/Dc:VFRzETIEo2UkxXzSTOIxlYcKchZ+CO45
와 sha256:12000:zFwjJVqT2C/hukUroseuJH17vOPVY5aC:Lfpm8Rqk+Be2mpOZxv4S3kwjpBwrd1KG
두 개의 해시 값은 sha256
알고리즘을 사용하고 있으며, 12000
번 반복해서 해시를 적용했습니다. 그리고 1iclHpgZ4qqsxUjlBviqo4+YlloGV/Dc
와 zFwjJVqT2C/hukUroseuJH17vOPVY5aC
는 각각의 salt 값입니다. 이 salt 값이 다르기 때문에, 같은 비밀호인 abcd
라도 다른 해시 값을 생성하게 됩니다.
비밀번호 검증을 할 때는, 저장된 해시 값에서 salt 값을 추출하여, 입력된 비밀번호와 함께 해시 함수에 전달하여 검증합니다. 이러한 방식으로, 비밀번호의 안전성을 높일 수 있습니다.
암호화를 수행할때 salt (매번 다르게 생성되는 값)을 조합함으로써 가능해집니다.
글쓰기의 경우 사용되는 함수와 salt 값은 다음의 경로로 확인할수 있고
https://github.com/gnuboard/gnuboard5/blob/master/bbs/write_update.php#L241
>
https://github.com/gnuboard/gnuboard5/blob/master/lib/common.lib.php#L3478
>
https://github.com/gnuboard/gnuboard5/blob/master/config.php#L192
>
https://github.com/gnuboard/gnuboard5/blob/master/lib/pbkdf2.compat.php#L45
salt 값은
https://github.com/gnuboard/gnuboard5/blob/master/lib/pbkdf2.compat.php#L74
에 보이는것 처럼 :(colon) 을 구분자로 3번째 위치에 있고
생성된 암호화 문자열에서 각각의 salt 값은 다음과 같습니다.
// 첫번째 생성 (비회원)
sha256:12000:1iclHpgZ4qqsxUjlBviqo4+YlloGV/Dc:VFRzETIEo2UkxXzSTOIxlYcKchZ+CO45
sha256 : 12000 : 1iclHpgZ4qqsxUjlBviqo4+YlloGV/Dc : VFRzETIEo2UkxXzSTOIxlYcKchZ+CO45
// salt = 1iclHpgZ4qqsxUjlBviqo4+YlloGV/Dc
// 두번째 생성 (회원가입)
sha256:12000:zFwjJVqT2C/hukUroseuJH17vOPVY5aC:Lfpm8Rqk+Be2mpOZxv4S3kwjpBwrd1KG
sha256 : 12000 : zFwjJVqT2C/hukUroseuJH17vOPVY5aC : Lfpm8Rqk+Be2mpOZxv4S3kwjpBwrd1KG
// salt = zFwjJVqT2C/hukUroseuJH17vOPVY5aC