使用盐在 SHA512 中进行散列? - Python

Posted

技术标签:

【中文标题】使用盐在 SHA512 中进行散列? - Python【英文标题】:Hashing in SHA512 using a salt? - Python 【发布时间】:2011-02-23 07:55:01 【问题描述】:

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

帮助会很大。

【问题讨论】:

盐会与 SHA512 分开。 【参考方案1】:

Samir 的回答是正确的,但有些神秘。基本上,盐只是随机派生的数据位,您可以在数据前加前缀或后缀,以显着增加字典攻击散列值的复杂性。因此,给定一个盐 s 和数据 d,您只需执行以下操作即可生成数据的盐渍散列:

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

查看wikipedia article了解更多详情

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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'

【讨论】:

最后一句话最准确地理解了我们为什么需要盐【参考方案4】:

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

非常不建议编写自己的加密货币 - 以上sha512(salt+password) 无助于抵御暴力攻击。

要生成盐,请使用os.urandom(16) 之类的东西来处理随机字节,或者使用''.join(map(lambda x:'./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'[ord(x)%64], os.urandom(16))) 来处理类似base64 的随机字符(与crypt() 类似的字符一起使用)。

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

如果您通过简单地将盐附加(或前置)到明文来对您的 SHA512 密码进行加盐,那么任何获得您的一组散列密码并应用现代破解工具 (http://arstechnica.com/security/2013/05/how-crackers-make-minced-meat-out-of-your-passwords/) 的人都将能够看到连接的密码+盐值,并且可能通过简单的模式匹配,能够将密码部分与盐部分分开,即使不是所有的帐户也是如此。

我一直没有考虑到这一点,而且我绝不是安全专家,但在我看来,如果您要使用盐作为密码来加密(例如,使用 AES256)密码密钥,然后使用 SHA512 对 那个 进行哈希处理,您就可以免受我上面描述的漏洞的影响。

但是,在这一点上,您付出的努力比切换到 bcrypt 所付出的更多,而且您仍然没有工作因素的保护,所以我只推荐这样的方法,如果环境你工作的地方不提供这个选项。

【讨论】:

那篇文章是关于仅使用 MD5 且未加盐的密码列表。您是否有断言的来源,“任何人只要掌握了一组散列密码并应用现代破解工具,都将能够看到串联的密码+盐值?”防止他们这样做(例如通过彩虹表)正是首先使用盐的重点,不是吗?

以上是关于使用盐在 SHA512 中进行散列? - Python的主要内容,如果未能解决你的问题,请参考以下文章

散列密码的最佳实践 - SHA256 还是 SHA512?

SHA512 在 vba 中不适用于扩展字符集

PHP 之sha256 sha512封装

PHP 之sha256 sha512封装

CryptoJS 和 Closure 中的 SHA512 不一样

开源.NetCore通用工具库Xmtool使用连载