由于网络游戏需要客户端与服务器通过公共网络通信,假如通信的消息没有经过加密,就像我们晚上睡觉没有关窗户似的,你的信息会被第三方一揽无余,就可以被第三方通过技术手段方便的查询传内容及修改,伪造传输内容,破坏正常的游戏规则,导致用户流失。
    常见的加密算法有两大类:

    1. 对称加密算法,例如:DES、3DES、AES、TDEA、Blowfish、RC2等,目前最常用的是AES
    2. 非对称加密算法,例如:RSA,ECC,SM2(国产算法)

    但是在实例使用中,这两类算法各有自己的优缺点:
    对称加密算法的优点是:加密内容多,加密速度快,缺点是,加解密使用的密钥必须是同一个,密钥同步不安全
    非对称加密算法的优点是:有两对密钥,一个是私钥,一个是公钥,公钥可以对外公开,公钥加密的数据,只有对应的私钥可以解密 ,缺点是加密的效率比较低,单次加密大小也有限制,特别是加密大数据时,还需要分段加密。
    如果单独使用其中的一种加密方式,效率与优点总是不能兼顾,所以人们想了一个办法,即这两个算法同时使用,优势互补。我们先来看一下HTTPS是怎么利用这一点的。
    image.png
    相对于http来说,https多了一层SSL,https的数据就是在这一层完成的加密和解密操作。一个简单的握手过程(对称密钥同步)过程是这样的:
    image.png
    上图中的主密钥就是对称加密密钥,这个对称密钥是客户端生成的,这样可以保证每个客户端使用的公钥是不一样的。后面再通信的过程中,通信的信息就会使用这个密钥,用对称算法加密和解密。

    在网络游戏中,一般我们使用的是长连接,是自定义的协议格式,所以不能直接使用https的标准协议方式进行通信加解密,但是我们可以参考https的实现方式,将我们自定义的协议内容加密。步骤如下:

    1. 客户端与服务器首先创建长连接
    2. 用户登陆之后,对连接进行认证,认证通过之后保持长连接,如果认证不通过,直接断开连接
    3. 然后客户端以明文的方式向服务器获取服务器的非对称加密的公钥
    4. 客户端生成对称加密的密钥,将对称密钥使用服务器的公钥加密,生成一个数字信封。
    5. 将数字信封通过长连接发送到服务器,服务器使用私钥解密数字信封,获取客户端的对称加密密钥
    6. 服务端将解密得到的对称加密密钥与当前长连接绑定,后面这个长连接的通信,都使用这个对称密钥进行加解密

    当然这里面的对称加密公钥也可以由服务器生成,在用户连接认证连接成功之后,直接返回。我在我的这个单服游戏服务器框架中,也实现了这个流程,有兴趣的可以参考一下:https://gitee.com/wgslucky/xinyue-alone-game-server
    我们也可以根据业务的需要,选择对某些不重要但数据又比较多的接口不加密,以提升通信的效率。