只共享公钥 安全吗?

Posted

技术标签:

【中文标题】只共享公钥 安全吗?【英文标题】:Sharing only the public key Is secure? 【发布时间】:2013-07-08 02:31:32 【问题描述】:

我需要确保 REST 请求知道谁在执行它。我知道 HMAC 方法,但我不想将客户端私钥存储在我的服务器上。这是我的方法:

    SERVER 为客户端创建私钥和公钥 SERVER 将私钥和客户端 ID 发送给客户端 CLIENT 存储其私钥 SERVER 仅存储公共客户端密钥 CLIENT 通过使用其私钥 (ecryptedData) 加密其客户端 ID 来发出 RESTful 请求,并将 clientID:encryptedData 对发送到 SERVER SERVER 查找给定客户端 ID 的公钥并解密 encryptedData SERVER 检查解密数据是否包含相同的客户端 ID。如果客户端 ID 相同,则服务器信任发送者,否则拒绝请求。

也许这个方法已经存在但我不知道。

这种方法安全吗?

编辑

我重新提出问题:

如果我只关心谁是发送者,而不关心他在单向通信(客户端 -> 服务器)中发送的内容,我可以以这种方式使用 RSA 吗?

一次

    SERVER 为客户端创建 RSA 对密钥 SERVER 存储客户端公钥(我不管密钥是否被盗......它是公开的!) SERVER 将客户端私钥发送给客户端

在客户端 -> 服务器通信期间

    CLIENT 通过其私钥 ex. 加密已知单词 + 时间戳(以防止重放攻击)。签名 = 加密(RSA,'FOO:1234234') CLIENT 发送带有 API KEY 和签名 ex 的消息。 54545345:签名 SERVER 查找给定 API KEY 的公钥 SERVER 使用找到的公钥解密消息 SERVER 检查已知单词 FOO 和时间戳的正确性 如果上一步失败,服务器将拒绝该消息

这种方法安全吗?

非常感谢! 去吧!

【问题讨论】:

架构错误。让服务器生成自己的私钥/公钥(可能是 RSA)并共享公钥。另一方面,要知道谁在调用您的 REST 服务,请尝试签名算法(El Gamal?RSA 签名)。 为什么它是一个糟糕的架构? HMAC 方法也将私钥发送给客户端 假设有 200 个客户端,要生成 200 个不同的 HMAC 密钥,并且在服务器信任发送者之前,每条消息都需要解密。使用 El Gamal,服务器仅生成其密钥对,每个客户端也可以生成自己的密钥对(如果需要)。所以接收者将确定发送者身份检查消息的签名(而不是整个消息)。如果您使用的是 POST/GET/PUT 动词,则需要此模式来确定。对于单向通信,RSA 就足够了。 【参考方案1】:

“SERVER 将客户端私钥发送给客户端”:这似乎不太安全。 如果恶意客户端截获此通信,他们可以获得客户端的私钥并可以发送消息,就好像它们是由实际客户端发送的一样。 您应该让客户端生成两个密钥,而不共享私有密钥。

【讨论】:

好吧,你是对的,但是每个 API 服务提供商都会将私钥发回给客户端(Google、Dropbox、Amazon 等)。除此之外,您认为目标是否足够安全?【参考方案2】:

向用户发送私钥是不安全的。请看下一个方法:

客户端使用您的或开源(第 3 方)SDK(或加密库)生成密钥对(私钥和公钥) - 如果您需要,我可以分享一些很酷的解决方案; 客户端将私钥存储到本地存储中(该密钥可以基于客户端密码); 客户端向您的服务器发送一个请求,其中包含他的公钥和一些关于客户端的附加数据(他的身份、姓名/电子邮件/等)。该请求将使用您服务器的公钥进行加密,并使用客户的私钥进行签名; 服务器解密加密的请求,验证/注册客户端及其公钥和签名。在这里你应该有一些公钥管理(密钥服务)。

在通信步骤,服务器和客户端使用他们的私钥来解密和签署数据/公钥来加密数据和验证签名。

【讨论】:

以上是关于只共享公钥 安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

https的加密机制,怎么加密

X.509:私钥/公钥

为啥 PHP 中有 openssl_public_decrypt?公钥不应该只用于加密吗?

HTTPS 之共享秘钥 公钥 及 私钥

​https提供安全的web通讯

如何为OAuth2 JWT验证共享公钥?