Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# BCrypt算法:从数据库返回散列密码进行比较好吗?_C#_Security_Asp.net Mvc 4_Login - Fatal编程技术网

C# BCrypt算法:从数据库返回散列密码进行比较好吗?

C# BCrypt算法:从数据库返回散列密码进行比较好吗?,c#,security,asp.net-mvc-4,login,C#,Security,Asp.net Mvc 4,Login,我在ASP.NET MVC项目中使用BCrypt算法,如下所述: 由于我使用的是N层体系结构,所以需要在数据访问层中创建一个从数据库返回哈希密码的方法。在这一点上,我感到不舒服 从数据库返回哈希密码好吗?我想从数据库端执行此操作,但为了检查密码,我需要调用以下方法,为此,我需要使用哈希密码: BCrypt.CheckPassword(myPassword,myHash) 还有别的办法吗?实现它的最佳方法是什么?是的,可以从数据库中提取哈希值,事实上,这是必需的,除非要在数据库中实现自定义函数。

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

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

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

BCrypt.CheckPassword(myPassword,myHash)


还有别的办法吗?实现它的最佳方法是什么?

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

bcrypt salt/hash是而不是一个秘密1-其想法是,即使这是“公开的”,也不可能逆转。可能还有一个附加的密钥用于HMAC,例如,但它位于基本bcrypt哈希的外部

在许多应用程序中,通常会将身份验证/哈希验证检查保留在相关的应用程序/服务层中(如图所示),但也可以在数据库中进行(例如,根据需要使用存储过程)。但只需使用提供的示例代码;这就足够了

必须信任这样的服务:“是的,这是表示散列的有效通行短语”。给它提供一个已知的/受损的哈希值可能会导致它撒谎——但在这一点上,整个系统都会受损,这与让数据库作为外部提供者说“我信任这个用户”没有什么不同



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

是否有一个特定的原因让您对从DB返回哈希到BLL/DAL感到不舒服?因为在这个算法中不需要盐来进行比较,所以任何人都会将哈希密码与猜测的密码进行比较(使用检查密码)…这就是为什么同一个DB有不同的客户端,每个客户端都有自己的算法,所以我需要在服务层实现方法来返回哈希密码(我不能在服务层实现比较)。由于此算法中不需要salt进行比较,因此任何人都可以将散列密码与猜测密码(使用检查密码)进行比较…这就是为什么有一个salt与bcrypt。它存储在值的开头。@WebWorld缺少密码salt决定了在分层方法中hashed(原始文本密码)==hashedPassword的重要性是什么?我觉得我们或者你遗漏了一些东西:锁定链接,salt不用于比较……这是错的吗?@WebWorld我的评论与密码salt无关,你一直在说缺少密码salt是决定你在哪一层设置“密码检查”逻辑的决定性因素。我试图理解为什么在我们的回答中遗漏了一些东西的情况下,它会一直被提出来。你推荐其他算法来实现最好的安全性吗?@WebWorld bcrypt或scrypt是目前我唯一认为有效的密码散列算法(有些人认为PBKDF2仍然相关)。但是,我的最终建议是“让其他人来处理身份验证”(例如,框架、经过审查的库或外部身份验证提供者)。