2011-03-30 47 views
3

我试图确保一个即将被移动到公共服务器的网站。我刚刚完成了将密码散列函数添加到我的所有登录脚本。我使用FormsAuthentication.HashPasswordForStoringInConfigFile(pw, method)这样做。我有一个关于我使用和它是否是安全的web服务器的进程问题:VB.Net密码散列做法

  1. 密码以纯文本格式通过HTTPS发送到服务器
  2. 服务器查找在用户表找到
  3. 明文密码被追加与盐
  4. 新的字符串使用上述功能
  5. 新凑版本进行比较散列用户的盐(几个随机字符)和它们的哈希和盐腌存储的密码存储的版本为
  6. 如果相等,则允许登录
  7. 如果不相等,登录尝试会记录在会话变量中,最多3次,然后锁定用户计算机访问登录页面,直到管理员验证IP地址并解锁。

这是否正确?我只是没有看到盐在这种方法中是如何有效的......无论如何,我所做的只是添加盐和散列。这是否被认为是加密?还是我错过了一个步骤?我记得读过像SHA1和MD5这样的散列算法不是加密算法,那还有什么需要做的?

+0

密码永远不应加密,它们必须始终被哈希。 – rook 2011-03-30 18:59:11

+0

谢谢,你说这很有趣。当它实际上只是散列化时,我一直称这种方法为“加密”。我对这个东西还是一个新的东西,所以我不知道有什么不同。只是将问题标题从“加密”改为“哈希” – Dexter 2011-04-01 19:34:03

回答

3

这是正确的。盐用于防止彩虹表攻击,其中使用MD5散列的常见作品字典试图获得输入。使用salt可以确保即使他们有MD5散列的单词,也不会工作,因为他们不知道盐。

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

你在做什么是一种推荐的做法。

+0

好的,那很好。我们实际上有一个密码重置表单,而不是发送密码。那么MD5呢?我读过这些日子并不安全,但我不确定我的选项是在哈希函数上。据我所知,只有MD5和SHA1。还有更多吗?或者我可以安全地将它用于存储非敏感个人信息(例如电子邮件,电话和地址)的网站(无凭据或财务信息) – Dexter 2011-03-30 18:07:01

+0

@Dexter并非MD5不安全,而是有表格可供随时查看快速的哈希。另一个问题是已经证明存在碰撞。这意味着有多个不同的值会导致相同的散列。我不知道发生碰撞的频率的统计数字,但这很少见。使用MD5来保存密码是安全的。并且在3次尝试之后锁定登录表单使得难以强力攻击该站点。我会小心IP锁。知识产权并非个人独有,可能会锁定1人以上。 – NerdFury 2011-03-30 18:12:33

+0

是的,我想我只需要在数据库中添加一个锁定字段,然后锁定用户。谢谢你的帮助! – Dexter 2011-03-30 19:35:14

1

您不应该在会话中存储重试计数 - 攻击者可以在每次尝试后简单地放弃其会话cookie,允许他们按照自己的意愿多次重试。相反,将其存储在用户记录中。