【问题标题】:How to authenticate user against salted and hashed password and username?如何根据加盐和哈希密码和用户名对用户进行身份验证?
【发布时间】:2017-10-28 18:01:57
【问题描述】:

我正在开发一个 .net web api 项目,需要将用户名和密码存储在用户表中。

如果用户名和密码字段在用户表中随机散列并且盐存储在用户的同一行中,我将如何验证用户?我错过了什么吗?好像没办法找到用户做密码比对。

【问题讨论】:

标签: c# encryption hash


【解决方案1】:

它们本身不是随机散列的。它们针对相同的密钥进行哈希处理。因此,要进行身份验证,您需要对输入的凭据重复哈希过程,并将该哈希与用户存储的哈希进行比较。

另一个选项是使用内置的Membership 提供程序为您处理身份验证。

您对两者进行散列的实际要求实际上是一个非常难以解决的要求。正如您所确定的,您将无法识别该用户。因此,您将不得不求助于使用一些排序数据,例如 IP、用户代理字符串等来做出最佳猜测。但是,这将是非常危险的。

归根结底,用户名用于识别用户是谁,而不是验证该用户。如果您有从不显示用户名或以其他方式保护用户名的安全要求,请显示他们使用他们的名字或其他标识符登录,以免用户名暴露。归根结底,您必须找到用户记录并对用户名进行哈希处理只会使这变得更加困难,并且不会为您提供任何真正的安全优势。

可以在here找到其他有价值的安全阅读

【讨论】:

  • 我阅读了几篇建议使用加盐来确保随机性的文章。您是说我仍然应该能够根据用户输入的内容生成存储在数据库中的相同密码吗?
  • 您不能生成相同的密码。这将是安全利益冲突。相反,用户尝试通过输入其凭据来登录。您从数据库中获取该用户名的哈希值和盐值。您使用盐对用户提供的纯文本密码进行哈希处理,最后比较两个哈希值。如果它们匹配,则应将用户标记为已通过身份验证。 “随机性”是两个用户永远不会使用相同的盐。
  • 如果我还需要保护用户名怎么办?我可以加密用户名,但似乎我会遇到同样的问题。当您需要保护用户名和密码时,是否有一种快乐的媒介?一定要喜欢规格。 :-)
  • 正如大卫指出的那样,对用户名进行哈希处理没有任何好处。不过,您始终可以使用通用的“超级秘密”盐对所有用户名进行哈希处理,以安抚那些不了解的人;)
  • @PaulZaczkowski 有趣的把戏:)。这是满足荒谬要求的好方法,尽管那时一切都只是烟雾和镜子
猜你喜欢
  • 2020-08-17
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 2014-02-15
  • 2015-12-17
  • 1970-01-01
相关资源
最近更新 更多