我们需要存储密码(存储的真实信息是一些非常具体的商业信息,但可以与密码进行比较以简化问题)。密码应该进行散列/加密。
我们不希望能够阅读密码,但能够知道哪些用户具有相同的。
如果crypt()
CRYPT_BLOWFISH
哈希使用相同的盐,那该怎么办?
我们如何对密码进行哈希/加密,并确保如果数据库受到攻击,攻击者将无法读取或解密这些密码?
答案 0 :(得分:1)
使用密码,您始终在寻找哈希,您不需要或不需要解密它们。因此,您所寻找的是一个强大的哈希算法,河豚或SHA512我建议。至于你的不同用户密码比较的问题,那将大大降低系统的整体安全性。
您希望在每个密码中包含随机盐,以便无法预先计算哈希值,因此即使是相同的密码也会为每个用户设置不同的哈希值,否则攻击者可能会发现哪些用户使用相同的密码并利用它的优势。对每个密码使用相同的盐都会失去其目的,并且使用none允许使用彩虹表,因此如果您想要安全地设计应用程序,则必须牺牲该特定功能。
编辑:抱歉删除了评论并将其发布为答案
我想如果你正在寻找妥协,你会看到很多散列迭代,也许是所有密码都有一个大的随机盐。这应该确保没有任何已经可用的预先计算的表用于破解密码并增加破解时间。算法链接也可能是一个选项,但如果有很多用户,您可能会遇到性能问题。基本上,如果您仍然希望能够比较用户密码,那么计算哈希值会非常耗时,这应该会大大增加破解时间。再次强调,这将是一个妥协,绝对不是解决这个问题的最有效和最安全的方法。
答案 1 :(得分:0)
您需要一个salt和bytes数组来存储敏感信息。然后,您可以安全地使用存储在其他位置的主密钥加密该对。使用2阶段加密,您可以根据需要随时滚动密钥以达到安全目的。您的应用程序需要能够组合这些部分来比较数据。
答案 2 :(得分:0)
使用密码我和许多其他网站上的SO和其他网站强烈推荐Bcrypt; Bcrypt是一种计算密集型散列算法,设计为对暴力而言速度慢且昂贵。
您可以在此处阅读有关Bcrypt的更多信息: How do you use bcrypt for hashing passwords in PHP?
至于比较值,您不能使用Bcrypt,但可以检查值是否正确。
答案 3 :(得分:0)
这完全取决于您的商家信息。您已经看到,散列将优于加密,因为它无法解密(否则您会有不同的要求)。
为什么你不能像密码那样散列信息的问题在于盐是唯一的,因此散列函数会导致无法比较的散列值。如果我们可以没有盐,我们可以使用哈希函数。
Salting已经完成,因为密码通常是短文本(人们必须记住它们)。通过检查字典或彩虹表,我们可以非常快速地找到原始密码,但是没有用于salt +密码短语的现有彩虹表。换句话说,具有一定长度的非常强的密码不需要腌制才能安全。如果您的商家信息有足够的唯一信息(熵),您可以在没有盐的情况下进行哈希并使用BCrypt或PBKDF2。