天下,最贵的就是免费的,因为不会珍惜。
在之前有关游戏服务器通信的系列文章中,我们已经谈过了数据序列化、通信连接选型的问题,今天继续谈谈 游戏通信安全与加解密 :
在游戏服务器通信中,安全防护是一个非常重要的问题,由于游戏中交互方式很多,协议也很多,如果不做安全防护措施,纯裸奔,很容易被外挂抓住漏洞,获得不当收益。
加解密技术是一种经典的通信安全措施。加解密技术的背景可以追溯到人类通信的早期阶段。在信息传递的过程中,人们一直试图保护其内容不被未经授权的人获取。随着时间的推移,通信媒介的发展和技术的进步,加解密技术也逐渐演变和成熟。
随着互联网的广泛应用,人们开始意识到通信安全的重要性。加密技术成为保护在线通信、电子商务和数据传输的关键措施。
一、常用加解密方法
先来看看常用的加解密方式有哪些。
hash 摘要
哈希算法,可以对任意长度的报文计算出固定长度的摘要,俗称哈希值。哈希值相对于原文来说要简短的多,往往只有十几或者几十个字节,因此也称为摘要算法:
js
哈希算法(信息或文件) = 摘要 或 哈希值
这个计算过程理论上是单向不可逆的:从报文可以计算出摘要,但是从摘要无法逆向计算出原始的报文。
知名的哈希算法有 md5、sha-1、sha-2 等。
哈希算法的一个重要应用就是加密密码,加密后的密码无法被逆向反推,从而达到受保护的目的。在校验密码时,我们只需要比对哈希后的值,而不需要知道原始的密码。
此外,哈希算法还可以用来校验完整性。例如很长一段信息或者下载获得一份文件,怎么能保证就是原始的信息或者文件呢?我们只需要对比传输前后信息的哈希值或者下载文件和原始文件的哈希值即可确定是否完整。
加解密方式
加解密的过程和上面所说的哈希过程(无法解密)是不同的,加解密更多得应用在通信领域,因为通信双方只有将密文还原成明文才有意义。
加解密在计算的过程中需要提供一种称为密钥的参数。密钥又可以分为加密密钥和解密密钥:
js
加密算法(明文, 加密密钥) = 密文
解密算法(密文, 解密密钥) = 明文
如果加密密钥 == 解密密钥,则称为对称加密算法
如果加密密钥 != 解密密钥,则称为非对称加密算法
对称加密
对称密钥加密(Symmetric-key algorithm)又称为对称加密、私钥加密、共享密钥加密,是密码学中的一类加密 算法。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。
常见的对称加密算法有 Base64、XOR、AES、RC4 等。
我们可以看下 openssl 命令下支持的对称加密方式
额外提一句,Base64 编码在 web 编程中比较常用,可以简单的加密和解密,对安全性要求不高的可以使用。该加密算法不需要密钥,可以视为一种特殊的对称加密。
非对称加密
非对称加密算法使用两把完全不同但又是完全匹配的一对钥匙:公钥和私钥。
在使用不对称加密算法时,只有使用匹配的一对公钥和私钥,才能完成对明文的加密和解密过程。这对于对称加密算法来说,又安全了一步。
除了加解密之外,非对称算法还可以用于数字签名,数字签名是一种用于验证对方身份的技术。
具体使用时,遵循以下规则
- 加密应用,使用公钥加密,私钥解密
- 签名应用,使用私钥签名,公钥验证
不同加解密方法的特点
对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。缺点主要就是密钥需要双方都有,如果密钥被窃取,那么加密就会被第三方破解,特别是游戏中,密钥如果存放在客户端中,容易被破解反编译到。
非对称加密算法,优点就是安全,但缺点就是不够快,比较耗费cpu,如果在游戏中每一次消息都对其加密,对cpu的消耗还是挺高的,所以游戏中一般不用这种加密方式。
这种一般用在支付宝,微信等支付渠道的支付回调等偏一次性通信的验证上。对于通信双方来说,对称加密算法又安全了一步,也是目前https常用的加密方式。
公钥可以分配和暴露给所有想要访问的请求者,但私钥一定牢牢的掌握在服务器这边,如此对通信来说,安全性有保证。常用的非对称加密算法有:RSA, DSA, ECC等。
二、游戏加密方案
前面我们已经介绍了对称解密算法和非对称加密算法,那在游戏协议通信中应该如何选择加密方式呢?
那我们看看下列几个方案:
- 单独使用对称加密算法。典型的对称加密算法如 AES 安全性已经不错,而且加密效率高,似乎可以直接拿来使用。但问题是客户端和服务器交互时如何交换密钥?如果直接明文传输,肯定会有被嗅探的风险。所以单独使用对称加密算法存在密钥的管理问题,是不可行的。
- 单独使用非对称加密算法。非对称加密算法基于未解决的数学难题,因此在破解上几乎不可能。其优点就是安全,但缺点就是不够快,比较耗费cpu,如果在游戏中每一次消息都用其加密,通信性能较低,对于游戏这种对实时性和延迟比较敏感的应用来说不太适合。
在成年人的世界,面对选择,方法也很简单。一种折中的办法是:采用密钥交换算法来传递对称加密算法的密钥,然后用对称加密算法加密协议数据。
所谓密钥交换,通俗地说,即使有攻击者在偷窥你与服务器的网络传输,客户端(client)依然可以利用"密钥协商机制"与服务器端(server)协商出一个用来加密应用层数据的密钥(也称"会话密钥")。
那么如何进行安全的密钥交换呢?
-
一种方案是使用非对称加密算法。原理是通信一方首先生成密钥对,私钥自己保存,然后将公钥发送给另外一方;另一方拿到公钥后,随机生成一个对称加密的密钥,然后利用公钥加密它;再把加密结果发给对方,对方用私钥解密;于是双方都得到了会话密钥。 后续通信就使用该密钥进行对称加解密。例如早期的 SSLv2只支持一种密钥协商方式,就是 基于RSA 非对称加密算法的密钥协商机制。
-
第二种方案是使用专用的密钥交换算法,如 DH(Diffie-Hellman) 法及其改进型 ECDH算法。DH 算法使用对方发送的公钥以及自己的私钥进行计算,可以得到一个相同的共享密钥,也就是后续对称加密算法的密钥。之所以能计算出同一个密钥,主要是基于数学上的一个特性,即指数运算的交换律,具体的过程需要比较复杂的数学公式推导,这里就先略过了。
-
还有一种方案就是基于 PSK的密钥协商。PSK 全称Pre-Shared Key,顾名思义,就是预先让通讯双方共享一些密钥(通常是对称加密的密钥)。所谓的预先,就是说,这些密钥在 TLS 连接尚未建立之前,就已经部署在通讯双方的系统内了。其具体步骤是在通讯之前,通讯双方已经预先部署了若干个共享的密钥。为了标识多个密钥,给每一个密钥定义一个唯一的 ID。协商的过程很简单:客户端把自己选好的密钥的 ID 告诉服务端。如果服务端在自己的密钥池子中找到这个 ID,就用对应的密钥与客户端通讯;否则就报错并中断连接。
最后一种方式考虑到所有会话都使用这些固定的密钥,安全性相对不足,比较少用到。我们只看前两种方式。
密钥传递:
- 使用 RSA 或者 ECC 来传递对称加密的密钥
- 使用 DH 密钥交换算法来交换密钥
这里再额外提一点,上面说的密钥传递算法,并不能防止中间人攻击。如果要避免中间人攻击,还需要额外的身份验证措施。但是这势必会带来更多的成本,我所接触的游戏还没有在这方面有特别的措施。
三、存储加密方案
除了前面说的游戏通信协议的加解密,部分玩家的存储数据也需要加密。
如果游戏涉及账号系统,不可避免的要存储玩家的密码。当然,作为玩家的绝对隐私,秘密是不能明文存储的,必须加密,可以有效避免被内部人员查询到。
账号密码的加密就要用到前面说的 Hash 算法。
hash 加密,虽然不可逆,但是还可以通过暴力破解方法来破解,如简单的hash加密容易被彩虹表破解。
可以采用加盐、多次HASH等方法加强,这样可以在一定程度上增加破解难度。常见的方式也是发送方和接受方,维护一个盐池,加密和解密的时候加上这一段盐池来进行hash,服务器在存储的时候同时存储摘要和盐。
具体过程如下:
还有一些比较私密的数据,如玩家的聊天记录(尤其是私聊)、设备ID 等理论上也应该加密存储,不过这个可能就要用对称加解密算法来加密和还原到客户端。
四、Https 的使用
前面讨论的游戏通信加解密方案主要用于 TCP、UDP 等数据报文的加解密。
正如之前的文章中提到的,游戏中也经常有一些通信可以通过 http 协议来完成,如账号登录、排队、拉取排行榜数据等。http 1.1 协议是明文的文本协议,自然不能直接使用,因此 https 一般是作为标配的。
https 非常强大,其使用的方案也和我们之前讨论的比较一致:先用密钥交换算法来交换通信密钥,之后的加解密都是用这个密钥来做的。
除此之外,https 协议还加入了数字证书来做身份验证(最严格的是双向数字验证),避免了中间人攻击的风险。
五、DDOS 攻击防护
游戏也经常会遭遇 DDos攻击的威胁。
分布式拒绝服务(Distributed Denial of Service,简称DDoS)是指将多台计算机联合起来作为攻击平台,通过远程连接,利用恶意程序对一个或多个目标发起DDoS攻击,消耗目标服务器性能或网络带宽,从而造成服务器无法正常地提供服务。
在游戏行业,通常也存在恶性竞争,竞争对手可能会通过DDoS攻击恶意攻击你的服务,从而在行业竞争中获取优势。例如:某游戏业务遭受了DDoS攻击,游戏玩家数量锐减,导致该游戏业务几天内迅速彻底下线。
我们的一个海外游戏业务就曾经遭遇了对特定域名的 ddos 攻击。通常的解决方法就是留一些备用的 LB 地址,如果遇到攻击则停用原先的 LB 地址,将域名解析到备用的 IP 地址。
很多云厂商也提供基础的 ddos 防护,也有更高级 DDos 高防包,但是价格可能也比较贵一些,一般在游戏公测的前一段时间开启高防是划算的。
作者:我是码财小子,会点编程代码,懂些投资理财;期待你的关注,不要错过我后续的文章更新。