왜 SHA-256 또는 SHA-512를 사용해야 할까?
PHP 5.3.7 미만 버전에서 제공되는 Blowfish 알고리즘에는 알려진 보안 취약점이 존재합니다. 따라서 해당 버전 이하 환경에서는 SHA-256 또는 SHA-512 방식을 사용하는 것이 권장됩니다.
두 방식 모두 Blowfish와 유사한 솔트(salt) 형식을 사용하며, 각각 $5$(SHA-256)와 $6$(SHA-512) 접두어로 구분됩니다. 또한 선택적인 rounds(라운드) 매개변수를 지정해 해싱 작업을 여러 번 반복 수행하도록 강제할 수 있어, 무차별 대입 공격에 대한 저항력을 한층 높일 수 있습니다.
솔트(Salt) 형식의 특징
솔트는 Blowfish보다 다소 짧은 16자입니다. 하지만 Blowfish와 달리 영숫자(alphanumeric)뿐 아니라 더 다양한 문자를 사용할 수 있다는 장점이 있습니다.
예제 코드
echo 'SHA-256 (no rounds): ' . crypt('password-to-encrypt', '$5$YourSaltyStringz$');
echo 'SHA-512 (with rounds): ' . crypt('password-to-encrypt', '$6$rounds=1000$YourSaltyStringz$');- 첫 번째 예제는 라운드 설정 없이 기본 동작으로 SHA-256 해시를 생성합니다.
- 두 번째 예제는
rounds=1000옵션을 적용해 SHA-512 해싱을 1,000회 반복 수행합니다.
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
SHA-256 (no rounds): $5$YourSaltyStringz$td0INaoVoMPD4kieVrkGE67siKj3N8.HSff8ep0Ybs8
SHA-512 (with rounds): $6$rounds=1000$YourSaltyStringz$A5UHscsEbSnPnaV6PmSF5T/MQK.Wc3klA.18c.gXG5pD0PVYSVr/7xwRu1XJyn8XpiMDNRTvpJm5S8DkmSywz1
결과 해시의 구조
Blowfish와 마찬가지로, 생성된 해시 문자열에는 사용된 솔트가 그대로 포함됩니다. 따라서 비밀번호 검증 시 솔트를 별도로 저장하지 않아도 되며, 해시 문자열 하나만 데이터베이스에 보관하면 됩니다.
추가 팁: 최신 PHP 환경이라면?
PHP 5.5 이상을 사용 중이라면 crypt()를 직접 호출하기보다 password_hash() 함수를 사용하는 것이 좋습니다. 이 함수는 알고리즘 선택, 솔트 생성, 비용(cost) 조절을 자동으로 처리해 주며, password_verify()와 함께 사용하면 훨씬 안전하고 간편하게 비밀번호를 관리할 수 있습니다.