Hash 메시지 다이제스트 프레임워크

Hash 메시지 다이제스트 프레임워크

Hash 확장은 다양한 해싱 알고리즘을 이용해 임의의 길이를 가진 메시지를 직접 또는 점진적으로 처리할 수 있는 함수들을 제공해요. HMAC 값 생성과 HKDF·PBKDF2 같은 키 파생까지 포함해요.

출처: PHP: HASH Message Digest Framework - Manual

본문

이 확장은 임의의 길이를 가진 메시지를 다양한 해싱 알고리즘으로 직접 또는 점진적으로 처리할 수 있는 함수를 제공해요. 여기에는 HMAC 값 생성과 HKDF, PBKDF2 같은 키 파생도 포함돼요.

해싱 알고리즘은 크게 세 범주로 나뉘며, 전체 목록은 hash_algos() 문서에서 확인할 수 있어요.

  • 체크섬 알고리즘(예: "crc32b", "adler32") — 전송 오류를 감지하는 상황에서 유용한 체크섬 계산용이에요. 보통 매우 빠르지만, 값이 쉽게 "추측 가능"하거나 충돌을 만들도록 조작될 수 있어서 암호화 용도로는 전혀 부적합해요.
  • 비암호화 알고리즘(예: xxHash 계열) — 해시 테이블용 해시 값을 계산하는 데 자주 쓰여요. 임의의 문자열 입력에 대해 고른 분포를 내도록 설계됐고, 일반적으로 빠르지만 역시 암호화 용도로는 부적합해요.
  • 암호화 알고리즘(예: SHA-2 계열) — 입력을 대표하면서도 추측할 수 없고 충돌에 취약하지 않은 해시 값을 만들도록 설계됐어요. 성능은 부차적인 고려인 경우가 많지만, 현대 하드웨어는 이런 알고리즘을 특별히 처리하는 경우가 많고 PHP는 가능할 때 이를 활용하려 해요.

⚠️ 주의: "md4", "md5", "sha1" 같은 초기 암호화 알고리즘 중 일부는 충돌 공격에 취약하다는 것이 입증됐어요. 암호화 용도로는 더 이상 쓰지 않는 것을 일반적으로 권장해요.

비밀번호 처리에서 해시 함수를 사용하는 모범 사례는 안전한 패스워드 해싱 FAQ에서 확인할 수 있어요.

HashContext 클래스

점진적 해싱을 위한 컨텍스트 클래스예요. __construct는 직접 인스턴스화를 막기 위해 private이며, __debugInfo, __serialize, __unserialize를 제공해요.

주요 함수

  • hash — 해시 값(메시지 다이제스트) 생성
  • hash_algos — 등록된 해싱 알고리즘 목록 반환
  • hash_copy — 해싱 컨텍스트 복사
  • hash_equals — 타이밍 공격에 안전한 문자열 비교
  • hash_file — 파일 내용으로 해시 값 생성
  • hash_init, hash_update, hash_update_file, hash_update_stream, hash_final — 점진적 해싱 흐름
  • hash_hmac, hash_hmac_algos, hash_hmac_file — HMAC 방식의 키 해시 값 생성
  • hash_hkdf — 제공된 키 입력의 HKDF 키 파생
  • hash_pbkdf2 — 제공된 비밀번호의 PBKDF2 키 파생

더 알아보기