如何从 sha512 摘要中提取盐?

How to extract salt from sha512 digest?

我使用 salt 字符串 "world" 对密码字符串 "hello" 进行了编码(sha512 哈希),并将该字符串保存在文件中。

hex: 2b83319d3e78544e4430c4f5621968fee8b6ffa1254678b2c6fb98f7f79ff16afee2da909a7bb741488ca3bacbbf6cec8fd226c5a52eef805ea65a352e2ece8e

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

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

您无法从哈希中检索 "salt"。哈希函数是一种单向函数,无法逆转(只能暴力破解)。

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

如果您要散列密码或其他容易暴力破解的数据,请使用此类散列函数的多次迭代,因为仅一次迭代是不够的。对于这些用例,通常使用 PBKDF2、bcrypt 或 scrypt。

盐与用户密码连接时,实际上成为密码的一部分。这个复合密码有你知道的部分(盐)和用户知道的部分。没有已知的方法可以从更好的哈希函数的输出中识别出哪怕是一点密码或盐。对于任何外部方来说,它们应该与随机性无法区分并且不可逆。

所以如果你有很好的盐但没有存储它,你将永远找不到成为密码生成复合种子的连接字符串。或者至少不是没有暴力强迫它,这将花费几乎永远的时间。