在阅读了一些在线文章和文章之后,似乎大多数人(如果不是全部的话)建议使用某种哈希算法来保持用户的密码安全,因为您无法解决它,这很好,但那是我开始对我的情况有问题的地方。选择哈希或加密密码的困境
现在我正处于修改我们确保用户密码方式的初期阶段。我们目前使用Sha512将密码密码存储在我们的MySQL DB中。根据我目前的理解,虽然散列可能是安全的,因为它们不能相反(或者至少不那么容易),但它也是不安全的,因为有可能发生冲突,因为散列具有固定的长度,不管大小如何原始输入,这限制了可能的散列数量,从而导致可能的Pidgeon Hole问题。
现在来了另一个我有问题的部分,特别是对于我的情况。
我想添加一些功能,我们的用户的密码,如果用户不能输入一个新的密码,如果它是过于相似,他们的最后三个密码。例如:如果他们的最后一个密码是password1234
而他们的新密码是xxxpasswordxxx
,那么它会失败。但是,从我的理解来看,我不可能添加此功能,因为我无法解决他们以前的密码,以检查旧密码中是否有子字符串在其新密码中。这将我带到整个加密/解密部分。
我一直在寻找AES 128使用CBC加密模式,它似乎是一个可靠的选择,因为我真的不在乎在加密部分的并行化。除此之外,通过使用加密路线而不是散列路线,我实际上可以检查他们的最后三个密码是否与他们当前的密码相似!但是,首先可以看到用户的纯文本密码的问题是存在的。
此外,我一直在想办法为每个单独的密码使用唯一密钥,而不将它存储在我们的数据库中,因为我觉得这太不安全了。我可以对所有密码使用静态随机密钥,但我不确定这是否是一个好主意,即使我为所有密码使用了独特的IV。
因此,总结我的情况是这样的: 我希望能够防止用户输入类似于他们的旧密码的密码,除了实际上提高密码存储的安全性。根据我目前的知识,我可以继续将密码存储为散列,但我无法进行类似的密码检查,或者我可以对密码进行加密,这是令人不悦的。
我显然不是这方面的专家,而且我知道我需要做更多的研究,但我想确保自己是从正确的方向开始的。
为什么要阻止用户输入类似于旧的密码? –
@BilalBOUTAYA我们增加了一个功能,在X天后他们必须更改密码。让他们将密码从“password123”更改为“password1234”是完全没有意义的。虽然这是一个有效的变化,但它们仍然过于相似,这可能是一个弱点。 –
强迫用户首先更改密码完全毫无意义。结果是用户在显示器旁边的便笺上以简单的形式写下密码。或者导致他们使用更简单更简单的密码(不是你想要的) – luk2302