2

bcryptのメカニズムは次のとおりです。

>>> myhash = bcrypt.hashpw('testpassword', bcrypt.gensalt(12))
>>> myhash    
'$2a$12$K1hnCm5z74QtXaynv4.S8.i1FK9xjRr7JSPCRCyB9zpv8xZznZGFi'
>>> bcrypt.hashpw('testpassword', myhash)
'$2a$12$K1hnCm5z74QtXaynv4.S8.i1FK9xjRr7JSPCRCyB9zpv8xZznZGFi'

認証に使いたいです。問題は、クライアントから作成したいので、クライアントにソルト部分が必要なことです。

gensalt(username)ユーザー名からソルトを生成する独自のソルトを使用する場合、クライアントが他のユーザーとは異なる同じソルトを常に使用するのは良いことだと思いました。

それはbcryptと私のプロジェクトの良い近似ですか、それともbcryptメカニズムのセキュリティを破っていますか?

誰かがパスワードを復号化したい場合、ユーザーごとに1つ使用する必要があるため、レインボーテーブルを使用することはできないと思います。私はセキュリティの問題について十分な経験がなく、それが良いかどうかを知ることができません。たぶん、hashpwPCでブルートフォースを行うのに十分な速さです。

4

1 に答える 1

1

簡単な答えは次のとおりです。 いいえ、あなたが説明していることはまったく安全ではありません。

まず第一に、bcryptは暗号化機能ではないため、この機能の結果を「復号化」することはできません。bcryptは、blowfishを使用して構築されたメッセージダイジェスト関数です。メッセージダイジェスト関数によって生成されたハッシュがクラックされます。

クライアントがメッセージダイジェスト機能を使用して認証することは非常に問題があります。MicrosoftのNTLMは、認証にメッセージダイジェスト機能を使用しており、何度も壊れています。この認証へのアプローチには欠陥があり、避けるべきだと思います。

メッセージダイジェスト機能が使用される理由は、レイヤーのセキュリティにおける多層防御としてです。攻撃者がSQLインジェクションの脆弱性を発見できた場合は、ログインする前にリソースを使ってハッシュを破壊するように強制します。データベースからハッシュを引き出し、これを使用してログインできる場合、システムはまったく価値がありません。 クライアントがハッシュで認証する場合、リプレイ攻撃は大きな懸念事項です。ネットワークをスニッフィングしてログインシーケンスを再生できれば、このシステムはまったく価値がありません。

ランダムなソルトを生成しbcrypt.gensalt(12)ます。おそらく問題ありません。ハッシュとソルトをデータベースに保存します。安全なトランスポート層を使用して認証する必要があります。owaspa9を必ずお読みください。

于 2011-12-08T15:56:46.643 に答える