第一部分 概述

数据加解密算法是信息安全领域的重要组成部分,它们用于保护数据的机密性、完整性和真实性。在实际应用中,综合使用数据加解密算法以构建多层次的安全防护体系。例如,HTTPS协议结合了对称加密(如AES)用于快速数据传输加密,以及非对称加密(如RSA)用于安全地交换对称密钥。同时,使用摘要算法确保数据完整性,并通过数字签名验证消息来源的合法性。这种组合方式既解决了数据的机密性问题,又保障了通信的完整性和认证性,是现代网络安全架构的基石。

算法分类

作用

使用场景

解决的问题

第二部分 随机数生成算法

随机数生成算法是指用于生成看似随机数列的一系列算法,这些数列虽然在计算机中被称为“伪随机数”,因为它们实际上是通过确定性的算法计算出来的,但它们在统计特性上足够接近真正的随机性,从而适用于多种应用场景。计算机生成的随机数依赖于初始种子值,一个好的种子来源(如系统时间、硬件噪声等)能够增加随机数序列的不可预测性。

使用场景

解决的问题

代表性算法

2.1 SHA-1 PRNG(伪随机数生成器)

SHA-1 PRNGPseudorandom Number Generator)是一种基于SHA-1哈希算法的伪随机数生成器。它使用 SHA-1算法对种子值进行哈希,并使用哈希结果生成伪随机数序列。

特点

示例代码

在上述示例代码中,使用SHA1PRNG生成随机字节数组,然后将其转换为十六进制字符串后输出,运行并观察控制台输出:

默认情况下,使用SHA1PRNG算法生成的数据都是随机的,重复执行上述的示例代码,每次生成的数据都是不同的,这是因为生成随机数的种子是变化的,如果对其设置一个固定的种子数据,同一个SecureRandom对象可以生成不同的随机数据,但是使用相同的种子重新创建SecureRandom对象后,生成的数据是一致的,即固定种子的随机数生成序列是固定的。

运行调整后的示例代码,观察控制台输出可以看出固定种子后的数据变化。

第三部分 信息编码算法

信息编码算法是将信息(包括文本、图像、音频、视频等)转换成适合存储、处理、传输的数字形式的过程。编码的目标在于有效地利用有限的资源(如带宽、存储空间)并确保信息的完整性、安全性和高效性。编码不仅仅是简单的二进制转换,还涉及到数据压缩、错误检测与纠正、安全性增强等多个方面。

使用场景

解决的问题

代表性算法

3.1 URL编码

URL编码是一种将URL中的特殊字符转换为可安全传输的ASCII字符串的方法。它将非 ASCII字符和特殊字符转换成%后跟两位十六进制数字的形式,以便在URL中进行传输。

使用场景

示例代码

运行并观察控制台输出:

3.2 Base32编码

Base32是一种基于32个字符的编码方式,用于将二进制数据转换为可打印的ASCII字符串。它将每5个比特的二进制数据转换为一个字符,因此每个字符表示32种可能性,Base32字符集通常由大写字母A-Z和数字2-7组成。

特点

使用场景

示例代码

Base32使用commons-codec提供的实现。

运行并观察控制台输出:

3.3 Base62编码

Base62编码是一种基于62个字符的编码方式,用于将二进制数据转换为可打印的ASCII字符串。它将每6个比特的二进制数据转换为一个字符,因此每个字符表示62种可能性,Base62字符集通常由大小写字母A-Z和数字0-9组成,共62个字符。。

特点

使用场景

示例代码

Base62使用hutool提供的实现。

Go语言中未提供base62实现,可使用如下自定义实现。

上述实现摘自https://github.com/deatil/go-encoding/blob/main/base62/base62.go

运行并观察控制台输出:

3.4 Base64编码

Base64编码是一种将二进制数据转换为可打印ASCII字符串的编码方式。它将每6个比特的输入数据转换为一个可打印字符,以便于传输和存储,Base64字符集通常由大小写字母A-Za-z、数字0-9和两个额外的字符(通常是+/)组成,共64个字符。

特点

使用场景

示例代码

运行并观察控制台输出:

提示

上述示例中使用的是标准的Base64模式,除了标准的Base64编码模式外,还有一些常见的变体模式,包括URL安全模式、MIME类型模式和无填充模式。这些模式在编码过程中会对字符集、填充方式等进行调整,以适应不同的使用场景。以下是它们之间的区别:

