我要求的是纯粹的抽象级别(不需要代码)。
某些数据代表用户存储在Web服务器/数据库中。使用用户密码作为密钥加密数据,确保如果服务器或数据库受到攻击,对攻击者来说相对无用。
问题是重置用户密码的标准过程(发送带有令牌的链接)将不起作用,因为在不知道以前的密码的情况下无法解密和重新加密数据。
还有其他方法吗?
答案 0 :(得分:3)
当您说您愿意使用某种自动身份验证重置密码时,您真正说的是有两个密码:“普通”密码和“身份验证”密码。您的问题的解决方案是使用随机密钥加密文件,然后使用每个密码加密密钥。
作为一个具体的例子:
为了让它真正完整,让我们假设您的身份验证方案与许多人一样非常宽容。你会接受“花栗鼠”(或“CHIPMUNKS”或甚至“花栗鼠”)而不是“花栗鼠”。但不管它是什么,你的计划必须是确定性的。您接受的每个可能答案都必须解析为相同的哈希值。在这种情况下,我将假设你小写安全答案,删除文章,并减少到单数,如果它是复数。然后你先加上问题类。所以你的二级密码就像“吉祥物:花栗鼠”。
您现在组成一个随机的16字节并使用该密钥加密数据。然后,您可以使用常规的基于密码的加密技术(例如PBKDF2)来加密上述每个密码的密钥。然后你扔掉钥匙和密码。
当您需要进行重置时,使用提供的密码(“mascot:chipmunk”)解密真实密钥,并使用新密码重新加密密钥(再次使用“mascot:chipmunk”)。
一个可用性问题是密码重置会使所有其他安全答案无效,并且用户必须重新配置它们。如果这是一个问题,您可以将所有安全性答案放入一个包中,并使用与数据相同的技术对其进行加密。 (即安全答案针对所有安全答案进行加密。)
这种方法当然会创建两个(或更多)可以解锁数据的密码,从而大大减少了暴力搜索时间。在扩展事物时你应该考虑到这一点。也就是说,您的安全范围通常应该是几个数量级,因此即使是少数密码也应该适用于许多情况。还要记住,安全问题存在于一个很小的关键空间,特别是像“吉祥物”或“汽车制造”这样的东西,可能只有几十个可能的价值(除非你去了我的高中,那里有一个真正奇异的吉祥物...)这只意味着积极调整PBKDF2更为重要。
当然,任何类型的密码重置系统的存在都会使目标攻击变得更加容易。但无论您如何实施加密,都是如此。
但如果甚至没有安全问题呢?如果您仅根据电子邮件地址重置密码该怎么办?那么,电子邮件地址是密码。面对被盗的数据库,这是有问题的,而且很难修复,因为没有真正的秘密(加密需要秘密)。但并非完全丢失。您可以做的一件事是永远不要在数据库中包含实际的电子邮件地址。将电子邮件地址视为密码(因为在这种情况下)。存储哈希。你不能在它上面使用随机盐,但你仍然可以在整个数据库中使用一些盐。
所以我的电子邮件是test@example.com。您将其视为密码,将其与“mygreatservice”混合并通过PBKDF2运行。要登录,只需将其视为密码。
但是,攻击者必须一次猜出一个电子邮件地址。这并不难,但他不能一次解密整个数据库,他永远不会从他猜不到的电子邮件中获取数据。 (而你做了选择一个非常简单的重置机制。)
答案 1 :(得分:0)
为什么需要取消加密密码?如果他们忘记了那么你将必须根据他们有权访问发送重置令牌的电子邮件帐户的事实来验证它们。理想情况下,您将在重置页面上包含一些其他形式的问题/身份证明,如秘密问题。
此外,您最好不要使用可逆加密来存储密码,而是使用强大的盐渍哈希,这是一种方式。