使用Mcrypt和PHP防止使用HTTP GET参数的公钥/私钥加密进行重放攻击

时间:2013-04-21 16:07:56

标签: php http mcrypt replay

我想创建一个游戏应用程序,因为我希望客户端发送到服务器分数和其他应加密的信息。

我知道mcrypt有一种方法可以使用公钥和私钥加密数据。所以客户端的应用程序将加密,但我是唯一能够解密它的人。我没有更多的信息可以继续,我只是想知道最安全的粘贴数据的方法。

到目前为止我所理解的是这个例子:

如果我有:?username=foo&score=50&msg=hello
我可以将其加密为:msgencrypted=fgus9g8uywe978ygt7923y5235sdfdsadfsd(示例)

并且只有我在服务器上的特定密钥才能解密它。

我再次尝试找到隐藏用户数据的最佳方法,这样他就无法对其进行解密。

这意味着如果我加密了一条消息......该消息将无法发送两次。

因此,如果用户使用firebug查看发送的请求并尝试再次发送请求,则该消息将无效。我想我可以把它记录在数据库中。但如果有这样一种方法,那就太好了。

我使用的是PHP 5.4。

1 个答案:

答案 0 :(得分:0)

您应该使用PKI (public key infrastructure)。公钥加密(AKA非对称加密)是指一种加密算法,它需要两个单独的密钥(一个密钥对),其中一个是秘密的(或私有的),其中一个是公钥。

您的客户端可以使用公钥访问公钥并加密消息,只有可以访问私钥的服务器才能解密该消息。 假设您可以使用RSA算法加密分数和其他信息并将其发送到服务器。这样就可以阻止parameter-tampering。您也可以使用MAC (Message Authentication Code)来防止篡改。

但我建议POST数据而不是使用GET;因为通常URL将记录在Web服务器或ISP中。因此,不将保密的加密数据放入查询字符串中是合理的。

为防止重放攻击,您可以使用计数器并沿参数发送。在服务器端,您存储最后一个计数器的值(例如123)。当您收到其计数器值等于或小于存储值的请求时,您必须拒绝该请求。例如当您收到计数器值

实际上,POS终端使用类似的方法来防止重放攻击。如果您想要更高级别的安全性,请尝试阅读有关POS交易安全性以及如何保护交易免受重播/中间人攻击。