塩を使用してsha512でハッシュしますか? -Python
-
04-10-2019 - |
質問
私はHashlibのドキュメントを調べてきましたが、使用することについて何も見つけていません 塩 いつ ハッシュ データ。
ヘルプは素晴らしいでしょう。
解決
サミールの答えは正しいが、やや不可解なものです。基本的に、塩は、ハッシュ値に対する辞書攻撃の複雑さを劇的に増加させるために、データをプレフィックスまたはポストフィックスするランダムに導き出されたデータです。だから塩を与えられた s
およびデータ d
データの塩漬けハッシュを生成するために次のことを行うだけです。
import hashlib
hashlib.sha512( s + d ).hexdigest()
これを参照してください ウィキペディアの記事 詳細については
他のヒント
機密データに塩を追加するだけです。
>>> import hashlib
>>> m = hashlib.sha512()
>>> m.update('salt')
>>> m.update('sensitive data')
>>> m.hexdigest()
'70197a4d3a5cd29b62d4239007b1c5c3c0009d42d190308fd855fc459b107f40a03bd427cb6d87de18911f21ae9fdfc24dadb0163741559719669c7668d7d587'
>>> n = hashlib.sha512()
>>> n.update('%ssensitive data' % 'salt')
>>> n.hexdigest()
'70197a4d3a5cd29b62d4239007b1c5c3c0009d42d190308fd855fc459b107f40a03bd427cb6d87de18911f21ae9fdfc24dadb0163741559719669c7668d7d587'
>>> hashlib.sha512('salt' + 'sensitive data').hexdigest()
'70197a4d3a5cd29b62d4239007b1c5c3c0009d42d190308fd855fc459b107f40a03bd427cb6d87de18911f21ae9fdfc24dadb0163741559719669c7668d7d587'
塩漬けは、ライブラリがあなたを助ける必要がある魔法のプロセスではありません。レインボーテーブルが機能するのを止めるために提供される追加のデータだけです。
>>> import hashlib
>>> m = hashlib.sha512()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\xd0\xf4\xc1LH\xadH7\x90^\xa7R\x0c\xc4\xafp\x0fd3\xce\t\x85\xe6\xbb\x87\xb6\xb4a|\xb9D\xab\xf8\x14\xbdS\x96M\xdb\xf5[A\xe5\x81+:\xfe\x90\x89\x0c\nM\xb7\\\xb0Cg\xe19\xfdb\xea\xb2\xe1'
>>> m.update(b"My super-secret salt.")
>>> m.digest()
b'\xcd\xd7K\xd9!~\xa8\x1d6\x9b\xa6\xde\x06\t\x02\xa1+}\xaeNA\x94a`\xaa\xf4\xe9\xb5\xff\x1f\x9cE\x84m\xbb\x98U\xb4z\x92\x9e\xe8\xc9\xc2\xc8\x8f\x068e\xb0\r\xed\xb7\xde\x80\xa6,\n\x111w{\xa2\x9b'
Crypt()の代替品を探している場合、GLIBCの新しいバージョンには、可変イテレーションカウントがあるSHA-512ベースの「$ 6 $」があります(参照 ウルリッヒ・ドレッパーのページ, 、説明があり、完全なC実装へのリンクがあります sha512_crypt_r()
).
独自の暗号を書くことは非常に慣れ親したできません - 上記 sha512(salt+password)
ブルートフォース攻撃には役立ちません。
塩を生成するには、ようなものを使用してください os.urandom(16)
ランダムバイト用または ''.join(map(lambda x:'./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'[ord(x)%64], os.urandom(16)))
ランダムBase64-Alike Charsの場合(Crypt()-Alikesで使用)。
(私はbase64-alikeと言います。それはPEM/MIMEのbase64と同じではありません。)
Passlibを使用して、独自のパスワードCryptoを書くことは、ほとんど確実な障害です。
SHA512は、最近ハッシュドパスワードを保存する素晴らしい方法ではありません。 bcryptなどを使用する必要があります。重要なのは、塩漬けが組み込まれており、アルゴリズムには重要な作業要因があることです。
Sha512のパスワードを単にプレーンテキストに追加(または準備する)だけで塩を塩漬けすると、ハッシュされたパスワードのセットを手に入れて最新のひび割れツールを適用する人は誰でもhttp://arstechnica.com/security/2013/05/how-crackers-make-minced-meat out-of-your-passwords/)連結されたパスワード+塩値を見ることができ、おそらく、些細なパターンの一致により、問題のすべてではないにしても、ほとんどの場合、ほとんどの場合、パスワード部分を塩部分から分離することができます。
私はこれをずっと考えていませんでしたし、私は決してセキュリティの専門家ではありませんが、あなたがキーとして塩を使用してパスワードを暗号化する(たとえばAES256を使用)した場合、そして私には私には私には思えます。それからハッシュ それ SHA512を使用すると、上記で説明した脆弱性から安全です。
しかし、その時点で、BCRYPTに切り替えるのにかかったよりも多くの努力をしていますが、それでも作業要因の保護はありません。作業はそのオプションを提供しません。