安全的用户身份验证 - 我做得对吗?

时间:2009-08-10 16:26:11

标签: asp.net security authentication

我正在为客户开发Asp.NET网站,并希望确保我使用的是安全身份验证方案。

在我的用户表中,我有一个身份验证哈希列,计算为sha1(salt + username + password)。该网站通过HTTPS提供服务。要登录,用户通过HTTPS提交其名称和密码。 Web服务器计算哈希值,并将其与数据库存储值进行比较以进行身份​​验证。

这听起来相当安全吗?我把这个计划运过我的一个朋友,他说它很容易受到邪恶的系统管理员的攻击。他说我应该做以下事情:

  • 每次提供登录页面时,服务器都会指定一个唯一的salt。
  • 在提交前,通过javascript将密码哈希到客户端上的唯一salt。
  • 发送此哈希值进行身份验证,但不是密码。
  • 做一些我不理解的奇怪的垃圾来验证哈希值。

我该怎么办?

6 个答案:

答案 0 :(得分:7)

不要重新发明轮子,只需使用.Net Membership

答案 1 :(得分:4)

首先,如果用户通过HTTPS进行连接,那么通过网络向服务器发送密码应该不存在问题。

否则,确保您的盐很长并且使用适当的熵随机性。还要确保使用SHA-2而不是SHA-1,因为SHA-1是considered broken

答案 2 :(得分:4)

  

这听起来相当安全吗?一世   我的朋友经过这个计划,   他说它很容易受到伤害   邪恶的系统管理员。

直接发送密码总是有点危险。即使您使用的是SSL。如果这是他所指的那么他就是对的。我不会说它很脆弱,只是不是最安全的方法。

  
      
  • 每次提供登录页面时,服务器都会指定一个唯一的salt。
  •   
  • 通过javascript将密码隐藏在客户端上的唯一salt中   在提交之前。
  •   
  • 发送此哈希值进行身份验证,但不是密码。
  •   
  • 做一些我不理解的奇怪的垃圾来验证哈希值。
  •   

听起来他正在建议与SSL结合的挑战 - 响应方案。这是一个很好的方法,但让我一步一步地解释清楚。

注册后,密码将通过ssl发送到服务器。这应该是密码直接发送的唯一时间。服务器生成salt并存储以下哈希:

hash = sha1(password + salt)

服务器还应该存储盐。

当客户端访问登录页面时,服务器应在具有ID和质询值的表中生成记录。然后,服务器应将ID,存储的salt和质询值发送给客户端。

当客户端准备好登录时,你应该有一个javascript函数生成一个挑战以及一个像这样的哈希:

hash = sha1(sha1(password + server_salt) + server_challenge + client_challenge)

然后,客户端应提交hash,server_saltid和client_challenge值。然后服务器像这样计算一个哈希:

hash = sha1(stored_hash + server_challenge + client_challenge)

如果哈希匹配,则用户通过身份验证,在任何一种情况下,都应删除质询记录。

答案 3 :(得分:3)

阅读本文:
Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes

  

我们学到了什么?   ......如果它是2007年,彩虹表攻击让你着火,我们了解到你应该回到1975年并等待30年才能尝试设计密码哈希方案。
  ......我们应该咨询我们在安全领域的朋友和邻居,以获得我们的密码方案的帮助   ...在密码哈希方案中,速度是敌人。我们了解到MD5是专为速度而设计的。所以,我们了解到MD5是敌人   ...如果我们想要安全地存储密码,我们有三个合理的选择:PHK的MD5方案,Provos-Maziere的Bcrypt方案和SRP。我们了解到正确的选择是Bcrypt。

关键点在这里:

  • 无论您做什么,都不要尝试从头开始构建自己的身份验证代码
  • Bcrypt是您散列密码的最佳选择。

答案 4 :(得分:2)

如果您在每个登录页面上更改了salt,那么如何将其与使用不同盐进行哈希处理的数据库中的内容进行比较?

您的SSL下,因此您可以发送凭证免费文本,因为该行已经加密,然后应用规则对您的密码进行salt / hash以便比较服务器端。这样,没有人知道你是如何加密密码的。将信息存储在您的客户端javascript只是提供了这些信息。

除此之外,您的方法看起来是正确的。我假设您需要一个自定义解决方案而不是内置的解决方案。

答案 5 :(得分:2)

你的朋友断言盐应该是独一无二的,但是他在处理盐方面是错的。

  
      
  • 通过javascript将密码哈希在客户端上   提交。
  •   

这要求您为每个人使用相同的盐,或者知道用户是谁,这样您就可以向他们发送他们独特的盐。盐永远不会离开服务器。