数据加解密理解



为什么需要加密

防止作弊和保护游戏的公平性: 游戏中存在各种类型的作弊行为,例如修改游戏数据、利用外部工具获得优势等。通过加密游戏数据和通信,可以防止作弊者轻易地篡改游戏状态或获取敏感信息,从而维护游戏的公平性和竞争性。
保护用户隐私和数据安全: 许多游戏要求用户创建账号并提供个人信息。加密可以有效防止信息被未经授权的人员访问、窃取或篡改。此外,加密还可以保护用户的登录凭据和支付信息,防止恶意行为如账号盗窃。
防止游戏内容和资源的盗版和非法分发: 一些游戏内容和资源可能具有商业价值,如游戏地图、音乐、艺术设计等。通过加密这些内容,可以防止盗版和非法分发,确保游戏开发者和权益持有人的利益。

名词解析

哈希函数

将任意长度的数据映射为固定长度的哈希值。哈希函数通常用于验证数据完整性和生成消息摘要,而不是加密和解密数据

常见的哈希函数有:

  1. SHA-256(Secure Hash Algorithm 256-bit):SHA-2系列中的一种常用哈希函数,输出长度为256位。
  2. MD5(Message Digest Algorithm 5):较旧的哈希函数,已经不再推荐用于安全目的
    应用:如密钥散列、数字签名中的消息摘要生成都使用了哈希函数

为何不建议使用MD5

简单来说就是存在漏洞

  1. 0e绕过: 0e开头的字符串在参与比较时,会被当做科学计数法,结果转换为0
    示例
    在这里插入图片描述在这里插入图片描述

  2. 数组绕过: md5不能加密数组,传入数组会报错,但会继续执行并且返回结果为null
    示例

md5(a[]=1) === md5(b[]=1)
//null === null
  1. MD5碰撞: MD5碰撞也叫哈希碰撞,是指两个不同内容的输入,经过散列算法后,得到相同的输出,也就是两个不同的值的散列值相同
    示例
    //待补充

  2. MD5SQL注入: MD5-SQL注入是指在使用MD5哈希算法存储密码或其他敏感信息时,由于对输入数据的不正确处理,导致存在SQL注入漏洞。SQL注入是一种常见的安全漏洞,攻击者可以通过构造恶意的输入数据来执行非授权的SQL查询或篡改数据库内容。

    例如:ffifdyop 的MD5加密结果是 276f722736c95d99e921722cf9ed621c经过MySQL编码后会变成’or’6xxx,使SQL恒成立,相当于万能密码,可以绕过md5()函数的加密

  • 为了增加散列函数的安全性,现在通常推荐使用更强大的散列函数,如SHA-256

彩虹表技术

是一种密码破解技术,用于加速对密码哈希值的破解。它是通过预先计算和存储大量可能的输入与其对应的密码哈希值之间的映射关系,从而在实际破解过程中提供快速查找的能力

盐值

在加密过程中引入的随机值,用于增加密码的安全性和抵抗彩虹表等攻击

加盐示例

假设我们有一个用户的密码是"password",我们希望对该密码进行加盐处理。首先,我们生成一个随机的盐值,例如"abc123"。然后,将盐值与密码进行组合,形成新的字符串"passwordabc123"。最后,对该字符串进行哈希或加密操作,生成最终的加盐密码

local bcrypt = require("bcrypt")

local password = "password"
local salt = bcrypt.salt()  -- 生成随机盐值
local salted_password = password .. salt  -- 将盐值与密码结合

local hashed_password = bcrypt.digest(salted_password)  -- 使用bcrypt进行哈希

print("加盐密码:", hashed_password)

迭代次数

迭代次数是指在密码学中进行加密或散列操作时,重复应用某个算法的次数。迭代次数的增加可以增加加密操作的复杂度和安全性,因为它使攻击者需要更多的计算资源和时间来破解密码

公钥&私钥

  1. 公钥:非对称加密中用于加密的密钥,可以公开分享给其他人。
  2. 私钥:非对称加密中用于解密的密钥,必须保密并由密钥的所有者控制。

令牌

令牌是加密算法中的标识符或参数,用于身份验证或访问控制,在加密过程中,令牌可以用作密钥、盐值或其他加密参数的一部分

