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


Prevent replay attacks with Public/Private Key-Encryption of HTTP GET Parameters using Mcrypt and PHP

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

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

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

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

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

我只是想找到最好的方法来隐藏数据,使用户无法解密。

这意味着如果我加密了一条消息…这条消息不能发送两次。

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

您应该使用PKI(公钥基础设施)。公钥密码学(又称非对称密码学)是指需要两个独立密钥(密钥对)的加密算法,其中一个是秘密(或私有)密钥,另一个是公钥。

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

但是我建议POST数据而不是使用GET;因为通常url将被登录到web服务器或互联网服务提供商。因此,不将机密加密数据放在查询字符串中是合理的。

为了防止重放攻击,您可以使用计数器并将其沿参数发送。在服务器端存储最后一个计数器的值(例如123)。当您获得一个请求,其计数器值等于或小于存储值时,您必须拒绝该请求。例如,当你得到一个计数器值<=123的请求。因为你加密了所有的参数,没有人可以篡改计数器的值。

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