用私钥加密数据危险吗?

信息安全 加密
2021-08-24 05:04:33

我一直在审查各种内部应用程序的代码,这些应用程序处理与外部系统的数据安全传输。这些遵循以下过程:

  • RSA 使用第 3 方公钥加密数据
  • RSA 使用我们自己的私钥再次加密
  • 传输数据
  • 第三方使用我们的公钥解密
  • 第三方使用自己的私钥再次解密

在这个系统中,我们为每个第三方生成新的私钥/公钥,所有公钥都安全分发,然后保密。

我不明白为什么我们要使用自己的私钥加密数据。我怀疑设计者的意图是验证数据来自我们,而同一个人不知道签署消息来实现这一点。不幸的是,那个人不再被问到了。

我很高兴我们的数据是可以接受的安全,因为我们使用第三方密钥对其进行加密,但私钥加密似乎不够标准,我感到有些不适。有什么我应该担心的吗?

3个回答

您正在查看的代码似乎对RSA签名如何工作的第一个描述有点过于字面意思。

最初描述 RSA 时,它是一个非对称加密系统:发送方使用接收方的公钥加密数据,核心运算是模幂运算,其输入为模nn是模数,公钥的一部分) ) 并返回一个模数n然后有人说:嘿,如果我们反转过程并解密一些输入数据(必须使用私钥),那么我们会得到一个签名,因为任何人都可以执行反向操作(用公钥加密),这算作签名验证.

这是对 RSA 签名的过于简单化的描述,它实际上不起作用,因为它忽略了padding的效果,这是安全所必需的(请参阅PKCS#1以了解进行 RSA 加密和签名的正确方法)。但是不幸的是,签名是反向加密(或“用私钥加密”)的想法很普遍,并导致了许​​多自制的解决方案,这些解决方案总是在某种程度上很弱(但不一定以明显的方式)。您可能会观察到这种自制的解决方案。

这至少是不好的做法,而且可能很危险。我强烈建议更改您使用的方案。

您不应该使用您的私钥加密内容。您应该使用您的私钥对其进行签名。虽然使用 RSA 时使用私钥进行签名和加密是类似的操作,但应将它们分开考虑。特别是签名适用于哈希,而不是实际内容。

根据您当前系统的具体实施方式,第三方可能会诱骗您解密从另一第三方收到的数据。

也有可能欺骗您签署您不想以这种方式签署的东西。但是如果没有您使用的方案的详细信息,我不能肯定地说。

PKI 算法通常使用更长的密钥,因此计算成本更高。这就是 SSL/TLS 之类的东西使用 PKI 来设置流但随后使用具有较短密钥的共享密钥密码的原因之一。

用你的密钥加密别人的文本是否有风险取决于所使用的密码。一些密码容易受到选择明文攻击普通 RSA 就是其中之一。PKCS#1不是。

但是正如您所说,如果您只需要身份验证,则只需签名即可(认为这也需要您的私钥。)