SHA1 해시의 결과를 MySQL 데이터베이스에 저장하려고 할 때 발생하는 간단한 질문이 있습니다.
해시 결과를 저장 하는 VARCHAR 필드의 길이는 얼마 입니까?
답변
내가 사용하는 것이 VARCHAR
가변 길이 데이터가 아닌 고정 길이 데이터. SHA-1 값은 항상 160 비트 길이이므로 고정 길이 필드의 길이에 대해 추가 바이트를VARCHAR
낭비 합니다 .
그리고 나는 SHA1
돌아 오는 가치를 저장하지 않을 것 입니다. 문자 당 4 비트 만 사용하므로 160/4 = 40자가 필요합니다. 그러나 문자 당 8 비트를 사용하는 경우 160/8 = 20 자 길이의 필드 만 필요합니다.
내가 추천 그래서 당신이 사용 BINARY(20)
하고 UNHEX
기능은 변환하는 SHA1
바이너리 값입니다.
나는에 대한 스토리지 요구 사항을 비교 BINARY(20)
하고 CHAR(40)
.
CREATE TABLE `binary` (
`id` int unsigned auto_increment primary key,
`password` binary(20) not null
);
CREATE TABLE `char` (
`id` int unsigned auto_increment primary key,
`password` char(40) not null
);
백만 건의 기록 binary(20)
은 44.56M, char(40)
64.57M이 걸립니다.
InnoDB
엔진.
답변
SHA1 해시는 길이가 40 자입니다!
답변
아래는 필요한 비트 크기와 함께 해싱 알고리즘의 목록입니다.
- MD5 = 128 비트 해시 값.
- SHA1 = 160 비트 해시 값
- SHA224 = 224 비트 해시 값.
- SHA256 = 256 비트 해시 값
- SHA384 = 384 비트 해시 값
- SHA512 = 512 비트 해시 값.
CHAR (n)이 필요한 하나의 샘플 테이블을 작성했습니다.
CREATE TABLE tbl_PasswordDataType
(
ID INTEGER
,MD5_128_bit CHAR(32)
,SHA_160_bit CHAR(40)
,SHA_224_bit CHAR(56)
,SHA_256_bit CHAR(64)
,SHA_384_bit CHAR(96)
,SHA_512_bit CHAR(128)
);
INSERT INTO tbl_PasswordDataType
VALUES
(
1
,MD5('SamplePass_WithAddedSalt')
,SHA1('SamplePass_WithAddedSalt')
,SHA2('SamplePass_WithAddedSalt',224)
,SHA2('SamplePass_WithAddedSalt',256)
,SHA2('SamplePass_WithAddedSalt',384)
,SHA2('SamplePass_WithAddedSalt',512)
);
답변
sha1의 출력 크기는 160 비트입니다. 160/8 == 20 자 (8 비트 문자를 사용하는 경우) 또는 160/16 = 10 (16 비트 문자를 사용하는 경우)입니다.
답변
따라서 길이는 10 개의 16 비트 문자와 40 진수 사이입니다.
어쨌든 저장할 형식을 결정하고 해당 형식에 따라 필드를 고정 크기로 만듭니다. 그렇게하면 낭비되는 공간이 없습니다.
답변
사용자의 해시를 항상 저장하지 않는 경우 (예 : 계정 인증 / 로그인 URL을 잊어 버린 경우) VARCHAR을 계속 사용할 수 있습니다. 사용자가 로그인 정보를 인증 / 변경 한 후에는 해시를 사용할 수 없어야하며 이유가 없어야합니다. 임시 해시-> 사용자 연결을 저장하기 위해 별도의 테이블을 만들 수 있지만 삭제할 수는 있지만 대부분의 사람들이 이것을 귀찮게 생각하지는 않습니다.
답변
sha1 열에 색인이 필요한 경우 성능상의 이유로 CHAR (40)을 제안합니다. 필자의 경우 sha1 열은 전자 메일 확인 토큰이므로 방문 페이지에서 쿼리는 토큰으로 만 입력됩니다. 이 경우 INDEX가있는 CHAR (40)이 최선의 선택이라고 생각합니다. 🙂
이 방법을 사용하려면 $ raw_output = false를 그대로 두십시오.