1

我使用盐字符串“world”对密码字符串“hello”进行了编码(sha512 hash),并将该字符串保存在一个文件中。

hex: 2b83319d3e78544e4430c4f5621968fee8b6ffa1254678b2c6fb98f7f79ff16afee2da909a7bb741488ca3bacbbf6cec8fd226c5a52eef805ea65a352e2ece8e

base64: K4MxnT54VE5EMMT1Yhlo/ui2/6ElRniyxvuY9/ef8Wr+4tqQmnu3QUiMo7rLv2zsj9ImxaUu74Beplo1Li7Ojg== 

现在在我的程序中,我有上述加盐“hello”的编码值和新的密码字符串“hello”。我必须再次使用相同的盐对“hello”进行编码并比较输出。是否可以从上述输出中提取盐?

4

2 回答 2

3

您无法从哈希中检索“盐”。散列函数是一种单向函数,不能反转(仅是暴力破解)。

由于您使用的是 SHA-512 并且输出长度为 512 位(128 个十六进制编码字节),因此根本没有存储盐之类的空间。当您使用盐等附加数据创建散列时,您需要自己存储或使用生成字符串的函数,该字符串将此类附加数据编码到输出中。

如果您正在对密码或其他易于暴力破解的数据进行哈希处理,请使用此类哈希函数的多次迭代,因为仅一次迭代是不够的。对于这些用例,通常使用 PBKDF2、bcrypt 或 scrypt。

于 2015-07-23T11:37:06.457 回答
0

盐与用户密码连接时,实质上成为密码的一部分。您知道此复合密码的一部分(盐)和用户知道的部分。没有已知的方法可以从更好的哈希函数的输出中识别甚至是密码的一位或盐。对于任何外部方而言,它们应该与随机性无法区分,并且不可逆。

因此,如果您有良好的盐并且没有存储它,您将永远找不到成为密码生成复合种子的连接字符串。或者至少在没有暴力破解的情况下并非如此,这几乎需要永远完成。

于 2015-08-03T09:07:19.160 回答