非对称加密算法 是什么自己搜索一下,这篇文章就不讲解了。
在游戏数据传输中,数据肯定是要加密的,否则如果被抓包工具抓取,模拟提交数据,这个工具就成了这个游戏的外挂了。
怎么来防范这种攻击呢?
简单的来说,发包的时候数据采取加密措施,服务器端再解密。
有点同学可能会说,如果反编译客户端的代码
1.可以看到密钥
2.可以看到原始数据加密前调用的方法
这样,就可以先调用密钥来解密,然后修改原始数据,再加密打包发送。
对于这种情况完全没有办法。只能给客户端程序加壳,让破解的人无法轻易脱壳破解。
但是这些加壳的工具也是人写出来的,可能也会有被破解的一天,这就是为啥在牛的软件都有可能会有外挂。
当然你不用自己去研究如果给软件加壳,花钱购买是最简洁的方法,起码不会那么轻易被破解。
言归正传
如果你使用的是常用的对称加密算法,如AES加密,如果破解者知道了密钥 只需要试试AES解密方式就可以看到你的原始数据。
看到原始数据就可以修改数据后再调用AES加密,然后发送给服务器端。→外挂产生O(∩_∩)O~
这么做很简单,所以在这里我们不能使用对称加密算法。
非对称加密算法的公钥和密钥是不同的
客户端使用的是公钥
服务器端使用的密钥
也就是说,在客户端抓包获取的是公钥加密后的数据,即使知道了公钥,但是你没有密钥是无法解密的(密钥在服务器上)。
从这点上来说还是相对安全的。
原始数据是安全的,后面就好办了。这意味着破解者无法看到原始数据的数据结构及提交的内容。
这篇文章里面提到了
时间戳,
为了防止“攻击者将游戏数据包拦截后对服务器进行延迟再发”的重放攻击,还应在封包内加入必要的时间戳TS(time starnp)
当破解者无法获取原始数据的时候,重复的提交当前数据包的请求也会提交成功。
因为数据格式完全正确,数据内容也正确。
所以我们要对当前数据包做时效性的处理,一个数据包只有在规定时间范围内有效,超时即为无效,自动丢弃。