Encryption 选择散列还是加密密码的两难选择

Encryption 选择散列还是加密密码的两难选择,encryption,hash,passwords,Encryption,Hash,Passwords,在网上阅读了一些帖子和文章后,似乎大多数人(如果不是全部的话)都建议使用某种哈希算法来保护用户密码的安全,因为你无法将其解压,这很好,但这就是我开始对自己的处境产生问题的地方 现在,我正处于修改保护用户密码方式的早期阶段。目前,我们使用Sha512将哈希密码存储在MySQL数据库中。根据我目前的理解,虽然散列在某种意义上可能是安全的,因为它们不能反转(或者至少不是那么容易),但它也不安全,因为存在可能的冲突,因为散列具有固定的长度,无论原始输入的大小如何,这限制了可能的散列的数量,导致可能的皮江

在网上阅读了一些帖子和文章后,似乎大多数人(如果不是全部的话)都建议使用某种哈希算法来保护用户密码的安全,因为你无法将其解压,这很好,但这就是我开始对自己的处境产生问题的地方

现在,我正处于修改保护用户密码方式的早期阶段。目前,我们使用Sha512将哈希密码存储在MySQL数据库中。根据我目前的理解,虽然散列在某种意义上可能是安全的,因为它们不能反转(或者至少不是那么容易),但它也不安全,因为存在可能的冲突,因为散列具有固定的长度,无论原始输入的大小如何,这限制了可能的散列的数量,导致可能的皮江洞问题

现在是我有问题的另一部分,尤其是我的情况

我正在尝试为用户的密码添加一些功能,如果用户的密码与前三个密码太相似,则无法输入新密码。例如:如果他们的上一个密码是
password1234
,而他们的新密码是
xxxpasswordxxx
,那么它将失败。但是,据我所知,我不可能添加此功能,因为我无法取消对其以前密码的清除,以检查其旧密码中的任何子字符串是否在其新密码中。这就引出了整个加密/解密部分

我一直在研究使用CBC加密模式的AES 128,这似乎是一个可靠的选择,因为我并不太关心加密部分的并行化。此外,通过使用加密路由而不是散列路由,我实际上可以检查他们的最后三个密码是否与当前密码相似!但是,首先要解决的问题是能够看到用户的纯文本密码

此外,我一直在尝试为每个密码使用唯一的密钥,而不将其存储在数据库中,因为我觉得这太不安全了。我可以对所有密码使用静态随机密钥,但我不确定这是否是一个好主意,即使我对所有密码使用唯一的IVs

因此,总结我的情况如下: 除了提高密码存储的安全性之外,我还希望能够防止用户输入与旧密码类似的密码。据我目前所知,我可以继续将密码存储为散列,但我无法进行类似的密码检查,或者我可以对密码进行加密,这是不可取的


我显然不是这方面的专家,我知道事实上我需要做更多的研究,但我想确保我开始的方向是正确的。

要以保密的方式保存密码,你必须将密码加上一个盐

对于每个用户,您随机选择一个salt,并将每个用户的salt保存在数据库中。 存储在数据库哈希中(密码+salt)

当您必须检查用户密码时,只需添加salt,对两者进行散列,然后对照数据库进行检查。 如果用户更改密码,您也可以更改密码


之后,您可以根据安全级别选择一种或另一种算法,SHA2似乎是一个良好的开端。

关于第二段:哈希冲突绝对不是问题。对于哪种攻击场景,您认为这是一个问题?你真的应该停止到处乱说流行语,尤其是关于安全的

您的功能想法会失败,这在一定程度上是正确的。这是一个好主意,因为这个主意不好。你为什么想要这个“功能”——它只会激怒用户,并导致人们试图在月末使用数字来绕过你的限制,包括月底或其他版本之间的递增数字

而且加密密码是坏周期。
一旦你可以解密它们,攻击也可以——故事的结尾



您描述的情景的个人体验:客户机有一个工具,您每2个月被迫更改一次密码,我目前在
“password”10
。我所做的正是每个人在每X个月强制更改一次密码时所警告的——简单地一件一件地更改相同的密码。我有一个非常好的密码(15个以上的字符,大小写,数字,特殊字符)加上一个系统,可以为我要设置帐户的任何站点选择密码。强迫我更改密码会破坏我的“系统”,因为现在我无法在脑海中一遍又一遍地生成密码,因为结果与网站在头两个月后强迫我设置的结果不符。如果网站开始引入一些密码相似性限制,我可能会开始写下来。

为什么不继续使用哈希,但要求用户在更改新密码时输入他或她的旧密码,这样你就可以验证旧密码以授权密码更改,然后在继续更改之前比较两种密码的纯文本版本的相似性?

如果保留哈希密码,则无法检查类似密码,但可以防止它们重复使用以前使用的密码。通过保留旧密码(希望是咸的!),您可以将hash(new_password+old_salt[i])与旧密码的咸的_hash[i]进行比较。如果它们相同,则用户正在重复使用旧密码

我完全同意其他人的观点,散列冲突不是问题。您计划使用SHA512,即攻击者必须与之竞争的512位随机性。唯一可以打破这一点的方法是使用salted散列(即,即使密码相同,也使用salted散列)来保护自己免受攻击
old password != new password
lowercase'd letters in old password != lowercase'd letters in new password
adding up all numbers in new password > adding up all numbers in old password + 2 || adding up all numbers in new password < adding up all numbers in old password - 2