VB.Net密码哈希实践

3

我正在努力保护一个即将转移到公共服务器上的网站。 我刚刚完成了在所有登录脚本中添加密码哈希函数的工作。 我正在使用 FormsAuthentication.HashPasswordForStoringInConfigFile(pw, method) 来实现此目的。 我对自己使用的流程以及它是否安全有一个问题:

  1. 密码以明文形式通过HTTPS发送到服务器
  2. 服务器查找Users表,以查找用户的Salt(几个随机字符)和其散列和盐存储的密码
  3. 明文密码附加在盐中
  4. 使用上述函数对新字符串进行哈希处理
  5. 新哈希版本与存储的版本进行比较
  6. 如果相等,则允许登录
  7. 如果不相等,则登录尝试记录在会话变量中,最多尝试3次,在管理员验证IP地址并解锁之前,该用户的机器将被锁定无法访问登录页面。

这看起来正确吗?我只是不明白Salt在此方法中如何有效...无论如何,我所做的就是添加一些盐和哈希。 这是否被认为是加密?还是我错过了什么步骤?我记得读到哈希算法(如SHA1和MD5)不是加密算法,那么还需要做什么?


密码永远不应该被加密,而是必须进行哈希处理。 - rook
谢谢,你说的很有趣。我一直称这个方法为“加密”,但实际上它只是哈希。我还是新手,所以不知道两者之间有很大的区别。我已经将问题标题从“加密”改为“哈希”。 - Dexter
2个回答

3

是的,盐值用于防止彩虹表攻击,这种攻击使用常见单词的MD5散列字典来尝试获取入口。使用盐确保即使他们拥有单词的MD5散列,也无法使用它,因为他们不知道盐值。

MD5算法是一种单向哈希算法,而不是加密值。区别在于,一旦您对值进行了哈希,就没有办法返回原始值。加密允许您解密数据并获取原始值。所以您是正确的,它们不同,您的密码不是加密的,而是哈希的。这意味着如果有人忘记了密码,您无法将其发送给他们。您必须提供一种重置密码的方式。这也意味着任何能够访问数据库的人都无法访问原始密码。这很好,因为很多人在各个网站上都使用相同的密码,如果您可以访问大量的用户名和密码列表,则某些人可能决定开始尝试登录银行/信用卡网站。

您正在执行推荐的做法。


好的,这很好。我们实际上有一个密码重置表单,而不是发送密码。那MD5呢?我读到现在它已经不安全了,但我不确定哈希函数的选项是什么。据我所知只有MD5和SHA1。还有更多吗?或者说如果我的网站只存储非敏感个人信息,例如电子邮件、电话和地址(没有凭证或财务信息),使用MD5是否安全? - Dexter
@Dexter,MD5并不是不安全,而是有现成的表格可以快速查找哈希值。另一个问题是已经证明存在碰撞。这意味着会有多个不同的值导致相同的哈希值。我不知道碰撞发生的频率有多高,但这很罕见。使用MD5来进行密码哈希是安全的。通过在3次尝试后锁定登录表单来使暴力攻击变得困难也有所帮助。我建议小心使用IP锁定。IP地址并不唯一,可能会将超过1个人锁定在外。 - NerdFury
是的,我想我只需要在数据库中添加一个锁定字段,然后完全锁定用户。谢谢你的帮助! - Dexter

1
你不应该将重试计数存储在会话中 - 攻击者可以在每次尝试后丢弃其会话 cookie,从而允许他们随意重试。相反,请将其存储在用户记录中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接