证书

在互联网世界中充当公理的机构来签发这个证书,它就是CA机构,它是如今互联网世界正常运作的前提,而CA机构颁发的“身份证”就是数字证书

常见加密算法

对称加密

使用相同的密钥对数据进行加密和解密

常见的对称加密算法

AES(Advanced Encryption Standard)

广泛应用的对称加密算法,支持不同的密钥长度,例如AES-128、AES-192和AES-256。

DES(Data Encryption Standard)

较旧的对称加密算法,已经不再推荐使用。

3DES(Triple Data Encryption Standard)

基于DES的加强版,通过多次执行DES算法来提高安全性。

优点

  • 速度快: 对称加密算法的加密和解密过程相对较快,适合对大量数据进行加密和解密操作。
  • 计算成本低: 对称加密算法的计算成本相对较低,通常在硬件上实现效率更高。
  • 简单性: 对称加密算法的实现较简单,算法的设计和使用相对容易理解和实施。

缺点

  • 缺乏密钥交换机制: 对称加密算法没有内建的密钥交换机制。在通信双方之间安全地交换密钥可能需要使用其他安全协议或方法。
  • 缺乏非对称加密的灵活性: 对称加密无法提供非对称加密算法的灵活性,如数字签名、密钥交换和身份验证等功能。

流程图

在这里插入图片描述

非对称加密

使用一对密钥,即公钥和私钥,进行加密和解密(https常用的加密方式)

常见的非对称加密算法

RSA(Rivest-Shamir-Adleman)

基于大数因子分解的加密算法,常用于密钥交换和数字签名。

ECC(Elliptic Curve Cryptography)

基于椭圆曲线数学问题的加密算法,具有较短的密钥长度和高安全性。

优点

  • 密钥管理相对容易: 非对称加密的密钥管理相对容易,因为公钥可以分发给任何人,而私钥只需要保密在加密方手中。
  • 安全性高: 非对称加密算法的安全性基于复杂的数学问题,如大素数的因数分解或离散对数问题。攻击者很难通过破解算法来获取私钥,因此非对称加密提供了较高的安全性。
  • 提供数字签名和身份验证: 非对称加密可以用于生成数字签名,以验证数据的完整性和身份的真实性。通过使用私钥对数据进行签名,接收方可以使用相应的公钥验证签名的有效性。

缺点

  • 计算成本较高: 非对称加密算法的计算成本较高,比对称加密算法慢得多。对于大量数据的加密和解密操作,使用非对称加密可能会导致性能下降。
  • 密钥长度较长: 非对称加密算法所使用的密钥长度通常较长,这可能导致密钥的存储和传输成本增加。

总结来说:优点就是安全,但缺点就是不够快,比较耗费cpu,如果在游戏中每一次消息都有其加密,游戏中大量数据一般不用这种加密方式

流程图

在这里插入图片描述

密钥散列

它是通过将密码或密钥输入到散列函数中进行处理,生成一个固定长度的散列值(也称为摘要)。密钥散列的目的是将敏感信息转换为固定长度的不可逆的值,以便在存储或传输过程中保护其机密性

密钥散列函数特点

  1. 不可逆性
    密钥散列函数是单向的,即从散列值无法还原出原始的密码或密钥。这意味着即使散列值被泄露,攻击者也难以得到原始的密码或密钥。
  2. 唯一性
    不同的输入会产生不同的散列值。即使原始密码或密钥只有微小的变化,生成的散列值也会完全不同。
  3. 固定长度
    无论输入的密码或密钥长度如何,密钥散列函数都会生成具有固定长度的散列值。常见的密钥散列函数输出的散列值长度为128位、256位或更长。

流程

  1. 输入数据和密钥:将要散列的数据和密钥作为输入提供给密钥散列算法。
  2. 密钥扩展:密钥散列算法会对密钥进行扩展,以便与数据进行组合。这个步骤通常包括密钥的填充和调整,以使其适应散列算法的要求。
  3. 数据与密钥组合:将扩展后的密钥与输入数据进行组合。这个组合的方式可以是简单的拼接、异或运算等,具体取决于算法的设计。
  4. 哈希计算:将组合后的数据输入到哈希函数中进行计算。哈希函数将数据转换为固定长度的散列值。
  5. 输出散列值:算法将计算得到的散列值作为输出结果返回。

