【问题标题】:Dart / Flutter decrypting with Public KeyDart / Flutter 使用公钥解密
【发布时间】:2020-11-15 13:13:20
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 您是否了解在您的方案中任何拥有公钥的人都可以解密,因此您根本没有安全性?

标签: flutter dart encryption rsa public-key


【解决方案1】:

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

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

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

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

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

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

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

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

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

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

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

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

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

很好。不要。

【讨论】:

  • 评论太长了。我会标记为迁移,因为这还不是真正的编程,更多 Information Security,但我认为它不会被接受。
  • 能否请您告知我应该将客户端的私钥存储在哪里?
  • 在应用程序/客户端中。不过,您还需要一种在公钥内建立信任的方法。您可以为每个客户端使用相同的密钥对,但在这种情况下,您将无法分别对客户端进行身份验证,并且丢失一个私钥将意味着失去所有真实性和机密性。
猜你喜欢
  • 2015-01-25
  • 2013-08-06
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2016-12-31
  • 2018-07-31
相关资源
最近更新 更多