自从Unix流行以来,存储密码的正确方法是附加一个随机值(SAT)并对其进行散列。把盐留给你以后可以得到的地方,但你希望坏人不会得到它。
这有一些好的效果。首先,坏人不能仅仅列出诸如“Password 1”这样的预期密码,将它们散列到彩虹表中,然后遍历密码文件寻找匹配的密码。如果你有一个很好的两字节盐,他们必须为每个预期密码生成65,536个值,这使得彩虹表变得不那么实用了。第二,如果您可以防止查看您的密码文件的坏人使用SALT,那么计算可能的值就会变得困难得多。第三,你让坏人无法确定一个人是否在不同的网站上使用相同的密码。
为了做到这一点,你会产生一个随机的盐。这应该以均匀的概率在期望的范围内生成每一个数字。这并不难;一个简单的线性同余随机数生成器会做得很好。
如果你有复杂的计算来制造盐,那你就错了。如果你根据密码计算它,你就错了。在这种情况下,您所做的只是使散列复杂化,而不是在功能上添加任何盐分。
没有一个擅长安全的人会依赖于隐藏一个算法。现代密码学的基础是经过广泛测试的算法,为了进行广泛的测试,它们必须是众所周知的。通常,人们发现使用标准算法比使用自己的算法更安全,并且希望它是好的。不管代码是否是开源的,坏人仍然有可能分析程序所做的事情。