1

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

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

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

这种方法安全吗?

编辑

我重新提出这个问题:

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

一度

  1. SERVER 为客户端创建 RSA 对密钥
  2. SERVER 存储客户端公钥(如果密钥被盗,我无关紧要......它是公开的!)
  3. SERVER 将客户端私钥发送给客户端

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

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

这种方法安全吗?

非常感谢!
前!

4

2 回答 2

1

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

于 2013-07-11T08:04:14.920 回答
0

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

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

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

于 2018-08-28T08:10:25.260 回答