使用盐对 SHA512 进行哈希处理? - 蟒蛇

问题描述 投票:0回答:7

我一直在浏览 hashlib 文档,但没有找到任何关于在 hashing 数据时使用 salt 的内容。

帮助会很棒。

python salt sha hashlib saltedhash
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'

7
投票

如果您正在寻找 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-alike 它与 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 哈希 that,您就可以免受我上面描述的漏洞的影响。

但是,此时您已经付出了比切换到 bcrypt 更多的努力,并且您仍然无法获得工作因素的保护,因此,如果您的环境如此,我只会推荐类似的方法重新工作不提供该选项。


-1
投票

是的,如果我的密码是“pass”并且我的盐是“word” 我的通行证+盐是“密码”,与仅使用密码相同xD

或者我们使用非常安全的密码,安全的盐来哈希输出哈哈。 我们只是去除盐并用随机密码生成哈希,当我们得到相同的哈希时,我们得到了密码哈哈哈哈

© www.soinside.com 2019 - 2024. All rights reserved.