我发现Rails的设计认证框架没有散列数据库中的reset_password_token和confirmation_token?有谁知道为什么?
显然,在数据库中以纯文本格式存储这样的值是一种不好的方法,因为每个有权访问数据库的人都可以重用令牌并将它们直接发送到API(例如,可以轻松触发密码重置,无法访问电子邮件)。此外,这只是将哈希存储在数据库中的最小努力。这就是为什么我想知道这种普通代币方法背后的想法是什么?
更新:没有人对此有任何意见吗?从我的观点来看,这是一个安全问题,但看起来我是唯一一个关注它的人:D
答案 0 :(得分:0)
在数据库中没有任何一点哈希值。确认/重置电子邮件仍然必须向用户发送一个令牌,应用程序可以使用该令牌来识别您正在存储的哈希键的它们(邀请/密码重置令牌)。如果这是以纯文本或双向加密方式存储的话,那么你就会遇到完全相同的问题,因为黑客只能使用明文标记,你的应用程序会愉快地对其进行哈希并对其进行身份验证。如果将其存储为单向加密,那么您的应用将无法提取应发送给用户的实际令牌。
有人必须知道密码/令牌的实际未散列版本。在密码中,实际密码存储在用户的头脑中。在这种情况下,然后需要将实际令牌存储在数据库中。