使用 RSACryptoServiceProvider 类将加密密码插入数据库?

Posted

技术标签:

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

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

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

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

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

现有的password based key agreements 如SRP 解决了这两个问题。

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

【讨论】:

以上是关于使用 RSACryptoServiceProvider 类将加密密码插入数据库?的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)