ハッシュされたパスワード(BCryptを使用)をデータベースに保存したい。これに適したタイプは何ですか?正しい長さはどれですか?パスワードは常にBCryptでハッシュされ、同じ長さですか?
編集
ハッシュの例:
$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu
一部のパスワードをハッシュした後、BCryptは常に60文字のハッシュを生成するようです。
編集2
ハッシュされたパスワード(BCryptを使用)をデータベースに保存したい。これに適したタイプは何ですか?正しい長さはどれですか?パスワードは常にBCryptでハッシュされ、同じ長さですか?
編集
ハッシュの例:
$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu
一部のパスワードをハッシュした後、BCryptは常に60文字のハッシュを生成するようです。
編集2
回答:
bcryptのモジュラー暗号形式は、
$2$
、$2a$
またはハッシュアルゴリズムと形式の$2y$
識別$
.
、/
、0
- 9
、A
- Z
、a
- z
とは異なる符号化標準ベース64:からなるアルファベット)
したがって、全長はそれぞれ59バイトまたは60バイトです。
2a形式を使用するため、60バイトが必要になります。したがって、MySQLのために私が使用することをお勧めしますCHAR(60) BINARY
かBINARY(60)
(参照_binおよびバイナリ照合順序の違いについては、を)。
CHAR
バイナリセーフではなく、等価性はバイト値だけに依存するのではなく、実際の照合に依存します。最悪の場合A
はと同等に扱われa
ます。詳細については_bin
、およびbinary
照合順序を参照してください。
SQL_Latin1_General_CP1_CS_AS
MySQL では@AndreFigueiredo は不明です。知られているのはlatin1_general_cs
です。
2
、2a
と、2y
ハッシュアルゴリズムや形式の平均。私はいくつかの検索で簡単な答えを見つけることができませんでした。
BcryptハッシュはBINARY(40)
列に格納できます。
BINARY(60)
は、他の回答が示唆するように、最も簡単で自然な選択ですが、ストレージ効率を最大化したい場合は、ハッシュを無損失で分解することで20バイトを節約できます。GitHub:https : //github.com/ademarre/binary-mcfでこれをより完全に文書化しました
Bcryptハッシュは、モジュラー暗号形式(MCF)と呼ばれる構造に従います。バイナリ MCF(BMCF)は、これらのテキストハッシュ表現をよりコンパクトなバイナリ構造にデコードします。Bcryptの場合、結果のバイナリハッシュは40バイトです。
Gumboは、Bcrypt MCFハッシュの4つのコンポーネントを説明するのに優れています。
$<id>$<cost>$<salt><digest>
BMCFへのデコードは次のようになります。
$<id>$
3ビットで表すことができます。<cost>$
、04-31、5ビットで表すことができます。これらを1バイトにまとめます。1 + 16 + 23
上記のリンクで詳細を読んだり、GitHubで私のPHP実装を調べたりできます。
PHP password_hash()
とPASSWORD_DEFAULT
アルゴリズムを使用してbcryptハッシュを生成している場合(これはこの質問を読んでいる人の大部分がそうだと思います)、将来password_hash()
、別のアルゴリズムをデフォルトとして使用する可能性があるため、これが原因となる可能性があることに注意してください。ハッシュの長さに影響します(ただし、必ずしも長くなるとは限りません)。
マニュアルページから:
この定数は、新しい強力なアルゴリズムがPHPに追加されると、時間とともに変化するように設計されています。そのため、この識別子を使用した結果の長さは、時間とともに変化する可能性があります。したがって、 60文字を超えて拡張できるデータベース列に結果を格納することをお勧めします(255文字が適切な選択です)。
bcryptを使用すると、10億人のユーザー(つまり、現在Facebookと競合している)が255バイトのパスワードハッシュを保存する場合でも、データは約255 GBにすぎません。パスワードハッシュの保存がアプリケーションのボトルネックになることはほとんどありません。しかし、ストレージスペースが本当にいることをオフのチャンスであるいくつかの理由で問題は、使用することができますPASSWORD_BCRYPT
力にpassword_hash()
それはデフォルトではありません場合でも、使用bcryptのに。新しいPHPバージョンがリリースされるたびに、bcryptの脆弱性について常に最新情報を入手し、リリースノートを確認してください。デフォルトのアルゴリズムが変更された場合は、その理由を確認し、新しいアルゴリズムを使用するかどうかを情報に基づいて決定することをお勧めします。
たとえばMD5ハッシュでできるように、これを保存できる巧妙なトリックはないと思います。
CHAR(60)
常に60文字であるので、それをとして保管することをお勧めします。