使用非对称加密来保护密码

时间:2011-08-08 09:24:18

标签: security authentication encryption rsa

由于我们客户的要求,用户密码必须以某种“可读”形式保存,以便允许在以后转换帐户。不幸的是,这里只是保存哈希值并在身份验证上比较它们。当然,在数据库中存储普通密码也不是一种选择,但使用像AES这样的加密方案可能就是其中之一。但在这种情况下,解密密码的密钥必须存储在处理身份验证的系统上,我对此不太满意。

希望获得“两全其美”,我的实现现在使用RSA非对称加密来保护密码。使用公钥对密码进行加密和加密。我禁用了任何额外的内部腌制或填充机制。加密的密码每次都是相同的,就像MD5或SHA1哈希密码一样。这样,认证系统只需要公钥。私钥不是必需的。

私钥在创建后打印出来,密封并在公司的安全状态下离线存储。但是,当以后需要转换帐户时,它将允许访问密码。

在我们部署此解决方案之前,我想听听您对此计划的意见。设计中有任何缺陷吗?与对称加密相比有任何严重的缺点吗?我们还缺少什么?

非常感谢你!

-

更新 的 为了回应下面Jack的论点,我想为基于RSA的“散列”函数添加相关的实现细节:

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher rsa = Cipher.getInstance("RSA/None/NoPadding");
rsa.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] cryptRaw = rsa.doFinal(saltedPassword.getBytes());

快速浏览了Jack提到的论文,我想我有点理解OAEP等预处理的重要性。是否可以扩展我原来的问题并询问是否有办法应用所需的预处理,并且每次输入仍然使函数返回相同的输出,就像常规的哈希函数一样?我会接受这个“红利问题”的答案。 (或者我应该在SOF上提出一个单独的问题吗?)

-

更新2: 我很难接受目前的答案之一,因为我觉得没有人能回答我的问题。但我不再指望会有更多的答案,所以我会接受我认为最有建设性的答案。

5 个答案:

答案 0 :(得分:2)

我将此添加为另一个答案,因为这不是回答问题(正如我在第一个回复中所做的那样),而是一个解决方法/替代建议。

简单地说:

使用哈希但是,只要用户更改密码,也可以按如下方式使用您的公钥:

  • 生成随机对称密钥并使用它来加密时间戳,用户标识符和新密码。
    • 时间戳是为了确保您在以后尝试查找当前/最新密码时不会陷入困境。
    • 用户名,以便您知道您正在处理哪个帐户。
    • 密码,因为这是一项要求。
  • 存储加密文本。
  • 使用您的公钥加密对称密钥。
  • 使用加密文本存储公钥加密对称密钥。
  • 销毁内存中的纯文本对称密钥,只保留公钥加密密钥。

当您需要使用当前密码“转换”帐户时,您可以使用私钥并浏览密码更改记录。对于每一个:

  • 使用私钥解密对称密钥。
  • 使用对称密钥解密记录。
  • 如果您已有此用户的记录,请比较时间戳,并保留最新的密码(丢弃旧密码)。
  • 泡沫,冲洗,重复。

(坦率地说,我可能通过加密时间戳而不是留下明文而过度使用东西,但我很偏执,我有时间戳的东西。不要让我开始。)

由于您在更改密码时仅使用公钥,因此速度并不重要。此外,您不必在用户用于身份验证的服务器上保留明文密码加密的记录/文件/数据。这些数据可以存档或以其他方式定期移动,因为正常操作不需要它们(这就是散列的用途)。

答案 1 :(得分:1)

问题中没有足够的信息可以给出任何合理的答案。无论如何,因为你禁用填充,很有可能是本文中描述的攻击之一 “为什么教科书ElGamal和RSA加密是不安全的” D. Boneh,A。Joux和P. Nguyen适用。

当然,这只是一个疯狂的猜测。您的提案可能会受到许多其他攻击。

答案 2 :(得分:0)

在回答您的具体问题时,我主要关心的是私钥的管理,但鉴于它很好并且真的无法通过任何计算机系统漏洞访问,您可以在这方面做得很好。

我仍然质疑不使用哈希的逻辑 - 这听起来像是经典的YAGNI。散列过程是确定性的,因此即使您决定将来迁移系统,只要您仍然可以使用相同的算法,您将获得相同的结果。就个人而言,我会选择一个强大的哈希算法,在每个帐户上使用加密强大的独特盐并完成它。

答案 3 :(得分:0)

就在线内容而言,它似乎足够安全,但您是否充分考虑了离线存储。公司内部人员访问私钥的难易程度如何?如果贵公司内有人访问私钥,您怎么知道?私钥被破坏是多么容易(例如,安全的防火/防水,打印的密钥会随着时间的推移变得难以辨认等)。

您需要查看分裂知识,双重控制,防篡改信封等内容。至少我认为您需要打印出两个数据字符串,这些数据一起或者一起创建私钥然后有一个在您的办公室和客户办公室,

答案 4 :(得分:0)

我没有看到的一个严重缺点是速度。

对称加密通常比非对称加密快得多。这通常很好,因为大多数人在他们的设计中都会考虑到这一点(例如,SSL只使用非对称加密来共享对称密钥和检查证书)。你将为每次登录做非对称(慢速),而不是加密散列(非常快)或对称加密(非常活泼)。我不知道它会影响性能,但它可以。

作为比较点:在我的机器上,AES对称流密码加密(aes-128 cbc)产生高达188255kB / s。这是很多密码。在同一台计算机上,使用带有512位密钥(不再用于签署SSL密钥)的DSA,每秒签名的峰值性能(可能与您的预期操作最接近)是每秒8916.2次操作。假设签名使用MD5大小的校验和,那么差异(大致)是千分之一。三个数量级。

这种直接比较可能不适用于您的情况,但我的目的是让您了解比较算法的复杂性。

如果您有加密算法,您更愿意使用或比较,并且您希望在系统上对它们进行基准测试,我建议对具有openssl构建的系统使用'openssl speed'命令。

您还可以使用旨在加速公钥加密操作的专用硬件来缓解这种担忧。