パスワードハッシュがどのように機能するかはわかりませんが(後で実装します)、データベーススキーマを今すぐ作成する必要があります。
パスワードを 4 ~ 20 文字に制限することを考えていますが、ハッシュ文字列を暗号化すると長さが異なることがわかります。
では、これらのパスワードをデータベースに保存する方法は?
パスワードハッシュがどのように機能するかはわかりませんが(後で実装します)、データベーススキーマを今すぐ作成する必要があります。
パスワードを 4 ~ 20 文字に制限することを考えていますが、ハッシュ文字列を暗号化すると長さが異なることがわかります。
では、これらのパスワードをデータベースに保存する方法は?
更新: ハッシュ関数を使用するだけでは、パスワードを保存するのに十分な強度がありません。より詳細な説明については、このスレッドの Gilles からの回答をお読みください。
パスワードには、Bcrypt や Argon2i などのキー強化ハッシュ アルゴリズムを使用します。たとえば、PHP では、デフォルトで Bcrypt を使用するpassword_hash() 関数を使用します。
$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
結果は、次のような 60 文字の文字列になります (ただし、一意のソルトが生成されるため、数字は異なります)。
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
SQL データ型CHAR(60)
を使用して、この Bcrypt ハッシュのエンコーディングを格納します。この関数は 16 進数の文字列としてエンコードしないため、バイナリに格納するために簡単に unhex できないことに注意してください。
他のハッシュ関数にはまだ用途がありますが、パスワードを保存するためのものではないため、2008 年に書かれた元の回答を以下に残しておきます。
使用するハッシュアルゴリズムによって異なります。ハッシュは、入力に関係なく、常に同じ長さの結果を生成します。一連の 16 進数として、バイナリ ハッシュ結果をテキストで表すのが一般的です。または、UNHEX()
関数を使用して、16 進数の文字列を半分に減らすことができます。
2015 年現在、NISTは、相互運用性を必要とするハッシュ関数のアプリケーションにはSHA-256 以上を使用することを推奨しています。ただし、NIST は、パスワードを安全に保存するためにこれらの単純なハッシュ関数を使用することを推奨していません。
下位ハッシュ アルゴリズムには用途がありますが (交換用ではなく、アプリケーションの内部など)、クラック可能であることが知られています。
各ハッシュアルゴリズムは常に同じ文字数で評価されるため、実際にはCHAR
(ハッシュの長さ)を使用してMySQLのデータ型を定義できます。たとえば、SHA1
常に40文字の16進数を返します。
このウィキペディアの塩漬けに関する記事は価値があると思うかもしれません。アイデアは、一連のデータを追加してハッシュ値をランダム化することです。これにより、誰かがパスワード ハッシュに不正にアクセスした場合に、パスワードが辞書攻撃から保護されます。
固定長文字列として (VARCHAR(n) または MySQL がそれを呼び出します)。ハッシュは常に、たとえば 12 文字の固定長です (使用するハッシュ アルゴリズムによって異なります)。したがって、20 文字のパスワードは 12 文字のハッシュに削減され、4 文字のパスワードも 12 文字のハッシュになります。
TEXT
前方互換性のために (無制限の文字数を保存する)を使用する必要があります。ハッシュ アルゴリズム (必要) は時間の経過とともに強化されるため、このデータベース フィールドは時間の経過とともにより多くの文字をサポートする必要があります。さらに、移行戦略によっては、新しいハッシュと古いハッシュを同じフィールドに格納する必要がある場合があるため、長さを 1 つのタイプのハッシュに固定することはお勧めしません。
ハッシュはビットのシーケンスです(アルゴリズムに応じて、128ビット、160ビット、256ビットなど)。MySQLで許可されている場合は、列をテキスト/文字型ではなくバイナリ型にする必要があります(SQL Serverのデータ型はbinary(n)
またはvarbinary(n)
)。また、ハッシュを塩漬けにする必要があります。ソルトはテキストでもバイナリでもかまいません。対応する列が必要になります。
それは本当にあなたが使っているハッシュアルゴリズムに依存します。私が正しく覚えていれば、パスワードの長さはハッシュの長さとはほとんど関係がありません。使用しているハッシュアルゴリズムの仕様を調べ、いくつかのテストを実行して、そのすぐ上で切り捨てます。
暗号化された文字列の最大文字列長を見つけて、それを VARCHAR 型の文字長として設定することを常にテストしてきました。保持するレコードの数によっては、データベースのサイズを大幅に改善できます。
md5 では vARCHAR(32) が適切です。AES を使用する場合は、varbinary を使用することをお勧めします。