我被要求在网站的登录页面首先更改我的密码。输入新密码后,网页告诉我新密码与之前的密码相差不大。这是否意味着管理网站的公司没有以安全的方式存储密码?或者有没有办法存储散列的密码,并且仍然能够找出以前的密码与新密码仅相差 1 个字符?
密码安全
由于您刚刚输入了旧密码进行登录,因此网站可能会保留该密码进行比较 - 非常短暂 - 直到您完成下一页上的密码更改。这是一个相当安全的原则,也是 UNIXpasswd实用程序检测太相似的新密码的方式。
由于更改密码时通常需要询问用户当前的密码,因此这种相似度检测方法可以轻松应用于大多数密码更改场景。
为了完整起见,这里有一些其他不太可能的可能性:
该站点以明文形式存储您的密码。
该站点使用具有某种弱点的散列,允许对散列密码进行有意义的比较(例如,Levenshtein 距离的估计)。如果是这种情况,这是一个很大的弱点,并且比以明文形式存储密码好不了多少。
或者,可以将密码存储在可逆转换中,例如加密。这不是保护密码的好方法:它打开了通过密钥泄露来泄露密码的可能性,并且它没有提供显着的好处,因为不需要使安全密码转换可逆(这就是我们通常使用哈希的原因)。
当您输入新密码时,该网站会对您的新密码进行一系列小的转换,以查看其中是否有任何与您的旧密码哈希匹配。这可能会安全地完成。
例如,假设站点知道您的旧密码哈希,
Q. 当您输入新密码p时,该站点会计算非常接近的密码哈希值p。假设您的新密码是xyzzy,该站点可能会尝试散列ayzzy、byzzy、cyzzy等,以查看其中是否有任何与旧散列匹配Q。这似乎是一项巨大的努力,特别是如果该站点正在使用非常适合密码的散列算法(即,特别是计算速度慢的算法)。因此,即使这种情况属实,也似乎表明该站点使用了一种不适合保护密码的哈希算法。
当然,我们无法知道这些可能性中的哪一个是正确的——所有这些可能性都很容易导致您描述的行为。
这是否意味着管理网站的公司没有以安全的方式存储密码?
他们这样做的一种可能方法是将您的新密码与您在同一(或上一个)页面上提供的旧密码进行比较,以登录本网站。请注意,即使网站存储了密码的哈希值,您的纯文本密码也会在您每次登录时提交给网站。对于更改密码功能,他们可以将其临时保存在会话中以进行这些“密码相距多远”的计算。
如果他们是这样做的,我认为这没有任何问题。但是,如果他们真的通过某种方式反转密码,那么他们肯定没有以正确的方式进行操作。
或者有没有办法存储散列的密码,并且仍然能够找出以前的密码与新密码仅相差 1 个字符?
不,没有办法检索纯文本密码或从其哈希计算纯文本长度(鉴于其哈希使用良好的哈希算法并且不能被暴力破解)
散列是一个过程,其中最小的变化会产生完全不同的结果,并且是不可逆的。他们可以将您的旧密码与新密码进行比较的唯一方法是,如果他们存储您的密码而不进行哈希处理。
这并不意味着他们不安全地存储您的密码:散列只是安全密码存储的一种方法。哈希密码无论如何都不能保证安全,使用哈希表和彩虹表哈希密码可以相对容易地破解。只要它们被加密存储并且它们周围的控制是健全的,那么你的安全就可以合理地预期。
这完全取决于所讨论的公司开发他们的产品的程度,而这在这里无法回答。
很有可能,密码是加密的。根据加密实施,您的密码是安全的。所以,不,鉴于这些信息,您不能断定您的密码存储在不安全的地方。
理论上,至少,服务器只能存储散列。然后,当您使用新密码时,它们会对您的密码变体进行哈希处理,以查看它们是否符合您的原始密码哈希值。这有点牵强,但肯定是可能的。