【问题标题】:BCrypt algorithm: Is it good to return hashed password from database for comparision?BCrypt算法:从数据库返回哈希密码进行比较是否好?
【发布时间】:2014-09-08 19:27:51
【问题描述】:

我在 ASP.NET MVC 项目中使用 BCrypt 算法,如下所述:

http://www.codeproject.com/Articles/475262/UseplusBCryptplustoplusHashplusYourplusPasswords

由于我使用的是 N 层架构,需要在数据访问层中创建从数据库返回哈希密码的方法。在这一点上,我不舒服。

从数据库返回散列密码好不好?我想从数据库端执行此操作,但要检查密码,我需要调用以下方法,为此,我需要哈希密码:

BCrypt.CheckPassword(myPassword, myHash);

还有其他方法吗?实现它的最佳方法是什么?

【问题讨论】:

  • 是否有特定原因让您对将哈希从数据库返回到 BLL/DAL 感到不舒服??
  • 因为在这个算法中不需要加盐来比较,所以任何人都会将哈希密码与猜测的密码进行比较(使用检查密码)......这就是为什么

标签: c# security asp.net-mvc-4 login


【解决方案1】:

是的,可以从数据库中提取散列值,事实上,除非您要在数据库中实现自定义函数,否则这是必需的。只是不要在客户端检查密码,检查它在服务器端。

【讨论】:

  • 实际上同一个数据库有不同的客户端,每个客户端都有自己的算法,所以我需要在服务层实现返回哈希密码的方法(我无法在服务层实现比较)。由于此算法中不需要加盐进行比较,因此任何人都会将散列密码与猜测密码进行比较(使用检查密码)......这就是为什么
  • bcrypt 有盐。它存储在值的开头。
  • @WebWorld 缺少密码盐是什么决定了在您的分层方法中散列(​​原始文本密码)== hashedPassword 的问题?我觉得我们或您都缺少一些东西:P
  • 链接中没有使用salt进行比较..是不是错了?
  • 我的 cmets 与密码盐无关.我试图理解为什么它会一直被提起,以防我们在回复中遗漏了什么
【解决方案2】:

bcrypt salt/hash 不是秘密1 - 这个想法是即使这被“暴露”也是不可行的扭转。例如,可能有一个与 HMAC 一起使用的附加密钥,但它在基本 bcrypt 散列之外。

在许多应用程序中习惯于将身份验证/哈希验证检查保留在相关的应用程序/服务层中 - 如图所示 - 但它也可以在数据库中完成(例如,使用存储过程,取决于)。但只需使用提供的示例代码;就够了。

必须信任“是的,这是表示哈希的有效密码”的服务。给它提供一个已知/受损的哈希值可能会导致它撒谎 - 但此时整个系统都受到了损害,这与让数据库充当外部提供者说“我信任这个用户”没有什么不同。


1 虽然正确的密码散列不是秘密,它通过防止被反转来提供安全性,但散列通常应该保密。通常,只有使用哈希进行身份验证的服务才需要访问哈希,并且只能通过已知密钥访问哈希。这只是很好的家务。

【讨论】:

  • 您是否推荐任何其他算法以获得最佳安全性?
  • @WebWorld bcrypt 或 scrypt 是我现在接受的唯一有效的密码哈希算法(有些人认为 PBKDF2 仍然相关)。但是,我最终的建议是“让其他人处理身份验证”(例如框架、经过审查的库或外部身份验证提供程序)。
猜你喜欢
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
相关资源
最近更新 更多