VB.Net密码哈希练习

时间:2011-03-30 17:00:45

标签: vb.net security hash cryptography

我正在尝试保护一个即将移动到公共服务器的网站。我刚刚在我的所有登录脚本中添加了密码散列函数。我正在使用FormsAuthentication.HashPasswordForStoringInConfigFile(pw, method)这样做。我对我正在使用的流程以及它是否对Web服务器安全有疑问:

  1. 密码以纯文本形式通过HTTPS发送到服务器
  2. 服务器在Users表中查找用户的Salt(几个随机字符)及其散列和盐渍存储密码
  3. 纯文本密码附加Salt
  4. 使用上述函数
  5. 对新字符串进行哈希处理
  6. 将新散列的版本与存储的版本进行比较
  7. 如果相等,则允许登录
  8. 如果不相等,登录尝试将记录在会话变量中,最多3次,然后锁定用户的计算机才能访问登录页面,直到管理员验证IP地址并解锁。
  9. 这看起来对吗?我只是看不出盐在这种方法中是如何有效的...无论如何,我所做的只是加盐和哈希。这被认为是加密吗?或者我错过了一步?我记得读过像SHA1和MD5这样的散列算法不是加密算法,还有什么需要做的呢?

2 个答案:

答案 0 :(得分:3)

这是正确的。盐用于防止彩虹表攻击,其中使用MD5散列的常用字典来尝试进入。使用salt可确保即使它们具有单词的MD5哈希值,也不会起作用,因为它们不知道盐。

MD5算法是单向散列算法,而不是加密值。不同之处在于,一旦您对值进行了哈希处理,就无法恢复到原始值。加密允许您解密数据并获取原始值。所以你是对的,它们不一样,你的密码没有加密,它们是经过哈希处理的。这意味着如果有人忘记了密码,则无法将密码发送给他们。您必须为他们提供重置密码的方法。这也意味着有权访问数据库的任何人都无法访问原始密码。这很好,因为很多人在任何地方使用相同的密码,如果你有权访问大量的用户名和密码,有人可能会决定开始尝试登录银行/信用卡网站。

您正在做的是推荐的做法。

答案 1 :(得分:1)

您不应该在会话中存储重试计数 - 攻击者可以在每次尝试后丢弃他们的会话cookie,允许他们根据自己的意愿重试多次。而是将其存储在用户记录中。