비밀번호 전용 KDF와, 비용 파라미터가 낡았을 때 다시 해시할지 판단하는 로직을 공통 모듈로 제공합니다.
비밀번호는 복호화할 수 있는 형태로 저장하지 않습니다. 공격 비용을 높이는 전용 KDF로 검증값을 만들고, 사용자마다 다른 salt를 씁니다. 비용 파라미터를 결과에 함께 기록해 두면, 보안 기준이 바뀌었을 때 사용자가 로그인에 성공할 때마다 하나씩 재해시할 수 있습니다.
메모리와 계산 비용을 조절할 수 있는 알고리즘으로, 대량 추측 공격에 드는 비용을 올립니다.
비밀번호마다 무작위 salt를 써서, 같은 비밀번호도 서로 다른 검증값이 되게 합니다.
저장된 알고리즘과 비용이 현재 정책보다 약한지 판정해, 따로 마이그레이션하지 않고도 보안 수준을 올립니다.
아래 증명은 글로 된 설명이 아닙니다. 버튼을 누르면 이 서버가 지금 직접 계산합니다.
저장 형식이 아니라 알고리즘 자체를 규격에 맞춥니다. 규격 문서에 실린 비밀번호·salt·파라미터를 넣으면 문서에 실린 64바이트 키가 그대로 나옵니다. 메모리를 1 GiB나 요구하는 규격의 마지막 벡터는 정책이 거부합니다.
표준 문서에 실린 테스트 벡터를 그대로 넣어 같은 값이 나오는지 확인합니다.
PBKDF2는 반복 횟수만 늘립니다. 반복을 아무리 올려도 필요한 메모리는 그대로라서, GPU·ASIC처럼 연산을 대량으로 병렬 처리하는 하드웨어에 약합니다. scrypt는 메모리도 함께 요구해 병렬 처리 비용 자체를 올립니다. 같은 '비밀번호 해시'라도 무엇을 비싸게 만드는지가 다릅니다.
표준 문서에 실린 테스트 벡터를 그대로 넣어 같은 값이 나오는지 확인합니다.
검증값에는 알고리즘·버전·비용 파라미터·salt가 함께 담깁니다. 그래서 정책을 올려도 기존 해시를 그대로 검증할 수 있습니다. 같은 비밀번호라도 저장값이 서로 달라서 한꺼번에 대량으로 대조할 수 없습니다.
표준 문서에 실린 테스트 벡터를 그대로 넣어 같은 값이 나오는지 확인합니다.
검증은 상수 시간 비교로 이뤄지고, 저장값을 조금이라도 바꾸면 검증을 통과하지 못합니다. 정책도 하한보다 낮게는 구성할 수 없습니다.
막아야 할 입력을 실제로 넣고 거부되는지 확인합니다.
규격 원문을 먼저 실었습니다. 사례는 이 분야에서 실제로 보안이 뚫린 일을 다룬 자료입니다.
메모리 하드 KDF의 원문입니다. §12에 고정 벡터가 있습니다.
argon2id, scrypt, bcrypt 중 무엇을 언제 쓸지 정리합니다.
반복 횟수만으로 비용을 올리는 이전 세대 KDF입니다. 비교용으로 읽을 만합니다.
다음 단계
운영 하드웨어에서 scrypt 비용을 측정하고, 로그인에 성공할 때마다 점진적으로 재해시하는 흐름을 연결합니다.