私はhashlibのドキュメントを調べてきましたが、データをハッシュするときにsaltを使用することについて話しているものは何も見つかりませんでした。
ヘルプは素晴らしいでしょう。
私はhashlibのドキュメントを調べてきましたが、データをハッシュするときにsaltを使用することについて話しているものは何も見つかりませんでした。
ヘルプは素晴らしいでしょう。
サミールの答えは正しいですが、やや不可解です。基本的に、ソルトは、ハッシュ値に対する辞書攻撃の複雑さを劇的に増加させるために、データの前に付けたり後付けしたりするランダムに派生したデータのビットです。したがって、ソルト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$」があります ( Ulrich Drepper のページを参照してください。このページには、説明と完全な C 実装へのリンクがあります。sha512_crypt_r()
)。
独自の暗号を作成することは非常にお勧めsha512(salt+password)
できません — 上記はブルート フォース攻撃に対しては役に立ちません。
ソルトを生成するにはos.urandom(16)
、ランダムなバイトまたは''.join(map(lambda x:'./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'[ord(x)%64], os.urandom(16)))
ランダムな base64 に似た文字 (crypt() に似たもので使用するため) のようなものを使用します。
(base64 に似ていると言いますが、これは PEM/MIME の Base64 と同じではありません。)
passlib を使用してください。独自のパスワード暗号を作成することは、ほぼ確実に失敗する方法です。
最近の SHA512 は、ハッシュ化されたパスワードを保存する優れた方法ではありません。bcrypt などを使用する必要があります。重要なのは、ソルティングが組み込まれていることと、アルゴリズムに大きな作業要素があることです。
SHA512 パスワードを単純に平文に追加 (または先頭に追加) してソルト化すると、ハッシュ化された一連のパスワードを手に入れ、最新のクラッキング ツール ( http://arstechnica.com/security/2013/ 05/how-crackers-make-minced-meat-out-of-your-passwords/ ) は、連結されたパスワードと塩の値を確認でき、おそらく単純なパターン マッチングによって、パスワード部分を問題のアカウントのすべてではないにしても、ほとんどのソルト部分。
私はこれを徹底的に考えたわけではなく、決してセキュリティの専門家ではありませんが、salt をキーとしてパスワードを暗号化 (たとえば、AES256 を使用) する場合、それを SHA512 でハッシュすると、上記の脆弱性から安全になります。
ただし、その時点で、bcrypt に切り替えるよりも多くの労力を費やしており、まだ作業要素の保護が得られないため、そのようなアプローチをお勧めするのは、で働くことはそのオプションを提供しません。