【发布时间】:2010-04-06 18:04:35
【问题描述】:
如果攻击者拥有多个不同的项目(例如:电子邮件地址)并且知道每个项目的加密值,那么攻击者能否更轻松地确定用于加密这些项目的秘密密码?意思是,他们可以在不诉诸暴力的情况下确定密码吗?
这个问题可能听起来很奇怪,所以让我提供一个用例:
- 用户使用其电子邮件地址注册网站
- 服务器向该电子邮件地址发送一个确认 URL(例如:https://my.app.com/confirmEmailAddress/bill%40yahoo.com)
- 攻击者可以猜测确认 URL,因此可以使用其他人的电子邮件地址进行注册,并“确认”它,而无需登录该人的电子邮件帐户并查看确认 URL。这是个问题。
- 我们不会在 URL 中发送纯文本的电子邮件地址,而是使用密码短语加密发送。
- (我知道攻击者仍然可以拦截服务器发送的电子邮件,因为电子邮件是纯文本的,但请耐心等待。)
- 如果攻击者随后使用多个免费电子邮件帐户注册并看到多个 URL,每个 URL 都有相应的加密电子邮件地址,那么攻击者是否可以更轻松地确定用于加密的密码?
替代解决方案
我可以改为发送他们电子邮件地址的随机数或单向哈希(加上随机盐)。这消除了存储秘密密码,但这意味着我需要将该随机数/哈希存储在数据库中。上面的原始方法不需要存储在数据库中。
我倾向于使用单向哈希存储在数据库中,但我仍然想知道答案:拥有多个未加密的电子邮件地址及其加密的对应地址是否更容易确定使用的密码?
【问题讨论】:
-
为什么不通过应用像 OpenId 这样的联合身份解决方案来解决您的整个问题?
-
您的替代解决方案不需要额外的表,只需在现有表中增加一个已存储电子邮件地址的列
-
@Gareth 你是对的,我已经更新了这个问题。谢谢!