【问题标题】:Inserting encrypted password using RSACryptoServiceProvider class into DB?使用 RSACryptoServiceProvider 类将加密密码插入数据库?
【发布时间】:2009-08-22 09:26:23
【问题描述】:

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

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

  • 客户端每次登录时都应使用公钥(存储在文件中)加密密码,并使用用户名将其发送到登录方法

  • 服务器端的登录方式 选择加密的密码 提供用户名并使用私钥比较解密密码(由用户和数据库一发送)

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

附言 答案是“出于身份验证目的,您应该避免使用可逆加密存储密码”

我在问是否没有人可以解密密码,除非他有私钥,所以有什么问题,即使散列不可逆但它被破坏了!!

【问题讨论】:

    标签: c# authentication encryption


    【解决方案1】:

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

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

    【讨论】:

    • 不能强烈推荐这个。永远不要存储任何可以取回用户密码的东西。始终使用哈希并比较哈希密码,而不是原始密码。
    • 我认为即使数据库被盗,我也可以防止密码破解
    • 作为攻击者,我更喜欢使用散列密码的数据库,而不是使用 RSA 加密密码的数据库。即使密码被加盐,攻击者仍然可以执行字典搜索。攻击者就是不能使用预先计算好的表。当数据库使用 RSA 字典正确加密时,攻击是不可能的。
    • 我同意在某些 种情况下,散列密码对攻击者具有优势。由于您(Accipitrdae)列举的原因,破解散列可能更容易。然而,也有另一面。如果有人掌握了您的私钥,您将丢失所有密码,而使用散列密码则并非如此。所以一个人应该胜过两者的好处。
    【解决方案2】:

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

    • 密码如何安全传输?
    • 应如何安全存储密码?

    现有的password based key agreementsSRP 解决了这两个问题。

    您使用 RSA 加密密码的解决方案不错,但只是部分解决方案:由于 RSA 随机加密,它可以防止离线字典攻击。根据您的描述,尚不清楚您的提案是否可以防止重放攻击。攻击者可以通过发送之前截获的加密密码来登录,还是有时间戳等对策?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 2011-10-09
      相关资源
      最近更新 更多