这个 RSA/AES 组合好吗?

信息安全 密码学 AES RSA
2021-08-21 18:36:18

我所在的开发团队正在尝试开发一种在服务器和移动设备之间交换敏感数据的安全方法。

我们提出了以下算法:

  1. 设备生成 RSA 私钥,并将公钥发送给服务器。

  2. 服务器生成用户唯一的 AES 密钥,并使用 RSA 公钥对其进行加密并将其发送回设备。

  3. 设备获取 AES 密钥。使用它来加密密码和用户名并将其发送到服务器。

  4. 服务器解密用户名和密码。如果匹配,则 AES 密钥用于安全通信 X 时间或直到注销。否则,必须重新启动该过程。

它足够安全吗?有没有可以改进的方法?有哪些故障?

编辑:阅读评论后,什么是更安全的选择,为什么?

Edit2:好的,我明白了。我不会使用我自己的实现,会发现一些已经尝试和证明的东西。

4个回答

您的协议中的所有弱点都可以概括为“使用 SSL”甚至“使用 SSL,该死的!”。

详细信息:

  • 当然,所有协议都容易受到模仿,特别是双重模仿,也称为中间人攻击
  • 同样,如果任何可以窃听线路的潜在攻击者决定对传输中的数据进行修改,那么他可以,而您的客户端和服务器也不会更明智。
  • 经验表明,说“使用该密钥加密所有数据”然后正确执行是非常复杂的。SSL 本身花了将近 15 年的时间才做到这一点,而且许多实现仍然达不到要求。填充预言机、可预测的 IV、MAC 验证时间、验证关闭、防止重新排序和重放数据包……

作为一个整体评估:不要那样做。

不,这个协议是不安全的。

正如评论中已经提到的:

不要推出自己的加密货币。你有可能弄错了。特别是如果你承认你并不真正知道自己在做什么。

首先,您似乎有标准问题,已经有标准协议,这些协议具有很好的属性和安全性证明数据传输协议应为TLS v1.2(或更新版本)。你应该使用一个库(比如NSSGnuTLSOpenSSL)。对于密码验证,最好的选择是使用SRPTLS-SRP但是,如果您真的买不起 SRP(这应该是您的首选),您仍然可以遵循本文
到目前为止的改进。

现在针对您的协议的缺陷:

  1. 它容易受到中间人攻击如果攻击者位于设备和服务器之间,他可以获取公钥并将其替换为自己的。作为回应,他知道 AES 密钥并可以解密所有数据。
  2. 您没有提到数据的完整性/真实性。听起来您想对 AES 使用ECB 模式(您真的不想使用),使用AES-GCM进行批量加密会好得多。您也没有提到如何使用 RSA,RSA-OAEP应该是您的选择(而不是教科书 RSA)。但是,我假设您已经通过实施完成了此操作。
  3. 您在设备上放置了非常大的工作量。设备需要为每个连接生成一个新的私有 RSA 密钥,这是一项高度计算密集型的任务。您应该考虑使用 ECDH 密钥交换。
  4. 为了验证密码,您要么需要服务器以明文形式存储密码,要么自己对密码进行哈希处理,这可能会导致对服务器的 DoS 攻击。如果发生中间人攻击,普通密码将被泄露给攻击者,这可能会对您的用户造成严重伤害(因为他们可能会跨站点重复使用他们的密码......)
  1. 设备生成 RSA 私钥,并将公钥发送给服务器。

  2. 服务器生成用户唯一的 AES 密钥,并使用 RSA 公钥对其进行加密并将其发送回设备。

  3. 设备获取 AES 密钥。使用它来加密密码和用户名并将其发送到服务器。

匿名密钥交换。

没有身份验证。您的密钥交换已加密,但未经过身份验证。这不好。

如果有一个活跃的中间人,那么您将无法检测到这一点。这个活跃的中间人可以只是向客户端假装他是服务器。并假装服务器,他是客户。

-> 不要这样做。@SEJPM 对他的评论是正确的。使用已建立的加密系统。就像带有证书的 TLS 或带有 SRP 的 TLS。

这就是我用来做 rsa / aes 组合的方式

  1. 客户端生成随机 aes 密钥
  2. 使用 aes 密钥加密您需要的数据(rsa 需要更长的时间并且有长度限制,所以最好使用 aes 进行加密)
  3. 使用公钥加密 aes 密钥
  4. 将加密数据和由 rsa 公钥加密的 aes 密钥传递给服务器
  5. 当服务器接收到时,通过私钥解密该 aes 密钥,然后通过解密的 aes 密钥解密附加的数据