应用

密钥散列广泛应用于密码存储和验证、数字证书、身份验证等领域。在密码存储中,通常不会将原始密码存储在数据库中,而是将其散列值存储起来。当用户输入密码进行验证时,系统会将用户输入的密码进行散列运算,然后与存储的散列值进行比较,从而验证密码的正确性。

常用的密钥散列函数

包括MD5(已不推荐使用)、SHA-1(已不推荐使用)、SHA-256等。为了增加密钥散列的安全性,现在通常推荐使用更强大的散列函数,如SHA-256,并结合盐值(Salt)和迭代次数(Iteration)来增加破解的难度。

数字签名

数字签名的工作原理是基于非对称加密算法的数学特性,确保只有拥有私钥的发送方才能正确生成数字签名,而任何人都可以使用公钥验证数字签名。可以确保数据的来源可信,并防止数据在传输过程中被篡改

数字签名的过程

  1. 数据发送方创建数字签名
  • 发送方使用自己的私钥对要发送的数据进行加密,生成数字签名。
  • 数字签名是基于数据内容计算的哈希值,然后使用发送方的私钥进行加密。
  1. 数据接收方验证数字签名
  • 接收方从接收到的数据中提取原始数据内容,并使用相同的哈希函数计算哈希值。
  • 接收方使用发送方的公钥对数字签名进行解密,得到解密后的哈希值。
  • 接收方将计算的哈希值与解密后的哈希值进行比较。若两者一致,说明数据完整性未被篡改。

流程图

在这里插入图片描述

混合加密

混合加密是将对称加密和非对称加密结合使用的方式。在混合加密中,非对称加密算法用于密钥的安全分发和交换,而对称加密算法用于实际数据的加密和解密。这种方式综合了对称加密和非对称加密的优势,既能提供高效的数据加密和解密速度,又能确保密钥的安全性

以HTTPS加密为例

在这里插入图片描述

结合对称加密+非对称加密这两种方式,可以用非对称加密的方式来传输对称加密过程中的密钥,之后就可以采取对称加密的方式来传输数据了

混淆加密

混淆加密是一种将代码或数据进行变形和模糊化的加密方式。它旨在增加对逆向工程和破解的难度,使攻击者难以理解、分析或修改加密的代码或数据。混淆加密通常应用于软件保护和反破解领域

和代码混淆的异同

混淆加密

是指对数据进行加密处理,使其在未经授权的情况下难以理解和解读。混淆加密通常使用各种算法和技术来修改数据的表示形式,使其对外部观察者来说变得模糊、难以破解。混淆加密的目的是增加数据的安全性,防止未经授权的访问者获取敏感信息。

代码混淆

是指对软件代码进行修改和转换,以使其在结构和逻辑上变得更加复杂和难以理解。代码混淆的目的是增加软件的安全性,防止恶意用户对代码进行逆向工程、代码分析和剽窃。代码混淆常使用各种技术和算法,如重命名变量、删除注释、添加无效代码、改变控制流等,使代码的逻辑和结构变得混乱和困难。

  • 尽管混淆加密和代码混淆都涉及对数据或代码进行修改,但它们的目的和应用场景不同。混淆加密主要用于数据加密和保护,而代码混淆主要用于软件代码的安全和保护

dhexchange密钥交换

主要用于通过交换密钥参数,结合dhexchange函数各自生成密钥的方式加密,skynet中云风封装提供的一种加密库类型(crypt)

加密流程

  1. 客户端、服务器各自生成随机的key(clientKey, serverKey、challenge)
  2. 各自通过dhexchange算法换算为转换后的8字节的密钥(cKey、sKey)
  3. 校验时通过dhsecret算法,传入自己生成的随机key和对方的密钥计算出secret
  4. 结合challenge验证各自计算的secret
  5. 开始对称加密传输数据
    在这里插入图片描述
    在这里插入图片描述

流程图

在这里插入图片描述

如何选择加解密方式

