在Python中使用盐生成SHA512哈希?

45

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

需要帮助。


2
一个salt会与SHA512分开。 - WhirlWind
7个回答

84

萨米尔的答案是正确的,但有些难懂。基本上,盐是一段随机生成的数据,您将其添加到要哈希的数据的前缀或后缀中,从而大大增加字典攻击哈希值的复杂性。因此,假设有一个盐 s 和数据 d,您只需执行以下操作即可生成数据的加盐哈希:

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

请参阅此维基百科文章了解更多详情。


19

将盐加入您的敏感数据中:

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

12

盐值并不是需要图书馆帮助您完成的神奇过程,它只是提供的额外数据,用于防止彩虹表攻击。

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

最后一句话是理解为什么我们需要盐的最准确的表述。 - CalfCrusher

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不同。)

3
使用Passlib,编写自己的密码加密几乎肯定会失败。

2
SHA512不是现在存储哈希密码的好方法。你应该使用bcrypt或类似的东西。重要的是盐已经内置,并且算法具有显著的工作因素。
如果你通过简单地将盐附加(或前置)到明文中来盐化你的SHA512密码,那么任何得到一组你的哈希密码并应用现代破解工具(如http://arstechnica.com/security/2013/05/how-crackers-make-minced-meat-out-of-your-passwords/)的人都能够看到连接的密码+盐值,并且可能会通过简单的模式匹配将大部分甚至所有相关账户的密码部分与盐部分分离出来。
我没有完全考虑清楚这个问题,而且我绝不是安全专家,但我认为,如果你使用盐作为密钥对密码进行加密(例如使用AES256),然后使用SHA512对其进行哈希,你就可以避免上述漏洞。
然而,此时你所花费的工作量已经超过了切换到bcrypt所需的工作量,而且你仍然没有工作因素的保护,因此我只会建议在你工作的环境中没有提供该选项的情况下采取这样的方法。

那篇文章是关于一个只使用MD5且没有加盐的密码列表。你有关于这个断言的来源吗,“任何人只要拿到你的哈希密码集并应用现代破解工具,就能看到连接的密码+盐值?”使用盐的目的不正是为了防止他们这样做(例如通过彩虹表)吗? - reirab

0

如果我的密码是"pass",我的盐值是"word",那么我的 pass+salt 就是 "password",和直接使用密码一样 xD

或者我们使用非常安全的加密方式,将安全的盐值转换为哈希输出 lol。 我们只需剥离盐值并使用随机密码生成哈希,当我们得到相同的哈希时,我们就得到了密码 lol lol


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接