[解決済み】ハッシュ化されたパスワードフィールドに使用するデータ型と長さは?
質問
パスワードハッシュの仕組みがよくわからないのですが(後日実装予定)、今すぐデータベーススキーマを作成する必要があります。
パスワードは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は、これらの単純なハッシュ関数をパスワードの安全な保存に使用することは推奨していません。
より小さなハッシュアルゴリズムにも用途はありますが(交換用ではなく、アプリケーション内部のような)、それらは クラック可能であることが知られている .
関連
-
[解決済み] 日付の挿入時にエラーが発生しました - 日付の値が正しくありません。
-
[解決済み] C#でお金に使うデータ型は何が良いのか?
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] ブーリアン値を格納するために使用するMySQLデータ型
-
[解決済み] bcryptはどうして塩を内蔵しているのですか?
-
[解決済み】type()とisinstance()の違いは何ですか?)
-
[解決済み】PHPパスワードのハッシュとソルトの安全性について
-
[解決済み】塩の文字列はどこに保存していますか?
-
[解決済み] ベストプラクティス。パスワードのソルティングとペパリング?
-
[解決済み] データベースにBcryptハッシュ化されたパスワードを格納するために使用する列の種類/長さは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】MySQLユーザーDBにパスワードカラムがない - OSXへのMySQLインストール
-
[解決済み] 親の行を削除または更新できない: 外部キー制約に失敗 - MYSQL
-
[解決済み] mysql.pluginテーブルを開くことができません。mysql_upgradeを実行し、作成してください。
-
[解決済み] ONLY_FULL_GROUP_BYの無効化
-
[解決済み] エラー:テーブル '<table-name>' に対するユーザー '<userid>'@'<ip-address>' への select コマンドが拒否されました。
-
[解決済み] 「他のデータベースへのクエリを無視する」コマンドライン
-
[解決済み] エラー1022 - 書き込みできません; テーブルに重複したキーがあります。
-
[解決済み] 日付の挿入時にエラーが発生しました - 日付の値が正しくありません。
-
[解決済み] bcryptはどうして塩を内蔵しているのですか?
-
[解決済み] データベースにBcryptハッシュ化されたパスワードを格納するために使用する列の種類/長さは何ですか?