这些变体模式在编码和解码过程中的基本原理与标准的Base64编码相同,只是在字符集和填充方式上有所不同,以适应不同的使用场景。

3.5 十六进制编码

十六进制编码是一种将数据转换为十六进制表示的编码方式。它将数据中的每个字节转换为两位十六进制数字表示,以便于传输和存储。在十六进制编码中,每个字节的高四位和低四位分别转换为对应的十六进制数字,例如,字节值0xAB被表示为AB

特点

使用场景

示例代码

运行并观察控制台输出:

第四部分 摘要运算算法(哈希算法)

哈希算法,也称为散列函数或摘要算法,是一种将任意长度的输入数据(消息)映射为固定长度输出值(哈希值或摘要)的数学函数。哈希值通常较小,具有以下特性:输入敏感性(即使是微小的输入变化也会导致哈希值的巨大不同)、不可逆性(从哈希值很难或几乎不可能复原原始输入数据)、确定性(相同输入总是产生相同输出)、高效性(计算速度快)。哈希算法在设计上应尽量避免冲突,即不同的输入产生相同的输出(哈希碰撞),但实际上完全避免碰撞在数学上是不可能的,只能尽量降低其发生的概率。

使用场景

解决的问题

代表性算法

4.1 MD5

MD5Message Digest Algorithm 5)是一种常用的哈希算法,用于产生消息摘要。它将任意长度的消息作为输入,经过一系列操作生成固定长度(128比特或16字节)的哈希值。MD5算法的核心原理是将输入的消息按照一定的规则分成若干个块,并对每个块进行一系列的位操作和模运算,最终生成一个128比特(16字节)的哈希值。MD5算法的设计是为了保证输入消息的微小变化会导致输出哈希值的大幅度变化,从而提高了哈希值的唯一性。

特点

使用场景

示例代码

运行并观察控制台输出:

4.2 SHA

SHA(安全哈希算法)是一组密码哈希函数,用于产生消息的哈希值。SHA算法家族包括了多个版本,如SHA-1SHA-256SHA-512等,它们都是在输入数据上执行相似操作但输出长度不同的哈希函数。SHA算法基于密集型的位操作、逻辑运算和模运算。它将输入数据按照一定的方式分块,然后对每个块进行一系列的位运算和置换,最终产生一个固定长度的哈希值。

特点

使用场景

示例代码

运行并观察控制台输出:

4.3 SM3

SM3是中国国家密码管理局(中国密码学会)制定的一种密码哈希算法,用于产生消息的哈希值。它是中国政府采用的国家密码算法标准之一,具有自主知识产权。SM3算法基于分组密码结构,采用了类似于SHA-256的分组运算、置换运算和轮函数等步骤,但在设计上有一些独特之处。它将消息按照一定的规则分组,然后对每个分组进行一系列的位运算和置换操作,最终生成一个256位(32字节)的哈希值。

特点

使用场景

示例代码

Java默认未提供SM3实现,示例代码依赖bouncycastle

Go默认未提供SM3实现,示例代码依赖github.com/tjfoc/gmsm/sm3

运行并观察控制台输出:

第五部分 消息认证码

消息认证码通常使用对称密钥加密算法,如HMAC(基于哈希的消息认证码)或CMACCipher-based MAC)。消息认证码通常用于保护数据的完整性,防止篡改和伪造攻击。它可以确保消息在传输过程中没有被篡改或伪造,并且只有知道密钥的合法用户才能够验证消息的真实性。

使用场景

解决的问题

代表性算法

5.1 HMAC

HMAC(基于哈希的消息认证码)是一种用于验证消息完整性和真实性的密码学算法。它结合了哈希函数和密钥,用于生成一个固定长度的认证码,以确保消息的完整性和真实性。HMAC算法基于哈希函数和密钥的组合。它将消息和密钥作为输入,通过一系列的哈希计算生成一个固定长度的认证码。在计算过程中,消息被与一个内部的固定值(称为ipad)进行异或操作,然后再与另一个内部固定值(称为opad)进行连接,并且再次进行哈希计算,最终生成认证码。

特点

使用场景

示例代码

运行并观察控制台输出:

相关信息

