web-dev-qa-db-ja.com

塩を使用してSHA512でハッシュしますか? -Python

私はこのhashlibドキュメントを調べてきましたが、salt when hashing dataを使用することについて話しているものは見つかりませんでした。

ヘルプは素晴らしいでしょう。

38
RadiantHex

サミールの答えは正しいが、やや不可解です。基本的に、ソルトは、ハッシュ値に対する辞書攻撃の複雑さを劇的に増加させるために、データにプレフィックスまたはポストフィックスするランダムに派生したビットです。したがって、salt sとdata dが与えられた場合、次のようにしてデータのソルトハッシュを生成します。

import hashlib
hashlib.sha512( s + d ).hexdigest()

詳細はこちらをご覧ください wikipedia article

72
Rakis

機密データに塩を追加するだけです:

>>> 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'
18
Jason Leveille

塩漬けは、ライブラリが支援する必要がある魔法のプロセスではありません。Rainbowテーブルの動作を停止するために提供される追加データです。

>>> 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'
8
Samir Talwar

Crypt()の代替品を探している場合、glibcの新しいバージョンには、可変反復カウントを持つSHA-512ベースの「$ 6 $」があります( lrich Drepperのページ を参照してください。 sha512_crypt_r())の完全なC実装へのリンク。

独自の暗号を作成することは非常にお勧めできません。上記のsha512(salt+password)はブルートフォース攻撃を防ぐのに役立ちません。

Saltを生成するには、ランダムなバイトにはos.urandom(16)のようなものを使用し、ランダムなbase64に似た文字(crypt()-likesで使用するには)には''.join(map(lambda x:'./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'[ord(x)%64], os.urandom(16)))のようなものを使用します。

(base64と同様、PEM/MIMEのBase64とは異なります。)

7
tc.

passlibを使用して、独自のパスワード暗号を記述することは、ほぼ確実に失敗する方法です。

3
Thomas Waldmann

SHA512は、最近ハッシュされたパスワードを保存するのに最適な方法ではありません。 bcryptまたは類似のものを使用する必要があります。重要なのは、ソルティングが組み込まれていることと、アルゴリズムに重要な作業要素があることです。

単純なテキストにソルトを追加(または追加)するだけでSHA512パスワードをソルトする場合、ハッシュされたパスワードのセットを手に入れて、最新のクラッキングツールを適用するユーザー( http://arstechnica.com/ security/2013/05/how-crackers-make-minced-meat-out-of-your-passwords / )は連結されたパスワード+塩の値を見ることができ、おそらく、単純なパターンマッチングにより、問題のアカウントのすべてではないにしても、ほとんどの場合、パスワード部分をソルト部分から分離します。

私はこれをずっと考えていませんでしたが、私は決してセキュリティの専門家ではありませんが、ソルトをキーとして使用してパスワードを暗号化する場合(たとえば、AES256を使用する場合)、その後、SHA512でハッシュthatすると、上記の脆弱性から安全になります。

ただし、その時点では、bcryptに切り替えるのにかかるよりも多くの労力を費やし、作業要素の保護はまだ得られないため、そのようなアプローチをお勧めしますで働くことはそのオプションを提供しません。

2
JakeRobb