我的加密消息设计是否安全?

时间:2013-12-13 02:42:32

标签: api security encryption rsa

我目前正在开发一个Web API。我需要确保从客户端发送到服务器的消息足够安全(无法修改,攻击者读取并能够识别客户端)。

我这里有初步设计。它足够安全吗?

我决定使用PKI。那是, 服务器和客户端都有一组RSA公钥和私钥。 服务器还有一个数据库来存储客户端ID及其公钥。

在客户端和服务器通信之前,他们使用diffie-hellman密钥交换建立会话密钥。在diffle-hellman中使用的“秘密”是私钥。发送的邮件将由发件人的私钥加密。因此,接收方可以使用发送方的公钥来识别发送方,并防止中间人攻击。然后建立会话密钥K.

然后客户端向服务器发送消息: 客户端发送:客户端ID,E(K,消息),H(K,E(消息),ClientID) 其中H()是SHA256的哈希函数。

当服务器收到消息时,它会计算H(K,E(消息),ClientID)并将其与收到的HMAC进行比较。如果它们相同,则应该保护该消息。

我知道我的设计无法阻止重播攻击。但我现在不考虑这个问题。我的设计足够安全吗?任何评论将不胜感激。非常感谢!

1 个答案:

答案 0 :(得分:0)

就像你写的那样,我想到的第一件事就是重播攻击。您可以通过向消息添加时间戳或计数器来防止它(这样每两条消息都不同)。

此外,请注意您仍然需要担心如何分发公钥。 如果您是通过Internet进行的,那么没有证书颁发机构(CA) - 当您尝试获取公钥时,您可能会遇到MitM攻击!

获取一些真实密钥的问题至关重要,在我看来 - 这是SSL要处理的主要问题(它使用CA来实现)。给出真正的对称密钥的加密和认证很容易! (使用加密和MAC)

其他事项: 什么是H?哈希函数还是HMAC?两者都是不同的东西!

您写道:H(K,E(消息),ClientID)。如果您将H称为MAC(MAC有密钥)而K是密钥,则最好使用不同的密钥进行MAC和加密。如果不是 - 我认为你不应该在你的密钥上发送哈希/ MAC。

最后两件事:

  1. 有人可以多次联系服务器(每次都是新客户端)并导致DoS攻击。

  2. 为什么要保存客户端的公钥?在第一个(希望是安全的)连接中,服务器首先知道客户端,您可以创建对称密钥并保存它!它更短,效率更高。