仅共享公钥是安全的吗?

时间:2013-07-10 08:36:14

标签: security restful-authentication

我需要确保知道谁在做这件事的REST请求。我知道HMAC方法,但我不希望不将客户端私钥存储在我的服务器上。这是我的方法:

  1. SERVER为客户端
  2. 创建私钥和公钥
  3. SERVER将私钥和客户端ID发送给客户端
  4. CLIENT存储其私钥
  5. SERVER仅存储公共客户端密钥
  6. CLIENT通过使用其私钥(ecryptedData)加密其客户端ID并发送对clientID:encryptedData到SERVER
  7. 来发出RESTful请求
  8. SERVER查找给定客户端ID的公钥并解密encryptedData
  9. SERVER检查解密数据是否包含相同的客户端ID。如果客户端ID相同,则SERVER信任发件人,否则拒绝该请求。
  10. 也许这种方法已经存在,但我不知道。

    这种方法安全吗?

    修改

    我重新提出问题:

    如果我只关心谁是发送者而不关心他在单向通信(CLIENT - > SERVER)中发送的内容,我可以这样使用RSA吗?

    一次

    1. SERVER为客户端
    2. 创建RSA对密钥
    3. SERVER存储客户端公钥(如果密钥被盗,我无所谓......公开!)
    4. SERVER将客户端私钥发送到客户端
    5. 在客户期间 - >服务器通信

      1. CLIENT通过其私钥ex加密已知字+时间戳(以防止重放攻击)。 SIGNATURE =加密(RSA,'FOO:1234234')
      2. CLIENT使用API​​ KEY和singature ex发送消息。 54545345:SIGNATURE
      3. SERVER查找给定API KEY的公钥
      4. SERVER使用找到的公钥解密邮件
      5. SERVER检查已知单词FOO和时间戳
      6. 的正确性
      7. SERVER在上一步失败时拒绝该消息
      8. 这种方法安全吗?

        非常感谢!
        前!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

向用户发送私钥并不安全。请查看下一种方法:

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

在通信步骤中,服务器和客户端使用其私钥对数据进行解密和签名,使用公钥对数据进行加密和验证签名。