使用盐在SHA512中哈希? - Python

时间:2010-05-24 16:58:28

标签: python salt sha hashlib saltedhash

我一直在查看hashlib文档,但在哈希数据时没有发现任何关于使用 salt 的内容。

帮助会很棒。

6 个答案:

答案 0 :(得分:70)

Samir的回答是正确的,但有点神秘。基本上,salt只是随机派生的数据位,您可以使用前缀或后缀来大大增加字典攻击对哈希值的复杂性。因此,给定一个salt s和data d,您只需执行以下操作即可生成数据的盐渍哈希:

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

有关详细信息,请参阅此wikipedia article

答案 1 :(得分:17)

只需将盐添加到敏感数据中:

>>> 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'

答案 2 :(得分:8)

Salting不是图书馆需要帮助您的神奇过程 - 它只是提供额外的数据来阻止彩虹表工作。

>>> 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'

答案 3 :(得分:7)

如果您正在寻找crypt()的替代品,那么较新版本的glibc具有基于SHA-512的“$ 6 $”,其迭代次数可变(请参阅Ulrich Drepper's page,其中包含说明和链接sha512_crypt_r())的完整C实现。

编写自己的加密是非常不可取的 - 上面的sha512(salt+password)无法帮助抵御暴力攻击。

对于生成salt,使用类似os.urandom(16)的随机字节或''.join(map(lambda x:'./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'[ord(x)%64], os.urandom(16)))用于随机base64类似的字符(用于crypt() - 相似)。

(我说base64相似它与PEM / MIME中的Base64不同。)

答案 4 :(得分:3)

使用passlib,编写自己的密码crypto是一种几乎可靠的失败方法。

答案 5 :(得分:2)

如今,SHA512不是存储散列密码的好方法。你应该使用bcrypt或类似的东西。重要的是内置盐析并且算法具有重要的工作因素。

如果您通过简单地将盐附加(或预先添加)到明文上来加密SHA512密码,那么任何掌握了一组散列密码并应用现代破解工具(http://arstechnica.com/security/2013/05/how-crackers-make-minced-meat-out-of-your-passwords/)的人都将能够要查看连接的密码+盐值,并且可能通过简单的模式匹配,能够将密码部分与盐部分分开,对于大多数(如果不是全部)帐户而言。

我没有想到这一点,我绝不是安全专家,但在我看来,如果你使用salt加密(使用,例如,使用AES256)密码密钥,然后使用SHA512哈希 ,您可以免受上述漏洞的攻击。<​​/ p>

然而,在那一点上,你付出的努力比切换到bcrypt需要更多的努力,你仍然没有工作因素的保护,所以我只建议这样的方法,如果环境你在工作中不提供这种选择。