1. 安全需求:
首先需要评估不同模块的安全需求。某些模块可能需要更高级别的安全性,而其他模块可能只需要基本的数据保护。根据每个模块的安全需求确定所需的加解密方式。
2. 数据类型:
了解每个模块所处理的数据类型是重要的。一些模块可能处理敏感的用户个人数据,例如用户账号信息或支付数据,而其他模块可能只涉及非敏感的游戏配置数据。根据数据类型选择相应的加解密方式。
3. 加解密算法:
根据安全需求和数据类型,选择适合的加解密算法。常见的加密算法包括对称加密算法(如AES)、非对称加密算法(如RSA)和密钥散列(如SHA-256)。对称加密算法适用于加解密速度要求高的数据,而非对称加密算法适用于密钥交换和数字签名等场景。
4. 性能要求:
考虑每个模块的性能要求。某些模块可能对低延迟和高吞吐量有更高的需求,而其他模块可能对性能要求较低。选择加解密方式时需要权衡安全性与性能之间的平衡

游戏中的加密示例解析

登录验证

基于md5算法,使用对称加密方式

  1. 生成密钥,通知客户端,并记录到redis
    在这里插入图片描述
  2. 玩家登录时,通过客户端传入的密钥进行校验
    在这里插入图片描述
    在这里插入图片描述
  3. 通过则进行后续流程

充值相关

基于SHA256算法,使用数字签名的加解密方式

验签流程

  1. 对参与RSA签名的参数按ASCII 字典升序排序后,参数之间用&符号连接最后组成 key0=&key1=value1&key2=value2…keyn=valuen。
    空值也要进行签名如参数 key0
  2. 用平台提供的RSA公钥进行sha256签名

流程图

在这里插入图片描述

回调验签部分示例

在这里插入图片描述

游戏中哪些模块需要加密

  1. 网络通信模块:
    游戏中的网络通信通常需要进行加密来确保数据的安全传输。加密网络通信可以防止数据被截获或篡改,保护玩家的隐私和游戏的完整性。
  2. 存档和配置文件模块:
    游戏通常需要保存玩家的存档数据和配置文件。为了保护这些敏感信息不被篡改或泄露,可以对存档和配置文件进行加密。加密存档和配置文件可以防止未经授权的访问和修改,确保数据的完整性和安全性。
  3. 授权和许可模块:
    通常需要对游戏进行授权和许可管理,以确保只有经过购买或授权的用户可以访问游戏内容。在这种情况下,加密可以用于生成和验证许可证或安全令牌,防止未经授权的用户使用游戏,例如登录验证相关功能。
  4. 付款和交易模块:
    对于在线游戏或游戏内购买,通过使用加密算法和安全协议,可以确保付款和交易数据的机密性和完整性,防止信息泄露和欺诈行为。

破解

对称加密破解

在这里插入图片描述

非对称加密破解

  1. 在第一步服务器发送明文给客户端传输公钥的时候,中间人可以截获服务器公钥,之后中间人将自己的公钥冒充服务器的公钥传输给客户端
  2. 客户端用中间人的公钥来加密自己生成的密钥,将其加密发送给服务器,此时中间人可将此密钥截取,并使用自己的私钥解密获得密钥,最后中间人再对这吧密钥用之前的服务器公钥进行加密,再发给服务器
  3. 整个过程客户端和服务器感知不到第三方截取,但其密钥已泄露

在这里插入图片描述

加解密常见问题

1. 为什么说数字签名不具备保密性?
答:数字签名的过程中,公钥和签名都是公开的,任何人都可以获取和验证签名,因此数字签名并不能保证消息的保密性。它的主要作用是防止消息被篡改和伪造,而不是保护消息内容的机密性
2. SHA-1和SHA-256有何区别?
答:SHA-1是SHA家族中的一种哈希函数,它产生的哈希值长度为160位(20字节)。SHA-1广泛用于数据完整性校验、数字签名等应用中。然而,由于SHA-1存在一些安全性上的弱点,例如碰撞攻击,因此在安全性要求较高的场景中,不再推荐使用SHA-1;SHA-256是SHA家族中的另一种哈希函数,它产生的哈希值长度为256位(32字节)。相对于SHA-1,SHA-256提供了更高的安全性和更大的哈希值空间,使得碰撞攻击等攻击更为困难。SHA-256常用于密码学、数字证书、区块链等领域

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值