2016-09-03 26 views
0

generate_password_hash()機能を使用すると、ランダムな塩を含む暗号化されたパスワード文字列が取得されます。generate_password_hash()を使用してすべての暗号化パスワードをデータベースに保存する必要があります

>>> from werkzeug.security import generate_password_hash, check_password_hash 
>>> generate_password_hash('password') 
>>> 'pbkdf2:sha1:1000$3j8Brovx$9acddcd67da9e4c913817231c882a0f757e2d095' 

私は他の誰かが私のデータベースにハッキングし、この文字列を取得し、データベースにこの文字列を格納した場合、それは暗号化されたパスワード塩を含有becasue割れブルートフォースを使用して元のパスワードを取得するのは簡単です。

check_password_hash('pbkdf2:sha1:1000$9HycZ0Qa$94f08a91fba1c040c5bffb6c7e1ab5a6ad4818de', 'password') 

私はgenerate_password_hash()を使用する前に、まず自分の塩を使用して元のパスワードを暗号化すべきか、よりよい解決策はありますか?

ありがとうございました。

+0

[ここ](https://crackstation.net/hashing-security.htm)は答えです。 – citaret

+0

[パスワードで保存されたハッシュの安全性が向上する理由](http://security.stackexchange.com/q/51959) –

+0

[pepper](http://crypto.stackexchange.com/a/2010) )。 – citaret

答えて

2

暗号化されたパスワードに塩が含まれているため、ブルートフォースクラッキングを使用して元のパスワードを取得するのは簡単です。あなたは1000

の低い繰り返し回数を抱えているので、いいえ、それは、ブルートフォースを「簡単」だ

私はgenerate_password_hash()を使用する前に、まず自分の塩を使用して元のパスワードを暗号化するかであるべきより良い解決策がありますか?

いいえ、暗号化は元に戻すことができます。また、データベースが失われていると、暗号化キーが失われている可能性もあるため、追加の暗号化は役に立たなくなります。

簡単な修正は、認証手続きが遅いためにユーザーが逃げないサーバー上で何ができるのかに応じて、100万または1,000万回の反復回数を増やすことです。

generate_password_hash('password', method='pbkdf2:sha256:1000000') 

PBKDF2の問題は、あまりメモリを必要としないため、簡単に並列化できることです。多くのメモリを必要とするように設定できるscryptやArgon2などの選択肢があります。現在、メモリはASICに基づく専用パスワードブルートフォースマシンの主な制限です。

最終的に何もしないと、ユーザーがパスワードとして「password1」を使用している場合、安全な認証システムにつながります。大文字、小文字、数字(オプションで特殊文字を含む)など、12文字以上の複雑なパスワードを使用するようにユーザーに指示する必要があります。それらは辞書の一部でもないはずです。

もっと見る:あなたがパスワードハッシュを保存するときHow to securely hash passwords?

+1

「(オプションで特殊文字を含む)」と言ってよかったです。 IMHO、パスワードの特殊文字は迷惑で、単純な辞書の単語を避けるようにユーザーを強制することを除けば、実際に多くのセキュリティを追加するものではありません。 '52 ** 13/62 ** 12'〜= 6.3 –

+1

のような文字プールのサイズを増やすよりもパスワードの長さを増やすほうが、ユーザーの選択肢が貧弱なパスワードを使用することを選択した場合。多くのサイトではパスワードが必要ですが、私は他の誰かが自分のアカウントにアクセスするのを気にせず、簡単なパスワードを使いたいだけです。それはユーザーの選択でなければなりません。 NISTには、パスワード提案の慣行に関する草案があります。NIST SP 800-63-3ドラフト文書「デジタル認証ガイドライン」 – zaph

+1

Do:1.切り捨てなしまたは6桁の数字で8文字分、>最大64文字を要求する。2.ディクショナリを使用して、10M侵入したパスワードの辞書リストに対して一般的なパスワードを禁止する。3.すべての印刷文字(Unicodeはオプション)+スペース(1 "文字" /コードポイント)を含むUnicodeを受け入れることをお勧めします。アカウントごとに30日間の認証試行を100回に制限します。6.Offerオプションを使用して、入力中にシークレットを表示するドットまたはアスタリスク – zaph

2

、主な仮定は、ブルートフォースを使用してパスワードを取得するには余りにも困難であることです。より安全にしたい場合は、より遅いハッシュアルゴリズムとより長いパスワードを使用してください。

暗号化はハッシュよりも悪いです。なぜなら、ハッシュは元に戻せず、ブルートフォースだけがパスワードを取得するためです。暗号化では、ブルートフォースは単なる選択肢の1つです。

これが明らかになったら、コードまたは塩に「秘密」の塩を保存するオプションがあります。 パスワードで塩を保存する方が安全です!なぜですか?あなたはパスワードごとに異なる塩を持っているので、侵入者は各パスワードを別々に強制しなければなりません。1つのグローバルソルト値を持つ場合、データベースを一度にすべてのパスワードに対して無差別に実行することができます。

関連する問題