Facebookのパスワードをリセットしようとしてこのエラーが発生しました:
新しいパスワードが現在のパスワードに類似しています。別のパスワードをお試しください。
Facebookはパスワードハッシュのみを保存すると想定していましたが、そうであれば、パスワードの類似性をどのように測定できますか?これは良いハッシュ関数では不可能でしょうね?
質問です-これはどのようにして可能で、どのような影響がありますか?
前もって感謝します。
[〜#〜]更新[〜#〜]
私は明確にしませんでした-古いパスワードと新しいパスワードを提供するように求められませんでした。これは「パスワードのリセット」手順でした。新しいパスワードを入力するだけなので、 推奨される複製 のほとんどの回答は当てはまりません。
UPDATE2
謎解き-参照 コメント (Facebookエンジニアより)
Facebookが現在のパスワード(および場合によっては以前のパスワード)のハッシュのみを保存することを期待し、仮定します。
彼らができることはここにあります:
ユーザーは最初のパスワードを "first"に設定し、fbはhash( "first")を格納します。
後で、ユーザーはパスワードをリセットし、新しいパスワード「First2」を提供するように求められます
Facebookは一連のパスワード(新しいパスワードと同様)を生成できます:["First2"、 "fIrst2"、 "firSt2"、... "first2"、... "first"、...]そしてハッシュを比較しますハッシュが格納されたそれぞれの。
これが私の頭に浮かぶ唯一の解決策です。他の?
彼らがそうするかどうかはわかりませんが(Facebookを使用しないでください)、ハッシュ化されたパスワードを格納しない暗号処理に Hardware Security Modules(HSM) を使用することも可能ですが、単にそれらを可逆的に暗号化します。彼らが処理しなければならない承認リクエストの量で、これは 安全(読み取り:遅い)パスワードハッシュ よりも桁違いに速く、しかも安全なパスワードストレージを提供しているので、完全に理にかなっています。
次に、HSMをプログラムして、保存されたパスワードと新しいパスワードを機能の1つの入力として比較し、その結果を返すだけです(この場合はブール値であってもかまいません)。元のパスワードはどこにもプレーンテキストで送信または保存されることはありません。内部メモリ(耐タンパー性)に加えて。これは通常、オンボードセキュアキーおよびアプリケーションストレージ/処理と呼ばれます。
ちなみに、多くの銀行はHSMを使用しています。これを適切に実装するには、デバイス自体の物理的なセキュリティとデバイスへのアクセス方法も必要です(それに加えて、かなりコストがかかります)。ただし、これにより、方法が大幅に柔軟になります。パスワードは公開されることなく安全に処理できます。
これに対する正解は1つだけです。 誰も知らない(Facebookを除く)。
FacebookはFacebookのパスワードをプレーンテキストで保存できますが、同様のパスワードのファジーハッシュまたは事前に計算されたハッシュを使用するスキームも存在する可能性があります。
Facebookに侵入してすべての資産を監査しない限り、本当に知る方法はありません。
別の可能性としては、Facebookがパスワードのハッシュと、パスワードの [〜#〜] soundex [〜#〜] のハッシュを保存している可能性があります。次に、新しいパスワードを入力すると、そのSOUNDEXのハッシュを以前に保存されたものと比較し、パスワードが非常に類似していると応答できます。
もちろん、これは純粋に推測です。
別の可能性として、fbはハッシュを行わず、マスターキーを使用してパスワードを暗号化します。いつでも暗号化を解除して、新しいものと比較することができます。
パスワードの保存方法自体についてもう少し詳しく説明します。
以前の歴史的な回答は、Facebookからの確認よりも前のものです。しかし Passwords 14で、Alec Muffettが講演を行った ここで、彼はFacebookでのパスワードの保存について詳細に明確に説明した。
彼の講演で、彼はFacebookがパスワードをプレーンテキストで保存しているではないが、さまざまな方法に対して非常に耐性があるマルチステップ方式を使用していることを確認しました攻撃:
... 次のように:
$cur = 'plaintext'
# MD5 the plaintext.
$cur = md5($cur)
# Hash SHA1 with a 160-bit salt.
$salt = randbytes(20)
$cur = hmac_sha1($cur, $salt)
# Hash SHA256 with a secret salt, using an internally abstracted crypto service.
$cur = cryptoservice::hmac($cur)
[= hmac_sha256($cur, $secret)]
# Run the result through the scrypt KDF (using undisclosed tuning parameters)
$cur = scrypt($cur, $salt)
# Use SHA256 (to reduce and normalize the large scrypt result)
$cur = hmac_sha256($cur, $salt)
マフェットは最初の効率的なパスワード解読ツールの1つである crack の作者であるため、このレベルの抵抗は驚くべきことではありません。
これで、Facebookがパスワードをプレーンテキストで保存するないことを確認できました。