使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)