首页 > 解决方案 > Dart / Flutter 使用公钥解密

问题描述

我在我的服务器上创建了一个 RSA 密钥对,只有服务器拥有私钥。客户端(颤振应用程序)将有权访问公钥。因此,当服务器接收到加密消息时,它会知道该消息来自正确的客户端,并将使用其私钥解密通过公钥加密的消息。

当服务器(php 7.3)向客户端发送回复时,我想通过服务器端的私钥加密消息,以便客户端可以使用公钥解密消息。

非对称加密有其自身的限制,例如最大字符长度。但是发送和接收小消息会很好。

Flutter 包 encrypt & pointycastle 似乎不支持使用公钥解密。我不希望客户同时拥有这两个密钥。

可能我将不得不使用对称加密。但是,如果您能提出解决方案,我将不胜感激。

注意:我已经能够通过 pointycastle 使用公钥加密消息,但是编写一个使用公钥解密数据的函数对我来说非常复杂。

标签: flutterdartencryptionrsapublic-key

解决方案


我在我的服务器上创建了一个 RSA 密钥对,只有服务器拥有私钥。客户端(颤振应用程序)将有权访问公钥。因此,当服务器接收到加密消息时,它会知道该消息来自正确的客户端,并将使用其私钥解密通过公钥加密的消息。

通常我们会尝试不对公钥设置任何安全性。如果您想验证您的消息,您应该使用客户端特定的密钥对并使用它们生成签名。

此外,通常您不仅要对消息保密,还要确保它们没有被篡改(消息真实性带来的完整性)。

当服务器(php 7.3)向客户端发送回复时,我想通过服务器端的私钥加密消息,以便客户端可以使用公钥解密消息。

您可以使用属于客户端密钥对的公钥来执行此操作。

非对称加密有其自身的限制,例如最大字符长度。但是发送和接收小消息会很好。

最大位或更确切地说是字节大小,而不是字符长度。但通常我们还是会使用混合加密。

Flutter 包 encrypt & pointycastle 似乎不支持使用公钥解密。我不希望客户同时拥有这两个密钥。

这很好,因为使用公钥解密没有意义,您将使用单独的密钥对。

可能我将不得不使用对称加密。但是,如果您能提出解决方案,我将不胜感激。

最好只使用 TLS,并将 TLS 与客户端身份验证一起使用以实现简单的传输安全。

如果您需要应用程序级别的安全性,那么您可以使用容器格式,例如 CMS。最好每个实体使用两个密钥对:一个用于加密(针对私钥持有者),另一个用于由私钥持有者生成签名(即消息完整性和真实性)。

注意:我已经能够通过 pointycastle 使用公钥加密消息,但是编写一个使用公钥解密数据的函数对我来说非常复杂。

好的。不。


推荐阅读