묻고답하기
암호화 관련 문의
2017.02.13 15:59
안녕하세요
암호화 관련 부분을 보고 있는데
xe 관리자 페이지 회원 설정에서 보니
예전에 코어 업데이트 하면서 암호화 방식이 md5 에서 pbkdf2 로 바뀐거 같더군요
비밀번호 암호화 소요시간은 08로 되어있던데 이거는 8번 반복한다는 건가요?
그리고 디비에서 보니 sha256 : xxxxxxx : xxxxxxxxxxxxx : xxxxxxxxxxxxxxxxxxxxx 이런식으로 저장되어 있던데
sha256은 기존 md5와 구분하기 위한거 같고..
다음 문자는 salt 인건가요? 3개로 나누어진 문자들이 뭔지 알고싶습니다.
댓글 4
-
기진곰
2017.02.13 19:46
-
wwaa456
2017.02.14 18:12
자세한 설명 감사드립니다
말씀하신대로 제가 알고있는 비밀번호와 솔트를 sha256로 8192번 돌렸는데도 해시값이 다르네요
혹시 제가 놓친게 있을까요?
아니면 솔팅 방법이 색다른가요?
-
기진곰
2017.02.14 20:49
pbkdf2는 그냥 sha256을 반복해서 돌리는 것이 아닙니다. 비트 연산과 HMAC을 사용해서 비밀번호와 솔트를 섞는 방법이 표준으로 정해져 있고, 이 방법을 따라야 동일한 해시값이 나옵니다. 그냥 sha256을 반복해서 돌리면 엔트로피가 떨어져 보안상 좋지 않다고 합니다.
XE에 포함된 Password 클래스의 createHash 함수 및 checkPassword 함수에서 사용하는 알고리듬을 똑같이 따라하셔야 합니다. PHP 5.5 이상에서 제공하는 hash_pbkdf2 함수나 이 라이브러리를 사용해도 마지막 단계에 base64 인코딩만 제대로 하면 동일한 결과를 얻을 수 있습니다. (물론 솔트가 같다는 가정 하에서 그렇습니다. 예전에 XE를 설치하신 분들은 password 필드의 길이가 60자로 제한되어 있어서 일반적으로 사용하는 20자 이상의 솔트를 넣을 자리가 없기 때문에, XE에서는 솔트 길이를 짧게 줄여 사용하고 있습니다.)
-
wwaa456
2017.02.15 20:53
자세한 설명 감사드립니다!
소요시간은 bcrypt 쪽의 표준에 맞춘 것으로, 한 자리 높아질 때마다 시간이 2배씩 걸립니다. 예를 들어 8에서 10으로 바꾸면 4배 더 오래 걸리고, 8에서 12로 바꾸면 16배 더 오래 걸립니다. 컴퓨터의 성능은 무어의 법칙에 따라 약 1.5~2년마다 2배씩 증가하기 때문에 권장 기준도 1.5~2년마다 한 자리씩 높아집니다. 2017년 현재 8은 다소 낮다는 의견이 많습니다. 아주 느린 서버가 아니라면 10 정도로 높이는 게 좋아요.
pbkdf2에서는 원래 소요시간이라는 개념이 없고 반복 횟수만 지정하도록 되어 있지만, XE에서는 bcrypt와 비슷한 소요시간을 만들어내기 위해 sha256 해시를 2(소요시간+5)회 반복하도록 합니다. 기본값 그대로 8을 사용한다면 2(8+5) = 213 = 8192번이 됩니다. 만약 12를 사용한다면 2(12+5) = 217 = 131072번이 되고요. 16배 높아지는 것을 볼 수 있지요?
DB에서 sha256 뒤에 나오는 0008192가 바로 이 반복 횟수를 기록해 놓은 것입니다. 세번째 것은 솔트이고, 네번째가 실제 해시값입니다. pbkdf2는 알고리즘(sha256), 반복 횟수, 솔트를 모두 기록해 두어야 비번이 맞는지 확인할 수 있습니다.
bcrypt도 마찬가지지만 솔트와 해시값을 바짝 붙여서 저장하기 때문에 눈에 잘 띄지 않는 것 뿐이고요. $2y$08$솔트+해시값 이런 식으로 저장됩니다. 2y가 알고리즘이고 08이 소요시간 기준입니다.