1. ホーム
  2. マイスル

[解決済み】ハッシュ化されたパスワードフィールドに使用するデータ型と長さは?

2022-03-30 07:12:18

質問

パスワードハッシュの仕組みがよくわからないのですが(後日実装予定)、今すぐデータベーススキーマを作成する必要があります。

パスワードは4-20文字に制限しようと思っていますが、暗号化した後のハッシュ文字列は異なる長さになると理解しています。

では、このパスワードをデータベースに保存するにはどうすればよいのでしょうか。

どのように解決するのか?

更新:ハッシュ関数を使用するだけでは、パスワードの保存には十分な強度がありません。以下をお読みください。 このスレッドでのGillesの回答 をご覧ください。

パスワードには、BcryptやArgon2iのような鍵強化ハッシュアルゴリズムを使用します。例えば、PHPでは password_hash()関数 デフォルトでBcryptを使用します。

$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

結果は以下のような60文字の文字列となる(ただし、ユニークなソルトを生成するため、桁数は異なる)。

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

SQLデータ型を使用する CHAR(60) を使用して、Bcrypt ハッシュのこのエンコーディングを保存します。この関数は16進数の文字列としてエンコードしないので、バイナリで保存するために簡単にアンハックスできないことに注意してください。

他のハッシュ関数はまだ使い道がありますが、パスワードの保存には使えないので、以下、2008年に書かれたオリジナルの答えのままにしておきます。


使用するハッシュアルゴリズムに依存します。 ハッシュは入力に関係なく、常に同じ長さの結果を生成します。 バイナリハッシュの結果をテキストで表現するのが一般的で、16進数の数字の羅列となります。 あるいは UNHEX() 関数を使えば、16進数の文字列を半分に減らすことができます。

  • MD5は128ビットのハッシュ値を生成します。 CHAR(32)またはBINARY(16)を使用することができます。
  • SHA-1は160ビットのハッシュ値を生成します。 CHAR(40)またはBINARY(20)が使用可能です。
  • SHA-224は224ビットのハッシュ値を生成します。 CHAR(56)またはBINARY(28)を使用することができます。
  • SHA-256は256ビットのハッシュ値を生成します。 CHAR(64)またはBINARY(32)を使用することができます。
  • SHA-384は、384ビットのハッシュ値を生成します。 CHAR(96)またはBINARY(48)が使用可能です。
  • SHA-512は512ビットのハッシュ値を生成します。 CHAR(128)またはBINARY(64)が使用可能です。
  • BCryptは、実装に依存した448ビットのハッシュ値を生成します。 CHAR(56)、CHAR(60)、CHAR(76)、BINARY(56)またはBINARY(60)が必要な場合があります。

2015年現在、NIST は、SHA-256以上の使用を推奨しています。 相互運用性を必要とするハッシュ関数に使用されます。しかし、NISTは、これらの単純なハッシュ関数をパスワードの安全な保存に使用することは推奨していません。

より小さなハッシュアルゴリズムにも用途はありますが(交換用ではなく、アプリケーション内部のような)、それらは クラック可能であることが知られている .