programing

MySQL에 SHA1 해시 값 저장

randomtip 2022. 9. 30. 09:43
반응형

MySQL에 SHA1 해시 값 저장

SHA1 해시 결과를 MySQL 데이터베이스에 저장하려고 할 때 발생한 간단한 질문이 있습니다.

해시 결과를 저장하는 VARCHAR 필드는 얼마나 길어야 합니까?

나는 사용할 것이다.VARCHAR가변 길이 데이터의 경우이지만 고정 길이 데이터의 경우 그렇지 않습니다.SHA-1 값은 항상 160비트이기 때문에VARCHAR고정 길이 필드의 길이에 대한 추가 바이트만 낭비됩니다.

또한 반환되는 값도 저장하지 않습니다.문자당 4비트만 사용하기 때문에 160/4 = 40자가 필요합니다.그러나 문자당 8비트를 사용하는 경우 160/8 = 20자 길이의 필드만 필요합니다.

따라서 와 를 사용하는 을 추천합니다.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엔진입니다.gengine을 클릭합니다.

SHA1 해시의 길이는 40자입니다!

이 블로그에서 인용한 참고 자료:

해시 알고리즘과 그 필요 비트사이즈를 다음에 나타냅니다.

  • MD5 = 128비트 해시 값.
  • SHA1 = 160비트 해시 값입니다.
  • SHA224 = 224비트 해시 값.
  • SHA256 = 256비트 해시 값.
  • SHA384 = 384비트 해시 값.
  • SHA512 = 512비트 해시 값.

require CHAR(n)을 사용하여 샘플테이블을 1개 작성했습니다.

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비트 문자를 사용하는 경우)입니다.

길이는 16비트 문자 10자리에서 16진수 40자리 사이입니다.

어떤 경우에도 저장할 형식을 결정하고 해당 형식에 따라 필드를 고정 크기로 만듭니다.그래야 낭비되는 공간이 없어집니다.

사용자의 해시를 항상 저장하지 않는 경우(계정 인증/로그인 URL을 잊어버린 경우)에도 VARCHAR을 사용할 수 있습니다.사용자가 로그인 정보를 인증/변경한 후에는 해시를 사용할 수 없으며 사용할 이유가 없습니다.삭제할 수 있는 임시 해시 -> 사용자 어소시에이션을 저장하기 위해 별도의 테이블을 만들 수 있지만, 대부분의 사람들은 그렇게 하지 않을 것입니다.

sha1 column에 인덱스가 필요한 경우 성능상의 이유로 CHAR(40)를 권장합니다.제 경우 sha1 열은 이메일 확인 토큰이므로 랜딩 페이지에서 쿼리는 토큰으로만 입력됩니다.이 경우 INDEX가 있는 CHAR(40)가 가장 좋은 선택이라고 생각합니다.

이 메서드를 채택하려면 $raw_output = false를 남겨두어야 합니다.

언급URL : https://stackoverflow.com/questions/614476/storing-sha1-hash-values-in-mysql

반응형