솔트
솔트는 비밀번호를 해시할 때 사용자별로 생성해 함께 입력하는 고유한 임의값이며 동일한 비밀번호가 서로 다른 해시값을 갖게 합니다.
솔트
솔트는 비밀번호 저장에서 미리 계산된 대규모 해시표의 효율을 낮추고, 같은 비밀번호를 사용하는 이용자들의 해시값이 같아지는 현상을 막습니다. 솔트는 충분한 길이의 예측하기 어려운 값으로 각 비밀번호마다 새로 생성해야 합니다.
솔트의 목적은 비밀 유지가 아닙니다. 일반적으로 해시값과 함께 저장할 수 있습니다. 공격자가 각 사용자의 비밀번호 후보를 개별적으로 계산하도록 만들어 대규모 공격 비용을 높이는 역할을 합니다.
핵심 특성
사용 맥락과 작동 원리
비밀번호 등록 시 서비스는 안전한 난수 생성기로 솔트를 만들고 비밀번호와 함께 전용 해시 함수에 입력합니다. 검증 시 저장된 솔트를 다시 사용해 같은 계산을 수행합니다.
bcrypt와 Argon2id 같은 현대 비밀번호 저장 형식은 솔트를 결과 문자열 안에 포함하는 경우가 많습니다. 개발자가 별도 필드를 직접 설계하지 않아도 라이브러리가 안전하게 처리할 수 있습니다.
유출·오용 시 위험
솔트가 유출되었다는 사실 자체는 비밀번호 원문 유출을 뜻하지 않습니다. 해시값, 알고리즘, 작업비용, 비밀번호 강도가 전체 위험을 결정합니다. 솔트가 없거나 여러 사용자에게 같은 값이 사용되면 공격자는 계산 결과를 재사용할 수 있습니다.
솔트를 암호화 키나 공통 비밀값처럼 관리하면 구현이 복잡해질 수 있습니다. 추가 비밀값이 필요한 경우 페퍼를 별도 비밀관리 시스템에서 관리하는 방식이 사용됩니다.
사건 공지에서 확인할 항목
- 사용자별 고유 솔트가 적용되었는지 확인합니다.
- 솔트 길이와 난수 생성 방식이 적절한지 확인합니다.
- 비밀번호 전용 해시 알고리즘과 작업비용을 확인합니다.
- 공통 솔트와 하드코딩된 값 사용 여부를 확인합니다.
- 페퍼가 있다면 별도 시스템에서 관리되었는지 확인합니다.
개인이 취할 조치
- 솔트 유출 공지와 비밀번호 해시 유출 공지를 구분해 확인합니다.
- 해시값이 함께 유출되었으면 비밀번호를 변경합니다.
- 같은 비밀번호를 사용한 다른 계정도 고유한 값으로 바꿉니다.
- MFA와 비밀번호 관리자를 사용합니다.
조직의 보호조치
- 검증된 비밀번호 해시 라이브러리의 자동 솔트 기능을 사용합니다.
- 솔트를 안전한 난수 생성기로 충분한 길이로 생성합니다.
- 각 비밀번호 레코드에 고유한 값을 적용합니다.
- 페퍼는 코드와 DB에서 분리된 비밀관리 시스템에 저장합니다.
- 자체 암호 형식 설계를 피하고 저장 형식의 마이그레이션 절차를 마련합니다.
혼동하기 쉬운 개념
솔트는 사용자별로 공개 저장 가능한 고유값입니다. 페퍼는 서비스가 별도로 보호하는 공통 또는 분리된 비밀값입니다. 해시는 비밀번호와 솔트를 계산한 결과입니다. 암호화 키는 원문 복호화에 사용되는 비밀값입니다.