消息认证码(Message Authentication Code, MAC)算法与摘要运算(通常指的是哈希函数或散列函数)在表面上可能看起来相似,因为它们都从输入数据产生固定长度的输出,但实际上它们的设计目标和应用场景有所不同:

消息认证码(MAC)算法

摘要运算(哈希函数)

MAC是带有密钥的,提供消息认证和完整性检查,适合于需要验证消息来源的场景。哈希函数是无密钥的,仅提供完整性校验,不涉及认证,适用于不需要识别发送方身份的情景,如文件完整性验证。两者虽都能检验数据完整性,但MAC通过密钥的加入,额外提供了认证功能,这是它们之间最本质的区别。

第六部分 对称加密算法

对称加密算法是一种加密和解密过程使用相同密钥的加密技术。这意味着发送方和接收方必须事先共享同一把密钥,并且在保密的前提下保存好这把密钥。加密时,发送方使用该密钥将明文(即未加密的信息)转换为密文(即加密后的信息);解密时,接收方再利用相同的密钥将密文还原回明文。由于加解密使用的是相同的密钥,这类算法也被称作“秘密密钥算法”或“共享密钥算法”。

使用场景

解决的问题

代表性算法

6.1 异或加密

异或加密是一种简单而古老的加密技术,也称为异或运算加密。它使用异或运算对明文和密钥进行位级别的操作,以生成密文。异或加密的原理非常简单,就是对明文和密钥的每一个比特进行异或运算。异或运算的规则是:如果两个比特相同,则结果为0;如果两个比特不同,则结果为 1。因此,当明文和密钥进行异或运算时,可以得到密文。

特点

使用场景

示例代码

运行并观察控制台输出:

6.2 AES

AESAdvanced Encryption Standard,高级加密标准)是一种对称密钥加密算法,被广泛应用于保护敏感数据的安全性。它是美国联邦政府采用的加密标准,也是目前最常用的对称加密算法之一。AES加密算法采用分组密码结构,将明文按照固定长度(128192256 位)进行分组,然后通过一系列的轮函数和密钥迭代,对每个分组进行加密处理,最终生成密文。AES共有10轮、12轮或14轮轮函数,取决于密钥长度(128192256 位)。

特点

使用场景

在使用AES加密算法时,除了指定密钥长度外,还需要指定工作模式(Mode of Operation)和填充模式(Padding Scheme)。

工作模式(Mode of Operation)

工作模式定义了对待加密的数据块的方式,常见的工作模式包括:

填充模式(Padding Scheme)

填充模式用于处理明文块的长度与加密算法要求的数据块长度不匹配的情况。常见的填充模式包括:

相关信息

PKCS5PaddingPKCS7Padding都是填充方案,用于在加密过程中对明文进行填充,以满足加密算法要求的数据块长度的整数倍。

主要区别

总体来说,PKCS7PaddingPKCS5Padding的一个超集,它可以处理更广泛的块长度范围。在实践中,PKCS7Padding更常见,并且在大多数情况下,PKCS7Padding也适用于 PKCS5Padding所适用的情况。

示例代码(AES/CBC/PKCS5Padding

运行并观察控制台输出:

6.3 DES

DESData Encryption Standard,数据加密标准)是一种对称密钥加密算法,是最早广泛应用的分组密码算法之一。DES使用64位密钥对64位的数据块进行加密和解密,经过多轮的置换和替换操作,生成密文。DES加密算法采用分组密码结构,将明文按照固定长度(64 位)进行分组,然后通过一系列的置换、替换和轮函数,对每个分组进行加密处理,最终生成密文。DES共有16轮轮函数,每轮使用不同的子密钥对数据进行处理。

特点

使用场景

工作模式与填充模式参见AES部分内容.

示例代码(DES/CBC/PKCS5Padding

运行并观察控制台输出:

6.4 3DES

3DESTriple Data Encryption Standard)是对DES加密算法的改进版本,通过对数据应用三次DES加密来提高安全性。它采用了三个不同的密钥对数据进行加密和解密,从而增强了加密的强度和安全性。在3DES中包含了两种不同的加密模式:双倍长密钥模式(Two-Key Triple DES)和三倍长密钥模式(Three-Key Triple DES)。

特点

使用场景

工作模式与填充模式参见AES部分内容.

