web-dev-qa-db-ja.com

MySQLにSHA1ハッシュ値を保存する

私は、MySQLデータベースにSHA1ハッシュの結果を保存したいときに発生した簡単な質問があります。

ハッシュの結果を保存するVARCHARフィールドの長さはどれくらいですか?

154
niklasfi

可変長データにはVARCHARを使用しますが、固定長データには使用しません。 SHA-1の値はalways160ビットなので、VARCHARは単に 長さの追加バイト固定長フィールド

また、 SHA1 が返す値を保存しません。 1文字につき4ビットしか使用しないため、160/4 = 40文字が必要になるためです。ただし、1文字あたり8ビットを使用する場合、必要なフィールドは160/8 = 20文字のみです。

したがって、 BINARY(20)UNHEX function を使用して、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)には64.57Mが必要ですが、char(40)には100万件のレコードがあります。 InnoDBエンジン。

306
Gumbo

SHA1ハッシュは40文字です!

42
schmilblick

このブログから引用したリファレンス:

以下は、ハッシュアルゴリズムとその必要なビットサイズのリストです:

  • MD5 = 128ビットのハッシュ値。
  • SHA1 = 160ビットのハッシュ値。
  • SHA224 = 224ビットのハッシュ値。
  • SHA256 = 256ビットのハッシュ値。
  • SHA3​​84 = 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)
);
11
Anvesh

Sha1の出力サイズは160ビットです。 160/8 == 20文字(8ビット文字を使用する場合)または160/16 = 10(16ビット文字を使用する場合)です。

6
inazaruk

そのため、長さは10個の16ビット文字と40桁の16進数の間です。

いずれにしても、保存する形式を決定し、その形式に基づいてフィールドを固定サイズにします。そうすれば、無駄なスペースはありません。

3
Douglas Leeder

Sha1列にインデックスが必要な場合は、パフォーマンス上の理由からCHAR(40)をお勧めします。私の場合、sha1列は電子メールの確認トークンであるため、ランディングページではクエリはトークンのみで入力されます。この場合、私の意見では、INDEX付きのCHAR(40)が最良の選択です。

この方法を採用する場合は、$ raw_output = falseのままにしてください。

2

ユーザーのハッシュを常に保存する必要がない場合(つまり、アカウントの認証/ログインURLを忘れた場合)でも、VARCHARを使用することができます。ユーザーがログイン情報を認証/変更したら、ハッシュを使用することはできず、理由もありません。一時的なハッシュを保存するための別のテーブルを作成することができます->削除できるユーザーの関連付けが、私はほとんどの人がこれを行うことを気にしないと思います。

2
Keith Harty