VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
MD5(), SHA1(), SHA2()가 내장되어 있습니다. 동작은 하지만 16진수 문자열을 반환합니다 — 기반 데이터가 32바이트인 SHA-256 해시에 64자입니다. 해시를 바이너리로 저장하면 크기가 절반으로 줄고 인덱싱도 더 효율적입니다. VillageSQL의 vsql_crypto 확장에 있는 digest()는 원시 바이너리를 반환하며, 모든 알고리즘에 대해 하나의 함수를 제공합니다.
MySQL 기본: 흩어진 함수, 16진수 출력
MySQL은 해싱을 위해 세 개의 별도 함수를 제공합니다:UNHEX(SHA2('hello', 256))라고 써야 하는데, 동작은 하지만 일관되게 입력하기에는 번거롭습니다.
sha224나 sha384 옵션도 없습니다 — MySQL이 노출하는 것으로 제한됩니다.
표준 우회 방법: UNHEX + SHA2
공간을 덜 차지하는 바이너리 저장을 위해 개발자는SHA2()를 UNHEX()로 감쌉니다:
VillageSQL과 함께: digest()
VillageSQL의vsql_crypto 확장은 digest(data, algorithm)을 추가하며, 이 함수는 VARBINARY 해시를 직접 반환합니다 — UNHEX() 래퍼가 필요 없습니다.
HEX()를 사용하세요:
지원되는 알고리즘
새 애플리케이션에는 MD5나 SHA-1을 사용하지 마세요 — 둘 다 알려진 충돌 취약점이 있습니다. SHA-256이 대부분의 용도에 실용적인 기본값입니다.
특히 비밀번호 저장에는
digest()가 잘못된 도구입니다 — crypt()와 gen_salt()에 대해서는 MySQL에서 비밀번호 해싱을 참조하세요.
각 접근 방식을 사용할 때
VillageSQL 기반의 새 프로젝트에는
digest()가 더 깔끔한 선택입니다. 기존 MySQL 전용 애플리케이션에는 UNHEX(SHA2())도 똑같이 올바릅니다.
자주 묻는 질문
digest()와 SHA2()의 차이는 무엇인가요?
SHA2('hello', 256)은 64자 16진수 문자열을 반환합니다. digest('hello', 'sha256')은 32바이트 VARBINARY를 반환합니다. 둘은 같은 해시를 계산하며, 차이는 인코딩입니다. 바이너리 저장이 더 작고 인덱싱이 더 빠릅니다.
digest()로 중복 행을 감지할 수 있나요?
예.digest(content, 'sha256')을 인덱스가 있는 열에 저장한 다음 WHERE sha256 = digest(incoming_content, 'sha256')으로 조회하세요. 이것은 업로드된 파일의 중복 제거, 변경된 레코드 감지, 콘텐츠 주소 지정 조회 구축에 흔히 쓰이는 패턴입니다.
digest()는 비밀번호에 안전한가요?
아니요.digest()는 빠른 해시로, 마이크로초 단위로 계산됩니다. 비밀번호 해싱에는 느리고 반복되는 알고리즘이 필요합니다. 같은 확장의 crypt()와 gen_salt()를 사용하세요. MySQL에서 비밀번호 해싱을 참조하세요.
digest()는 HMAC을 지원하나요?
아니요 —digest()는 키가 없는 일반 해시입니다. 키 기반 인증 코드에는 hmac()을 사용하세요. MySQL의 HMAC 서명을 참조하세요.
문제 해결
참고
- MySQL에서 비밀번호 해싱 — 자격 증명을 위해 특별히 설계된 느린 적응형 해싱
- MySQL의 HMAC 서명 — 무결성 검증과 웹훅 검증을 위한 키 기반 해싱
- MySQL의 대칭 암호화 — 지문만이 아니라 데이터를 되돌려 받아야 할 때