【发布时间】:2012-11-29 11:28:49
【问题描述】:
在(服务器端)会话中的用户对象中存储散列密码是否不可取?不用说,在某个时候需要检索加盐和散列的密码以比较散列以验证给定用户,但是一旦进行比较,是否存在与将其保存在用户对象中相关的可量化安全风险?
鉴于 cmets 中的讨论,问题的要点是密码和哈希数据将存储在用户对象中,一旦从数据库中检索到其余用户数据,则只需一次干净的调用。在发布这个问题之前,我明白当然存在风险,但它是否足以保证实施一个框架以从用户那里清除它,或者这样做只是一种良好的做法? p>
鉴于响应,我认为最好的解决方案是拥有一个凭据对象,其中包含通过 ID 与用户关联但不直接存储在其中的密码和盐。
当用户尝试登录时,会通过电子邮件/用户名从数据库中检索用户对象(不包含密码数据)。然后读取 ID 并将其用于检索关联的凭证对象。然后可以进行密码验证。如果密码正确,用户将进入会话并销毁凭据对象。
结果是一个没有密码数据的用户对象,因此可以避免任何潜在的相关安全风险(尽管它们可能很小,如问题中所述)。另一个结果是在用户对象使用之前没有手动清除用户对象的密码数据。这是一个比要求每次都清除数据更可靠的系统,并且如果使用 EF 或类似技术,则不会在将对象的更改推送到数据库时意外擦除密码数据。
【问题讨论】:
-
如果会话被破坏并且哈希被用作某些“模拟或提升代码”中的直接比较,那么一个攻击向量可能会为另一个用户(例如管理员)注入哈希。虽然我不会说这是“不安全的”(因为它假设会话受到损害,这会引发许多其他问题),但我会说它“可能不太安全”。
-
通常您会保留一个变量来指示用户已通过身份验证。这样就完全不需要保留密码了。
-
@pst 密码?我需要恢复它,因此它将在单个 EF 调用中折叠到用户对象中。
-
我永远不会将数据库中的哈希值加载到服务器端代码中......只需计算哈希值(在代码中甚至更好地在数据库中)并始终在数据库上进行比较-侧面......这样任何攻击都可以检索到真正的哈希的唯一地方是数据库......不确定是否值得,但将攻击面缩小到数据库。
-
问题的实际重点不是“密码是否应该保留在会话中”,而是“应该建立一个框架以确保它永远不会保留在会话中”。跨度>
标签: c# asp.net asp.net-mvc security passwords