【问题标题】:Storing password in session在会话中存储密码
【发布时间】:2012-01-22 08:30:45
【问题描述】:

我正在考虑将用户输入的密码存储在会话状态中。我需要注意哪些安全风险或问题?

【问题讨论】:

标签: asp.net-mvc-3 session-state


【解决方案1】:

是的。这只是一个非常糟糕的主意。您甚至不应该将密码存储在数据库中 - 最佳做法是存储密码的哈希值。因此,您可以验证密码,但如果有人可以访问数据库(或您的情况下的会话状态),他们实际上并没有用户的密码。

【讨论】:

  • 但是会话状态不一定在数据库中,这样会更安全。如果会话状态不持久,是否可以将密码存储在会话状态中?
  • 密码永远不应该存储在任何地方。 salt+hash 密码一旦进入服务器,然后仅对该结果进行操作。您无需对用户的原始密码进行操作。
  • 我曾经同意这一点,但我开始意识到这是一个理想主义的世界,我不知道我们生活在那个世界里。当 Web 服务器必须与不支持基于令牌的身份验证的第三方组件进行交互时,密码是唯一的途径。我用于电子账单的网站要求我输入密码,以便它可以从第三方获取账单。我怀疑它存储的东西可能允许其他人在获得这些数据的情况下登录这些第三方。我只是认为网站无法提供您所追求的理想界面。
  • @BlueMonkMN 你说得对,有些网站与 3rd 方服务交互并且确实需要存储密码。这正是 OAuth 和其他协议被发明出来的确切场景。你必须为遗留系统做你必须做的事情,但任何新的东西都没有理由存储未散列/加盐的密码。
【解决方案2】:

在 asp.net 中,有很多地方可以存储会话数据。在开发中最常见的是 InProc,或者基本上在 RAM 内存中。但是,您有一天可能会决定使用不同的会话提供程序,例如数据库,或使用 Windows Azure 缓存。 在这两种情况下,以明文形式存储密码会使它们在通过网络传输时可见

在上述场景中,会话数据通过网络传输,除非传输是通过 https 发送的,否则可以看到明文密码。

【讨论】:

  • 你的答案与问题无关
  • @palmsnow 实际上,olivehour 的回答很切题;有人指出,将密码放在Session 中可能会导致密码以明文形式通过网络发送,因为您可能会在某些时候使用外部会话存储机制。我认为这是一个很好的观点。 +1
  • @AndrewBarber 仅当您不使用服务器之间的安全通道时才如此,这将是非常愚蠢的事情
  • @AndrewBarber 谢谢,我认为它也回答了这个问题——“我需要注意任何安全风险或问题吗?”已将安全风险加粗。
  • @RobertLevy 你去过stackoverflow.com吗?有很多人在做很多愚蠢的事情。我将更新我的答案以解决 HTTPS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多