C# 是否使用RSACryptServiceProvider类将加密密码插入数据库?

C# 是否使用RSACryptServiceProvider类将加密密码插入数据库?,c#,authentication,encryption,C#,Authentication,Encryption,我有客户端正在使用的WCF服务,下面是我当前的用户身份验证实现,我想要一个建议来增强它或更好的机制 我正在使用RSACryptoServiceProvider 类(RSA实现)将加密的用户密码保存到数据库中 客户机应使用公钥(存储在文件中)加密每次登录的密码,并将其发送给具有用户名的日志记录方法 在服务器端,使用登录方法 为该文件选择加密密码 提供用户名并使用私钥比较解密密码(由用户和db one发送) 注意:每次加密 使用RSA的字符串具有相同的公共 密钥生成新的加密字节, 所以我不能比较加

我有客户端正在使用的WCF服务,下面是我当前的用户身份验证实现,我想要一个建议来增强它或更好的机制

  • 我正在使用RSACryptoServiceProvider 类(RSA实现)将加密的用户密码保存到数据库中

  • 客户机应使用公钥(存储在文件中)加密每次登录的密码,并将其发送给具有用户名的日志记录方法

  • 在服务器端,使用登录方法 为该文件选择加密密码 提供用户名并使用私钥比较解密密码(由用户和db one发送)

    注意:每次加密 使用RSA的字符串具有相同的公共 密钥生成新的加密字节, 所以我不能比较加密 密码和我必须解密它们进行比较

附言 答案是“为了进行身份验证,您应该避免使用可逆加密存储密码”


我在问,如果没有人可以解密密码,除非他有私钥,那么问题是什么,即使哈希是不可逆的,但它是坏的

存储加密密码而不是散列密码不是常见做法。你有什么特别的理由这样做吗


如果没有,我建议用盐存储散列的密码(SHA-2或类似的东西)。

我认为有两个问题需要注意:

  • 密码是如何安全传输的
  • 如何安全地存储密码
现有的,如解决这两个问题


使用RSA加密密码的解决方案不是一个坏主意,但只是部分解决方案:因为RSA将加密随机化,所以它可以防止脱机字典攻击。根据您的描述,不清楚您的提案是否阻止了重播攻击。攻击者是否可以通过发送先前截获的加密密码登录,或者您是否有时间戳之类的对策

我强烈推荐这一点。永远不要存储任何可以恢复用户密码的内容。始终使用散列并比较散列密码,而不是原始密码。我假设我可以防止密码破解,即使数据库成为攻击者,我更喜欢使用散列密码的数据库,而不是使用RSA加密密码的数据库。即使密码是咸的,攻击者仍然可以执行字典搜索。攻击者无法使用预计算表。当数据库使用RSA正确加密时,不可能进行字典攻击。我同意在某些情况下,哈希密码对攻击者有好处。由于(Accipitrdae)列举的原因,破解哈希可能更容易。然而,也有另一面。如果有人持有您的私钥,您将丢失所有密码,而使用hasheds密码则不是这样。因此,两者的好处都大于前者。