Encryption 密码学中的Salt

Encryption 密码学中的Salt,encryption,salt,Encryption,Salt,我在读散列和密码学中的盐,我在StackOverflow中关于盐的其他答案中看到: salting是将数据添加到密码(或我们想要加密的任何东西)中,以使那些想用bruteforce和rainbow表破解密码的人更难 例如,我的密码是password,我的salt是salt,因此程序将其转换为PASSWORDSALT,然后对其进行散列 但是当我使用scrypt和blake时,它就不起作用了(我还没有用salt尝试过其他加密类型) Python代码: >>> blake2b(b'P

我在读散列和密码学中的盐,我在StackOverflow中关于盐的其他答案中看到:

salting是将数据添加到密码(或我们想要加密的任何东西)中,以使那些想用bruteforce和rainbow表破解密码的人更难

例如,我的密码是password,我的salt是salt,因此程序将其转换为
PASSWORDSALT
,然后对其进行散列

但是当我使用
scrypt
blake
时,它就不起作用了(我还没有用salt尝试过其他加密类型)

Python代码:

>>> blake2b(b'PASSWORD', salt=b'SALT').hexdigest()
52d9cb2e8690fcc5d34ef948e09c51aae66ff1d8e099bb72e2db333d6aa90b12c1745872b72004d6a64210cbb9be11307817f156863073d85cad0f2d643a4416
>>> blake2b(b'PASSWORDSALT').hexdigest()
aa2fd2094ec83915eef264d4f24870f3d2ebb676449bc824161cf53aa62142dd64e5a80214a0638195eb1d3c2474727711c4e2149d10afc5767c0c25f5625a54

那么为什么它们不相等呢?

密码和salt只是密码散列函数的输入。密码散列函数允许有多个输入。这与安全散列(如SHA-256)不同,安全散列只需要一个输入:消息


如果您查看,您将在第2.8节中看到salt被放入一个参数块中,并且它没有被用作每个迭代的单独输入。

blake2b
用零填充salt到一个恒定的长度(我认为是16字节)。我没有可用的
blake2b
实例,所以我不知道这是否足以解决这个谜。不改变的盐是无用的。理想情况下,salt应该是不可预测的,但至少每个密码都应该不同。@PresidentJamesK.Polk嗨,詹姆斯,为什么理想情况下会是不可预测的?为了更好地保护彩虹桌?一般来说,你会使用一个大的随机盐(~128位),这样你就至少不必跟踪计数器了。@MaartenBodewes:128位随机盐是完美的。我在想一个特别的场景,它太牵强了,不值得考虑。Rainbow表通常仅用于恢复多个密码,因为构建它们的工作比强制从同一空间提取单个密码要昂贵。但是,如果攻击者心中有一个非常高价值的目标,他可能愿意在攻击者使用预测的salt之前构建表,以便在最终创建帐户时,他们可以更快地恢复密码。就像我说的那样牵强。@PresidentJamesK.Polk好吧,除非使用某种应用程序标识符,否则有可能创建一个彩虹表来攻击具有相同表集的多个组织,所以这并不牵强。可能只攻击前10个,其中一个可能是针对具有提升权限的帐户。因此,最终仅仅使用128个随机位可能是最好的。最好是阅读规范,而不是猜测密码散列中的实际机制。这些论文通常可读性很强。