피드로 돌아가기
bcrypt and Laravel: 72 Bytes, Not 72 Characters
Dev.toDev.to
Security

bcrypt 72-byte 제한으로 인한 Multi-byte 문자 데이터 손실 및 인증 실패 해결

bcrypt and Laravel: 72 Bytes, Not 72 Characters

Ivan Mykhavko2026년 6월 21일6intermediate

Context

bcrypt 알고리즘의 72-byte 입력 제한으로 인해 Multi-byte 문자 사용 시 실제 문자 수가 72자 미만임에도 데이터가 절단되는 현상 발생. 특히 Laravel의 Password::max()mb_strlen()을 사용하여 문자 수만 체크함에 따라, 바이트 제한을 초과한 입력값이 필터링 없이 해싱 단계로 진입하는 구조적 결함 존재.

Technical Solution

  • strlen() 기반의 Byte-level Validation 도입을 통한 72-byte 초과 입력의 사전 차단
  • Laravel 12의 BCRYPT_LIMIT 설정을 통한 해싱 단계에서의 InvalidArgumentException 강제 발생으로 Silent Truncation 방지
  • Argon2id 드라이버로의 전환을 통해 알고리즘 레벨의 입력 길이 제한 제약 제거
  • Hash::needsRehash()를 활용한 기존 bcrypt 사용자들의 점진적 Argon2id 마이그레이션 전략 수립
  • HMAC-SHA256 기반의 Pre-hashing 기법을 적용하여 입력값을 고정 64-byte ASCII로 변환 후 bcrypt 처리하는 아키텍처 설계

- 비밀번호 길이 검증 시 `mb_strlen()` 대신 `strlen()`을 사용하여 Byte 크기 기준 72바이트 제한 확인 - 신규 프로젝트 설계 시 bcrypt 대신 입력 길이 제한이 없는 `Argon2id` 채택 검토 - 기존 bcrypt 환경에서 알고리즘 변경 시, `needsRehash` 로직을 통한 무중단 데이터 마이그레이션 구현 - Multi-byte 문자 경계에서 절단되는 'Split-byte' 케이스로 인한 사용자 계정 잠김 위험성 인지 및 대응

원문 읽기