示例代码(DESede/CBC/PKCS5Padding

运行并观察控制台输出:

6.5 SM4

SM4是一种分组密码算法,也称为国密算法,由中国国家密码管理局设计并公开的。它是一种对称加密算法,适用于数据加密和解密,以及数据完整性验证等场景。SM4算法基于Feistel网络结构,具有32轮加密和解密过程。它采用了非线性变换、置换运算和密钥混合技术,通过对数据块的多次迭代处理,实现数据的加密和解密。

特点

使用场景

工作模式与填充模式参见AES部分内容.

示例代码(SM4/CBC/PKCS5Padding

Java默认未提供SM4实现,示例代码依赖bouncycastle

Go默认未提供SM4实现,示例代码依赖github.com/tjfoc/gmsm/sm4

运行并观察控制台输出:

第七部分 非对称加密算法

非对称加密算法是一种加密和解密过程使用不同密钥的加密技术,它需要一对密钥:公开密钥(公钥)和私有密钥(私钥)。公钥可以公开给任何人,用于加密信息,而私钥必须保密,仅由信息的接收者持有,用于解密信息。这种机制解决了密钥分发和安全通信的难题,因为即使公钥广为人知,没有对应的私钥也无法解密信息。非对称加密算法的加密过程和解密过程是数学上相关的,但直接从公钥推算出私钥在计算上是不可行的,这确保了系统的安全性。

使用场景

解决的问题

代表性算法

7.1 RSA

RSA是一种非对称加密算法,是目前应用最广泛的公钥加密算法之一。RSA算法基于数论中的大数分解问题,其安全性依赖于大整数分解的困难性。RSA算法基于两个大素数的乘积作为公钥的模数,公钥由模数和指数组成,私钥由模数和另一个指数组成。加密过程使用公钥对数据进行加密,解密过程使用私钥对密文进行解密。RSA算法的安全性基于大数分解问题的困难性,即给定一个大整数N,找到两个大素数pq,使得N = p * q,是一个困难的问题。

特点

使用场景

示例代码(生成密钥)

示例代码(加解密)

示例代码(签名验签)

相关信息

签名算法是一种用于确保数据完整性和认证数据来源的密码学技术。它通常与加密算法结合使用,用于生成数字签名,以便验证数据的真实性和完整性。下面是签名算法的详细介绍和说明:

基本原理

签名算法基于公钥加密和私钥解密的原理。发送方使用私钥对数据进行签名,接收方使用发送方的公钥来验证签名。如果数据在传输过程中被篡改,签名验证将失败,因为篡改后的数据与原始签名不匹配。

加密与签名的区别

虽然加密和签名都使用了公钥和私钥,但它们的目的和机制有所不同。加密是为了保护数据的隐私性,而签名是为了确保数据的完整性和认证数据来源。

签名的过程

  1. 发送方使用私钥对数据进行哈希计算,然后对哈希值进行签名生成数字签名。
  2. 发送方将原始数据和数字签名一起发送给接收方。

验证签名的过程

  1. 接收方使用发送方的公钥对原始数据进行哈希计算,得到哈希值。
  2. 接收方使用发送方的公钥和数字签名对哈希值进行解密,得到原始的哈希值。
  3. 接收方比较计算得到的哈希值与解密得到的哈希值是否一致。如果一致,则验证通过,否则验证失败。

7.2 SM2

SM2是一种基于椭圆曲线密码学(ECC)的国密算法,由中国密码学家提出,用于数字签名、密钥交换、公钥加密等场景。SM2算法是中国政府采用的国家密码算法标准之一。SM2算法基于椭圆曲线离散对数问题,其核心原理是在椭圆曲线上进行点运算,实现数字签名、密钥交换等功能。SM2算法采用了一套基于国际标准的椭圆曲线参数,具有较高的安全性和效率。

特点

使用场景

SM2算法的公钥和私钥有多种格式类型,每种格式都有其特定的用途和特点。常用格式与说明如下:

私钥格式

公钥格式

相关信息

在讨论SM2算法时,经常会提到的D值Q值(压缩与未压缩)Q值xQ值y,这些术语与椭圆曲线密码学(ECC)中的点表示和密钥生成过程相关。基本解释如下:

总的来说,D值是私钥,Q值代表公钥,而Q值xQ值y分别是公钥点在坐标平面上的x坐标y坐标,它们根据压缩与否的不同格式,可能以不同的方式表示或传输。

加密数据格式

相关信息

SM2加密数据最初使用C1C2C3格式数据,在新版标准中为C1C3C2格式,在实际使用中需要注意区分并在必要时进行数据转换。Java中常用的bouncycastle默认使用的格式为C1C2C3

签名数据格式

示例代码(生成密钥)

Java默认未提供SM2实现,示例代码依赖bouncycastle

Go默认未提供SM2实现,示例代码依赖github.com/tjfoc/gmsm/sm2

示例代码(逆向公私钥)

示例代码(加解密)

示例代码(签名验签)

示例代码(C1C2C3 <=> C1C3C2)

示例代码(ASN1 <=> R_S)

第八部分 其他常用算法说明

8.1 CRC(循环冗余校验)算法

CRC(循环冗余校验)算法主要用于数据通信领域中的错误检测,它是一种广泛应用于数字网络和存储设备中的差错控制方法。

CRC算法的分类

CRC算法并没有严格的分类体系,但根据生成多项式的不同,可以有多种不同的CRC算法,常见的包括:

CRC算法解决的问题

CRC算法主要解决的是数据传输过程中的比特错误问题,通过计算数据流与特定生成多项式之间的模二除法余数,生成一个校验码附加到数据后面。接收端重新计算CRC并与接收到的CRC校验码比较,如果一致,则认为数据在传输过程中没有发生错误或者发生了可检测的错误。

与信息摘要的异同

与消息认证算法的异同

示例代码

运行并观察控制台输出:

8.2 SM9基于身份的密码

SM9算法属于基于身份的密码。基于身份的密码是一种“高级”的公钥密码方案,在具备常规公钥密码加密、签名等密码功能的同时,基于身份的密码体系不需要CA中心和数字证书体系。SM9方案的基本原理是,可以由用户的唯一身份ID(如对方的电子邮件地址、域名或ID号等),从系统的全局主密钥中导出对应的私钥或公钥,导出密钥的正确性是由算法保证的,因此在进行加密、验签的时候,只需要获得解密方或签名方的ID即可,不再需要对方的数字证书了。因此如果应用面对的是一个内部的封闭环境,所有参与用户都是系统内用户,那么采用SM9方案而不是SM2证书和CA的方案,可以简化系统的开发、设计和使用,并降低后续CA体系的维护成本。

对应数字证书体系中的CA中心,SM9体系中也存在一个权威中心,用于生成全局的主密钥(MasterKey),并且为系统中的每个用户生成、分配用户的私钥。和SM2密钥对一样,SM9的主密钥也包含私钥和公钥,其中主公钥(PublicMasterKey)是可以导出并公开给系统中全体用户的。而SM9中用户的密钥对比较特殊,其中的公钥并不能从私钥中导出,SM9用户密钥需要包含用户的ID起到公钥的作用,在加密和验证签名等密码计算中,真正的用户公钥是在计算中,在运行时通过用户ID从主公钥中导出的。因此从应用的角度看,SM9中用户的公钥就是一个字符串形式的ID

第九部分 API常用保护措施

9.1 幂等(Idempotency)

幂等性是指一个操作或接口,无论执行多少次,其结果都是一样的,系统的状态不会因为重复执行而发生改变。换句话说,多次请求的效果与单次请求相同,这对于确保数据一致性特别重要,尤其是在网络不稳定或用户重复提交请求时。

使用场景

实现方式

9.2 防篡改(Tamper Resistance)

防篡改旨在保护数据在传输过程中不被未经授权的第三方修改。这通常通过数据签名、消息认证码(MAC)、数字签名或加密来实现,确保数据的完整性和来源的真实性。

使用场景

实现方式

9.3 防重放(Replay Prevention)

防重放机制用于阻止攻击者捕获有效的数据包或请求然后重新发送,以欺骗系统执行非授权的操作。它通过添加时间戳、序列号、一次性令牌或使用加密技术来验证请求的新鲜度和合法性。

使用场景

实现方式

9.4 防信息泄露(Information Leakage Prevention)

防信息泄露指的是采取措施防止敏感信息在未经许可的情况下被披露给未经授权的实体。这包括数据加密、访问控制、最小权限原则、安全审计等手段。

使用场景

实现方式