2013-07-10 46 views
1

我需要确保REST请求知道谁在做这件事。我知道HMAC方法,但我不想将客户机私钥存储在我的服务器上。这是我的方法:只分享公钥是否安全?

  1. 服务器会为客户
  2. 服务器发送私有密钥和客户端ID给客户一个私钥和公钥
  3. 客户端存储的私钥
  4. SERVER只存储公钥客户端密钥
  5. 客户端通过使用其私钥(ecryptedData)加密其客户端ID来发出RESTful请求,并将对clientID:encryptedData发送到服务器。SERVER看起来是f或给定客户端ID的公钥并解密已加密的数据。SERVER检查解密后的数据是否包含相同的客户端ID。如果客户端ID相同,则SERVER信任发件人,否则拒绝该请求。

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

这种方法安全吗?

编辑

我重新制定了一个问题:

,如果我只关心谁是关于什么的,他是在单向通信发送发送者,而不是(CLIENT - >服务器),我可以使用RSA以这种方式?

ONE TIME

  1. 服务器创建客户端的RSA密钥对
  2. 服务器存储客户端的公钥(如果该键为stolen..it的公共我没关系!)
  3. 服务器向客户端发送在客户端的私钥对客户

- >服务器的通信

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

这种方法安全吗?

非常感谢!
aGO!

+1

错误的模式。让服务器生成自己的私钥/公钥(也许是RSA)并共享公钥。另一方面,要知道谁在呼叫您的REST服务,请尝试签名算法(El Gamal?RSA Signature)。 –

+0

为什么它是一个错误的模式? HMAC方法也将私钥发送给客户端 – aGO

+0

假设200客户端,200个不同的HMAC密钥生成,并且每个消息需要在服务器信任发件人之前解密。通过El Gamal,服务器只生成其密钥对,每个客户端也可以生成它自己的对(如果需要的话)。所以接收者将确定发送者身份检查消息的签名(而不是整个消息)。如果你使用POST/GET/PUT动词,你需要确定这个模式。对于单向通信RSA就足够了。 –

回答

1

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

+0

好吧,但每个API服务提供商都会将私钥发送回客户端(Google,Dropbox,Amazon等)。除此之外,你认为这个目标足够安全吗? – aGO

相关问题