2016-09-23 90 views
0

我需要了解一下,如果我们没有在数据库中存储实际密码,那是因为安全原因。我们通常存储单向加密密码。现在,如果这是真的,我们不想改变密码,一些知名的网站如何发现新密码非常接近或部分匹配旧密码,并且他们提示我们改变它。要发生这种情况,他们将不得不将旧密码存储在某个地方,或者需要双向加密的密码才能再次解密。重置新密码与旧密码匹配

+1

这里真正的问题是糟糕的密码规则。通过让用户定期更改密码,您可以确保用户的密码较差,并且更可能将其写在“正面”笔记上。新的NIST提出的规则(800-63-3:数字认证指南)将此称为不应该做的练习。不要:1.需要组合规则2.允许提示3.需要例行密码过期。请参阅[新密码规则](https://nakedsecurity.sophos.com/2016/08/18/nists-new-password-rules-what-you-need-to-know/)。 OTOH您的组织可能对使用失败的做法更感兴趣。 – zaph

回答

1

有两种可能性:

  1. 通常,当您更改密码,您首先需要输入旧密码,以确认你是你。该网站可能会暂时将旧密码保存在内存中,以便它可以将旧密码与新密码进行比较。
  2. 当您输入新密码时,它可以检查简单修改数量的哈希值是否映射到旧密码的哈希值。

例如,如果您在您的新密码为“password7”型,那么该网站可能会做一些检查,如下列:

password_hash("password0", old_salt) == value stored in database? 
password_hash("password1", old_salt) == value stored in database? 
password_hash("password2", old_salt) == value stored in database? 
password_hash("password3", old_salt) == value stored in database? 
password_hash("password4", old_salt) == value stored in database? 
password_hash("password5", old_salt) == value stored in database? 
password_hash("password6", old_salt) == value stored in database? 
password_hash("password7", old_salt) == value stored in database? 
password_hash("password8", old_salt) == value stored in database? 
password_hash("password9", old_salt) == value stored in database? 

这将是非常,非常缓慢如果他们使用了正确的密码哈希算法(如bcrypt或scrypt),但如果在某些实现中实际完成这项操作,我不会感到惊讶。

当然,也有第三种可能性,愚蠢的网站从未散列您的密码在第一位!

+0

感谢您的合理回答。但是这似乎是一种高度概率的方法。如何确定新密码的字谜。也是最接近的anagram,例如,password6的hash可能与password7的hash或7password的hash非常不同。如果是这样,我会再次认为这个问题仍然是开放的。 – siddhusingh