1. 概述
1.1 加密与解密
加密是指通过特定的算法和密钥,将可以被人类直接理解的明文转化为杂乱无章的密文的过程。
解密是加密的逆向数学变换过程。它利用特定的解密算法和正确的密钥,将杂乱无章、无法读懂的密文还原为计算机或人类可直接理解的明文。
加密与解密的工作依赖于两个核心因素:算法和密钥:
- 算法:复杂计算规则,比如字母错位、矩阵相乘、异或运算等等;
- 密钥:控制算法运行的参数,遵循“柯克霍夫原则”,即系统的安全性取决于密钥是否被安全保管,而不应依赖于加密算法本身来保证加密;
它们共同构成了数据在计算机中存储和传输的安全防线。
1.2 六大密码技术
计算机的六大密码技术包括:对称密码、公钥密码、单向散列函数、消息认证码、数字签名、伪随机数生成器,它们之间相互配合,共同解决了计算机网络和存储中的四大安全威胁:窃听、篡改、伪装、否认:
- 1.对称密码:
- 核心功能:加密与解密使用同一把密钥;
- 解决问题:防止窃听,确保数据的机密性;
- 技术特性:计算结构多为异或和移位,速度极快,适合加密计算机硬盘数据或大文件;
- 典型算法:AES、ChaCha20 [FIPS 197];
- 2.公钥密码/非对称密码:
- 核心功能:使用一对密钥,即公钥和私钥,公钥是公开的用于加密,私钥保密用于解密;
- 解决问题:解决对称密码的密钥配送问题,并确保机密性;
- 技术特性:基于大数分解或椭圆曲线等数学难题,计算复杂,速度慢 [RSA-99];
- 典型算法:RSA、国密 SM2、ECC(椭圆曲线密码学);
- 3.单向散列函数:
- 核心功能:将任意长度的计算机数据(消息)压缩并转换为固定长度的散列值/摘要;
- 解决问题:防止篡改,确保数据的完整性;
- 技术特性:具备不可逆性和抗碰撞性;
- 典型算法:SHA-2(如 SHA-256)、SHA-3、国密 SM3
- 4.消息认证码(MAC):
- 核心功能:将单向散列函数与双方共享的对称密钥强行结合的技术;
- 解决问题:篡改与伪装,确保完整性与认证;不仅确认内容没被篡改,还要确认内容的发送者;
- 技术特性:没有密钥的第三方即便篡改了文件,也无法伪造出正确的MAC值;
- 典型算法:HMAC-SHA256;
- 5.数字签名(Digital Signature):
- 核心功能:结合了单向散列函数与非对称密码(私钥加密摘要,公钥验签)的技术;
- 解决问题:确保完整性、认证、不可否认性,防止发送方事后不认账;
- 技术特性:私钥只有发送方一人持有,其签名的法律效力类似于现实中的盖章签字;
- 典型算法:RSA签名、ECDSA(椭圆曲线数字签名算法);
- 6.伪随机数生成器(PRNG):
- 核心功能:在计算机中产生具备“不可预测性”的随机比特序列;
- 解决问题:为前五个密码技术提供安全的源泉,负责生成高强度的密码学密钥、初始化向量(IV)和盐(Salt);
- 技术特性:必须具备密码学安全伪随机性,普通编程语言中自带的rand()函数(如 C 语言)由于可预测,绝对不能用于密码学;
- 典型算法:Linux 内核的/dev/urandom、/dev/random;
密码六大技术在现代计算机中的结合应用:
- 1. 伪随机数生成器生成临时对称密钥;
- 2. 浏览器与服务器通过公钥密码交换该密钥;
- 3. 使用数字签名配合公钥证书(PKI体系)验证服务器的真实身份;
- 4. 通道建立后,使用对称密码快速加密网页内容;
- 5. 传输中利用消息认证码(或单向散列函数)确保每个数据包没有被黑客篡改;
1.3 密码安全常识
在计算机和网络世界中,计算机密码安全常识是保护个人隐私、数据资产和系统免受黑客攻击的最核心防线,同样也是每个开发者、系统架构师和 IT 运维人员必须掌握的核心底线。对于技术人员来说,密码算法安全才是更加关注的领域。
1.3.1 不要使用保密的密码算法
安全界有一条铁律:“Don’t roll your own crypto”,即不要自己编写加密算法。系统的安全性应该依赖于密钥的保密,而不是密码算法的保密。
我们使用保密的密码算法是不能保证高安全性的,相反,还应该使用那些已经公开、成熟的密码算法:
- 缺乏公开审计,漏洞百出:个人或小团队研发的密码算法没有进行过大规模、多维度的测试,无法发现潜在的数学缺陷或设计漏洞,一旦被发现漏洞攻破后果不堪设想;
- 密码算法一旦泄露,系统瞬间崩溃:从历史上看,密码算法的秘密无一例外都会被暴露出来。密码算法程序终究会运行在客户端或服务器端,黑客组织可以通过逆向程序或其他手段轻松获取算法设计细节,那么依靠密码算法本身来确保机密性的系统将会不堪一击;
- 隐蔽式安全不是真正的安全:试图通过“对密码算法本身进行保密”来确保安全性的行为,被称为“隐蔽式安全”,这种行为是十分危险的。根据柯克霍夫原则,现代密码学的安全性依赖于算法完全公开,但密钥绝对保密;
- 更换密钥比更换算法更容易:如果算法是公开的,一旦系统遭到破坏,只需要更换一把密钥,系统就能立即恢复安全;反过来说,如果算法是保密的,一旦算法代码泄露,必须重新设计、编写、测试算法,时间和人力的代价是不可估量的;
1.3.2 坚决停用“已被破译或过时”的密码算法
随着计算机算力的不断提升,很多老旧过时的密码算法已经逐渐被破译,变得不再安全了:
- MD5与SHA-1哈希算法:这两种算法是已经被证实存在“碰撞检测漏洞”的哈希算法,即不同的输入会产生相同的哈希值,逆向工作人员可以通过“彩虹表”破译MD5密码,现在已被禁止使用;
- DES与3DES对称加密算法:根据现代计算机的算力,这两种算法很快就会被破解,目前也已经被淘汰;
- 弱RSA密钥长度 (非对称加密算法):1024位及以下长度的RSA密钥已经不再安全;
1.3.3 采用更为先进的行业标准算法
实际的系统开发和架构中,国际标准与国密标准通常存在一一对应的替换关系:
| 密码类型 | 国际标准ISO | 国内商用密码 | 规范要求 |
| 对称加密(海量数据加密) | AES-128/AES-256 | SM4分组密码算法 | 加密模式首选GCM(自带认证)或CBC,严禁使用ECB模式 |
| 非对称加密(密钥交换/数字签名) | RSA/ECC | SM2椭圆曲线密码算法 | RSA密钥长度必须 ≥ 2048 位(推荐4096位),1024位已彻底废弃;优先推荐使用ECC |
| 哈希算法(数据完整性校验) | SHA-2/SHA-3 | SM3密码杂凑算法 | 仅用于文件校验或数字签名,不可直接用于存储用户密码 |
| 密码存储(专有防爆破算法) | Argon2/bcrypt/scrypt | 基于SM3加盐迭代 | 必须使用上述慢哈希算法,且必须配合随机盐(Salt),以抵御显卡GPU暴力破解。 |
1.3.4 开发者需掌握的算法应用常识
不仅要选对算法,还要遵循使用规范:
- 1. 存储密码哈希时,使用慢哈希,并且要加盐:生成一个随机的字符串(盐),然后使用慢哈希算法,比如Argon2(目前最佳)、bcrypt或scrypt;
- 2. 使用对称加密时,严禁使用ECB模式:ECB全称是电子密码本模式,它是AES算法的其中一个模式,ECB模式会将明文切块独立加密,如果有重复的数据块,那么加密后的密文块也相同,逆向工作人员可以通过密文的纹理反推出原始数据的结构,应当切换到AES-GCM或AES-CBC模式;
- 3. 密钥与代码必须分离存储:绝对不能将密钥硬编码存放到配置文件、Git仓库或源码中,应当将密钥存储于单独的安全环境中,使用专门的密钥管理服务,比如AWS KMS等;
1.3.5 任何密码总有一天会被破解
无论使用任何密码算法所生成的密文,只要将所有可能的密钥全部尝试一遍,就总有一天
可以破译出来,只是时间问题罢了。所以破译密文所需要花费的时间,与要保密的明文的价值之间的权衡就显得非常重要。
严格来说,绝对不会被破解的密码算法其实是存在的,但是也仅仅存在于理论中,它就是整个密码学界公认的、唯一在数学上被证明“绝对无法破译”的一次性密码本加密算法。
1.4 加密、编码、哈希的区别
加密、编码、哈希的三个概念在软件开发中极其容易混淆的:
- 加密:为了保密,必须有密钥,密文必须能被解密恢复;
- 编码:为了跨平台传输保证兼容,没有密钥,任何计算机都能解码,不具备保密功能;
- 哈希:为了保证数据的完整性,防止被篡改,它是不可逆的;
| 名称/特点 | 加密 | 编码 | 哈希/散列 |
| 核心功能 | 保护数据(防止窃听) | 数据转换(保证兼容) | 检验完整性(防篡改) |
| 可逆性 | 可逆 | 可逆 | 不可逆 |
| 是否需要密钥 | 需要 | 不需要 | 不需要 |
| 长度 | 随明文长度增加 | 随明文长度增加 | 输出长度固定 |
| 典型算法 | AES、RSA | Base64、URL、Hex | SHA-256、SHA-3、MD5 |
总结:加密是为了“保密”(可逆且需密钥);编码是为了“兼容”(可逆但无密钥);哈希是为了“防篡改”(不可逆)。
2. 对称密码与公钥密码
现代的密码都是建立在计算机的基础之上的,由于现代密码的数据量非常庞大且密码算法也十分复杂,因此需要借助计算机来完成对数据的加密和解密操作。
计算机的操作对象不再是传统的文字,而是按照ASCII规则进行编码,映射为由0和1排列组成的比特序列。因此数据加密的过程就是将明文的比特序列转换为密文的比特序列。
2.1 对称密码
对称密码是一种在加密和解密过程中使用完全相同密钥(或可以互相推算)的密码算法。
核心原理是发送方使用密钥将明文(原始数据)转化为密文(不可读数据),密文通过不安全信道传输给接收方,接收方使用同一把密钥将密文还原为明文。
对称密码算法根据处理数据的方式分为分组密码和流密码两种:
- 分组密码:把明文数据分割成固定大小的“块”(如每块64位或128位),逐块进行加密;
- 流密码:不对数据切块,而是生成连续的密钥流,对明文逐位或逐字节进行加密,适合实时通信;
最常见的对称密码算法主要有AES、SM4、DES/3DES、RC4、ChaCha20:
- AES:当今世界最流行、安全强度极高、使用最广泛的主流标准,目前网银、无线网络、手机应用都在使用它;
- SM4:中国国家商用密码无线局域网标准分组密码算法,广泛应用于国内的金融、政务等领域;
- DES/3DES:早期的加密标准,由于密钥过短已被淘汰或逐步淘汰;
- RC4:目前一种常见的流密码算法;
- ChaCha20:一种现代的高性能流密码,常用于移动设备和新型网络协议(如 TLS 1.3)中;
对称密码算法的优缺点也很明显:
- 优点:计算速度非常快,非常适合加密大文件或海量数据;
- 缺点:双方必须使用相同的密钥,因此存在密钥配送问题;
2.1.1 分组密码的模式
分组密码模式是决定如何使用分组密码算法(如AES、SM4)来加密任意长度数据的算法增强机制。分组密码模式本身不能独立进行加密。它必须包裹着一个对称密码算法。
因为分组密码只能加密固定长度(如AES为128位)的数据块,当明文很长或者不是固定块的整数倍时,就需要通过特定的“模式”来组合、链接这些数据块,以便将一段很长的明文全部加密。
分组密码模式主要有5种:ECB、CBC、CFB、OFB、CTR、GCM:
- ECB模式:也称为电子密码本模式,将明文分组加密后的结果直接成为密文分组,每块用相同的密钥独立加密,块与块之间毫无关联,可并行计算;仅用于加密极短、不重复的数据;
- CBC模式:也称为密码分组链接模式,引入初始化向量 (IV)。前一个密文块会与当前明文块进行异或(XOR)运算,然后再进行加密;相同的明文块加密后的密文完全不同,因此安全得到了较大保障;但是加密过程无法并行计算(必须等前一块加密完),且需要填充至固定长度;
- CFB模式:密码反馈模式,将分组密码转变为流密码。加密的是前一个密文块,然后将加密结果与当前明文块XOR计算得到当前密文;不需要填充明文,可以加密任意长度(甚至1个比特)的数据;
- OFB模式:输出反馈模式,同样是转变为流密码。与 CFB 类似,但它加密的是前一步加密算法的输出值,而不是密文块;密钥流的生成独立于明文,传输过程中的单比特错误不会扩散到后续密文块;
- CTR模式:计数器模式,将一个“计数器的数值进行加密,再与明文块异或。每加密完一块,计数器加 1;支持完全的并行加密和解密,速度极快;不需要填充;安全性等同于 CBC;
- GCM模式:AEAD认证加密模式,在CTR模式的基础上,增加了GMAC认证码;TLS 1.3 (HTTPS)、Wi-Fi安全协议等全部默认优先使用AES-GCM;它同时保证了速度快(可并行)、机密性和完整性(防篡改);
2.1.2 DES/3DES算法
DES是1977年美国联邦信息处理标准(FIPS)中所采用的一种对称密码(FIPS 46-3),它是密码学史上最具代表性的对称密码算法之一,也是现代密码学发展的基石。
随着计算机算力的提升,DES算法已经被破解,变得不再安全,现已被弃用。
DES是一种分组密码算法,大体结构特点可以总结为“64-56-16”:
- 明文分组长度:每次只能加密64位的数据,若数据过长需使用分组模式(如CBC、ECB);
- 密钥长度:密钥实际长度只有56位,每8位中的最后1位(第8、16、24…位)被用作奇偶校验位;
- 轮数:内部结构采用Feistel网络,数据需要经过16轮完全相同的循环迭代混淆;
由于DES算法的密钥空间太小,导致计算机可以在较短时间内就可以穷举完所有密钥,因此被淘汰。
为了增加DES算法的强度,解决DES密钥长度过短的问题,密码学家提出了新的密码算法:三重DES,即将DES重复3次所得到的一种密码算法,简称3DES:
- 核心原理:使用2个或3个不同的密钥,对数据进行 加密 → 解密 → 加密(Encrypt-Decrypt-Encrypt,简称 EDE)的三重操作;解密过程与加密正好相反;
- 密钥长度:最高可达168位(比特);
- 缺点:需要跑三次DES流程,效率远低于现代算法;加密数GB以上的大流量网络时(如TLS/VPN),容易因碰撞攻击,安全性也得不到保障;目前NIST已在2023年后正式禁用3DES;
2.1.3 AES算法
AES(高级加密标准)是当今世界上应用最广泛、最安全的对称分组密码算法,取代了不安全的DES/3DES算法,目前各种应用(比如HTTPS)的底层几乎都在使用AES算法:
- 分组大小:固定为128位 (16字节)。不论明文多长,AES都是把数据切成16字节的小块来处理;
- 密钥长度:支持三种长度,安全性随密钥变长而增加,对应的加密轮数也不同:
- AES-128:密钥128位,执行10轮加密;
- AES-192:密钥192位,执行12轮加密;
- AES-256:密钥256位,执行14轮加密;
AES采用了更高效的SPN(代换-置换网络)结构,它把16字节的输入排列成一个4×4的字节矩阵(称为“状态矩阵”),然后在每一轮加密中重复执行以下四个数学步骤:
- 字节代换 (SubBytes):通过一个固定的S盒(S-Box),将矩阵中的每个字节替换为另一个字节,实现非线性变换,防止被数学方法轻易推导;
- 行移位 (ShiftRows):将矩阵的第2、3、4行分别循环左移1、2、3个字节,打乱字节在行内的位置;
- 列混合 (MixColumns):利用矩阵乘法(在有限域GF(2⁸)上),让每一列的4个字节互相混合,使单个字节的改变扩散到整个矩阵;
- 轮密钥加 (AddRoundKey):将当前的状态矩阵与由主密钥衍生出的“轮密钥”进行异或(XOR)运算;
开发者注意事项:单独的AES只是一个引擎,必须搭配正确的分组模式:
- 不要使用AES-ECB模式:相同明文会产生相同密文,导致特征泄露;
- 谨慎使用AES-CBC模式:不支持防篡改(缺乏完整性校验),且容易受到填充提示攻击;
- 首选AES-GCM模式:这是现代工业界的黄金标准,同时兼顾了机密性和完整性;
2.1.4 密钥配送问题
密钥配送问题是对称密码体系中最核心、最致命的逻辑宿命。
对称加密需要双方使用完全相同的密钥来加密信息,那么发送方该如何将密钥安全地传输到接收方?如果存在一条绝对的安全通道来传输密钥,那么为什么不能直接将明文传输过去,也就不需要加密了。
密钥配送问题的四种解决方式:
- 1. 引入公钥密码(非对称密码):
- 接收方生成一对密钥(公钥和私钥),把公钥公开到网上;
- 发送方想给接收方发送对称密钥,就用接收方的公钥进行加密,然后发给接收方;
- 接收方使用私钥解密拿到这把对称密码;
- 2. DH / ECDH(密钥交换协议):
- 双方在完全公开、被黑客全程监听的网络上,通过公开交换一些数学参数(如椭圆曲线上的点),各自在本地通过数学公式计算;
- 最终双方能“凭空”计算出相同的对称密钥,而这个密钥在网络上从未被直接传输过;
- 3. 引入KDC(密钥分配中心):
- 引入一个大家都绝对信任的第三方“中介”(KDC);
- 双方之前不认识,但他们各自都与KDC提前共享了一个密钥;
- 双方想要通信时,向KDC申请,KDC负责生成一个临时会话密钥,并分别加密分发给双方;
- 企业内网中最著名的Kerberos协议(如微软的Active Directory域认证)就是采用这种模式;
- 4. QKD(量子密钥分发):
- 利用量子力学的物理特性(如海森堡不确定性原理和量子纠缠);密钥以光子的偏振状态在光纤中传输;
2.2 公钥密码
公钥密码,又称非对称密码,最大的特点就是使用一对完全不同、但数学上相关的密钥:公钥和私钥:
- 公钥:公开给所有人,任何人都可以获取并使用它;
- 私钥:由所有者秘密保存,不能泄露给任何人;
- 单向数字锁:公钥加密的数据,只能用对应的私钥解密;私钥加密的数据,只能用对应的公钥解密;
公钥密码主要应用于加密通信和数字签名:
- 加密通信:接收方向发送方发送公钥,发送方使用接收方发来的公钥对消息进行加密,然后发送给接收方,全世界只有接收方的私钥才能解密;
- 数字签名:接收方想向公众发布一份声明,他先用自己的私钥对文件进行加密生成“签名”,连同文件一起发布;任何人都可以用接收方的公钥去成功解密验证,由于私钥只有接收方有,这就证明文件确实是接收方本人发出的,且中途没有被任何人篡改;
常见的公钥密码算法主要有RSA、SM2、ECC、DH/ECDH:
- RSA算法:最流行的公钥密码算法,现在推荐的密钥长度至少为2048位或3048位;
- SM2算法:中国国家商用密码标准,基于椭圆曲线(ECC)结构设计;
- ECC算法:新一代主流算法,它用极短的密钥就能达到与RSA相同的安全级别,广泛用于移动端和现代网络协议;
- DH/ECDH:专门用于密钥交换的算法,允许双方在完全不安全的网络中,凭空协商出一个相同的对称密钥;
对称密码和公钥密码的区别:
| 特性 | 对称密码 | 公钥密码 |
| 密钥数量 | 1把(双方共享) | 2把(公钥公开,私钥私有) |
| 计算速度 | 非常快,适合加密大量数据 | 很慢,适合加密短数据、签名 |
| 密钥配送 | 很难,必须通过绝对安全通道送达对方 | 简单,公钥可以随意在网上公开传播 |
| 主要应用 | 数据加密 | 密钥配送、数字签名、身份认证 |
2.2.1 RSA算法
RSA算法是当今世界最著名、应用最广泛的公钥密码算法(非对称密码算法),它既能用于数据加密,又能用于数字签名。其核心原理是加密和解密使用不同的密钥。
RSA算法的安全性建立在一个经典的数学难题上:将两个超大质数相乘很容易,但要把乘积重新分解为两个质数极其困难:
- 公钥:所有人都可以获得,通常由两个数 (n, e) 组成,其中n是两个大质数的乘积;
- 私钥:只有接收方知道,通常由 (n, d) 组成,d是通过欧拉函数计算出的模反元素;
- 破译:攻击者如果想从公钥 (n, e) 中推导出私钥d,就必须先将n分解为原始的两个质数。随着n的位数增加,现代计算机穷举或用算法分解它的成本呈指数级上升;
RSA算法有数据加密和数字签名两大核心功能:
- 数据加密:确保机密性,公钥加密、私钥解密;发送方找到接收方公开的公钥,将明文加密成密文发送。接收方收到后,用自己存放在本地的私钥解密读出明文;
- 数字签名:确保身份认证与不可否认性:私钥签名,公钥验签;接收方要证明消息是自己发出的,且中途没被篡改;接收方用自己的私钥对文件的哈希值进行加密,生成“数字签名”,附在文件后发送;发送方收到后,用接收方的公钥进行解密验签;能用接收方的公钥成功解密,证明该文件绝对是由持有私钥的接收方本人发送的,且内容完整;
2.3 混合密码系统
混合密码系统是现代网络安全的标准解决方案,将对称密码与公钥密码完美结合:既有“超高的计算速度”,又实现了安全的密钥分发。HTTPS协议、SSH (远程登录)、PGP/GPG (安全邮件)、即时通讯软件等应用底层都运行着混合密码系统。
混合密码的哲学:用非对称加密来保护“钥匙”,用对称加密来保护“数据”:
- 对称加密:速度很快,适合加密海量数据,但存在密钥配送问题;
- 非对称加密:安全性高,解决了密钥配送问题,但计算速度比对称加密慢数百到数千倍;
混合加密系统的核心工作流程:
- 1. 生成临时密钥:发送方在本地随机生成一把临时的对称密钥;
- 2. 加密钥匙:发送方获取接收方的非对称公钥,用来加密这把“临时对称密钥”;
- 3. 配送钥匙:发送方把加密后的密钥通过互联网发给接收方。即使被截获,没有私钥也无法解密;
- 4. 解密钥匙:接收方用自己的非对称私钥解密,安全地拿到“临时对称密钥”,双方完成了密钥安全配送;
- 5. 高速通信:双方要传输的网页、图片、信息等海量数据,全都使用这把对称密钥进行极速加解密;
3. 密钥
密钥是一串特定长度的数字、字母或二进制数据。在加密时,算法利用这把“钥匙”将你看得懂的明文变成乱码;在解密时,又用“钥匙”将乱码还原成明文。
密钥的核心作用就是著名的柯克霍夫原则:一个密码系统的安全性,不应该取决于加密算法的保密,而应该完全取决于密钥的保密:
- 算法是公开的:全世界的黑客组织、专家都知道密码算法的数学公式和运行步骤;
- 密钥是隐藏的:虽然算法公开,但只要你手中的密钥不泄露,黑客即便拿到了加密后的乱码(密文),且知道你用的是AES算法,也绝对无法解密;
密钥和密码不同,密码是由人类记忆并输入的短字符串(比如123456),安全强度很低,很容易被破解;而密钥是由计算机通过随机数发生器生成的超长二进制数据;我们输入一串好记的“密码”,计算机底层的算法(如123456)会把这串密码转化为高强度的“密钥”,再去加密文件。
密钥主要分为对称密钥和非对称密钥对,前面讲过了。
密钥的安全性取决于两个因素:密钥长度和随机性:
- 密钥长度:密钥越长,暴力破解(尝试所有组合)的时间就越长;
- 随机性:密钥必须是完全随机、不可预测的;
4. 其他密码技术
密码技术所提供的并不仅仅是基于密码的机密性,用于检验消息是否被篡改的完整性、以
及用于确认对方是否是本人的认证等都是密码技术的重要部分。
4.1 伪随机数生成器
伪随机数生成器是一种利用确定性的数学算法来产生“看起来像随机数”的数字序列的程序或系统。之所以叫“伪”随机,是因为如果知道算法的初始状态(即种子,Seed),它所生成的数字序列是完全可以被预测和重现的。
伪随机数生成器的工作原理:
PRNG的底层核心是一个纯数学公式。它的运转流程非常像一个精密的钟表结构:
- 1. 种子(Seed):整个生成器的起点。通常是一个整数(例如当前系统时间的毫秒数)。相同的种子一定会产生完全相同的随机数序列;
- 2. 状态转移 (State):每当你向生成器索要一个随机数,算法就会基于当前的状态进行一次复杂的数学运算,更新内部状态,并输出一个数字;
- 3. 周期性 (Period):因为内部状态的组合是有限的,当运行足够多次后,PRNG 必然会进入循环,重新重复之前出现过的数字。这个循环的长度被称为周期;
在实际应用中,根据安全需求的不同,伪随机数生成器被严格划分为两大阵营:
- 1. 普通 PRNG(非密码学安全)
- 追求极致的计算速度和良好的统计学分布(数字分布均匀),但不具备防预测性;
- 常见的算法包括:线性同余法 (LCG)、梅森旋转算法:
- 线性同余法 (LCG):最古老的算法,速度极快(如早期的rand()函数),但规律极易被破解;
- 梅森旋转算法:当今非加密领域的绝对王者。周期惊人地长(2¹⁹⁹³⁷-1),统计学特性近乎完美。Python的random模块、Excel、MATLAB默认均使用此算法;
- 适用于游戏开发(如暴击率、掉宝率)、科学蒙特卡洛模拟、数值计算;
- 2. CPRNG(密码学安全伪随机数生成器)
- 必须满足“无法预测性”,使黑客无法在多项式时间内推算出下一个数字;
- 常见的实现方案:
- 基于对称密码算法(如利用 AES 的 CTR 计数器模式生成随机流);
- 基于单向哈希函数(如利用HMAC-SHA256演进状态);
- 现代操作系统提供的安全接口:Linux的/dev/urandom或getrandom(),Windows的 BCryptGenRandom;
- 适用于生成加密密钥、数字签名的参数、会话 ID、盐值(Salt)、初始化向量(IV);
伪随机数与真随机数的区别:
| 特性/名称 | 伪随机数生成器(PRNG) | 真随机数生成器(TRNG) |
| 生成源泉 | 数学算法+软件逻辑 | 物理现象 |
| 可预测性 | 知道种子和算法即可预测 | 无法预测 |
| 生成速度 | 极快,每秒可生成GB级别数据 | 较慢,受限物理硬件的采集效率 |
| 硬件依赖 | 纯软件即可 | 依赖专门的硬件随机数发生器 |
总结来说,伪随机数生成器的功能就是产生具备不可预测性的随机比特序列,且必须具备密码学安全伪随机性;它为其他五个工具提供安全源泉,负责生成密钥、初始化向量(IV)和盐(Salt)。
4.2 单向散列函数
单向散列函数(又称哈希函数)是一种将任意长度的输入数据(消息)转换为固定长度输出(散列值/摘要)的数学函数。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性。它在密码学中用于确保数据的完整性和生成数字签名。
单向散列函数的核心特性:单向性、确定性、抗碰撞性、雪崩效应:
- 单向性:无法通过输出的散列值逆向推导出原始数据,保证信息不可逆;
- 确定性:相同的输入必然产生相同的输出;
- 抗碰撞性:极其难找到两个不同的输入能生成完全相同的散列值;
- 雪崩效应:原始数据即使发生极其微小的改变,生成的散列值也会截然不同;
单向散列函数的常见应用场景:
- 密码存储:数据库中不直接保存明文密码,而是保存密码的散列值,防止泄露;
- 数字签名:结合非对称加密,用于验证消息发送者的身份并确认内容未被篡改;
- 文件校验:下载软件时,通过比对文件的哈希值判断文件是否在传输过程中损坏或被植入病毒;
单向散列函数的常见算法类型:
- MD5:输出128位固定长度,现已不再安全(容易发生碰撞);
- SHA-1:输出160位固定长度,与MD5一样同样存在碰撞风险,逐渐被淘汰中;
- SHA-2:包括SHA-224、SHA-256、SHA-384和SHA-512,目前应用最广泛、最安全的选择之一;
- SHA-3:最新一代哈希标准,结构与SHA-2不同,提供更高级别的安全性;
4.3 消息认证码
消息认证码(MAC)是一种用于验证信息完整性和认证性的技术。消息认证码的核心特性:
- 内容没被篡改:数据在网络传输中途没有被黑客修改或损坏;
- 来源确实可靠:这封信确实是由合法的发送方(拥有同一把钥匙的人)发出的,而不是别人冒充的;
消息认证码的实现必须依赖于发送方和接收方共享的对称密钥,核心流程如下:
- 1. 发送方生成MAC:发送方将“明文消息”和“共享密钥”一起输入到MAC算法中,计算出一个固定长度的字符串,即MAC值;
- 2. 拼接发送:发送方把MAC值附在明文后面,一起发送给接收方;
- 3. 接收方验证:接收方收到消息和MAC值后,用相同的共享密钥和明文再次计算一遍MAC值;
- 4. 对比结果:如果接收方计算出的新MAC值与收到的MAC值完全一致,则说明消息安全无误;如果不一致,说明数据中途被篡改过,或者密钥是错的;
消息认证码的实现技术:
- 1. HMAC(基于哈希函数的MAC):将单向哈希函数(如SHA-256)与对称密钥结合使用,比如HMAC-SHA256;速度极快,安全性极高,目前广泛应用于Web API鉴权(如JWT、AWS签名)和网络协议中;
- 2. CMAC / CBC-MAC(基于分组密码的 MAC):利用对称分组密码算法(如 AES)的CBC加密模式,将最后一个密文块作为认证码,比如AES-CMAC;适合在已经内置了AES硬件加速芯片的嵌入式设备或物联网终端中使用;
- 3. Poly1305(现代高性能 MAC):一种极其高效的单次消息认证码;通常与流密码ChaCha20组合成 ChaCha20-Poly1305,在移动端(如手机上的HTTPS/TLS 1.3通信)性能表现极佳;
单向散列函数与消息认证码的区别:
单向散列函数和消息认证码(MAC)的核心区别在于:是否引入了“密钥”,以及由此带来的“防伪造(认证)”能力差异。简单来说,单向散列函数只能检查数据是否被篡改;而消息认证码不仅能检查篡改,还能确认发送者的身份。
| 特性/名称 | 单向散列函数(Hash) | 消息认证码(MAC) |
| 核心输入 | 消息本身 | 消息+双方共享的密钥 |
| 核心功能 | 检查完整性(有没有篡改) | 检查完整性+认证(谁发的) |
| 防篡改能力 | 无法防御主动攻击者的恶意篡改 | 可以防御恶意篡改与伪造 |
| 典型算法 | SHA-256、SHA-3 | HMAC-SHA256、CMAC |
4.4 数字签名
数字签名是一种将非对称密码算法与单向哈希函数结合使用的技术。通过数字签名,接收方可以确认发送方的身份,并确保文件未被篡改,类似于现实世界中的手写签名或盖公章。
数字签名的核心原理与流程:
数字签名利用了非对称密码中“私钥加密,公钥解密”的特性;私钥只有发布者本人持有,只要能用公钥成功解密,就能证明该签名是本人。核心流程如下:
- 1. 签名阶段(发送方)
- 计算哈希:发送方将明文文件输入哈希算法,生成一段固定长度的散列值(摘要);
- 私钥加密:发送方使用自己的私钥对这段摘要进行加密,生成的加密结果就是数字签名;
- 发送:将“明文文件”和“数字签名”一起发给接收方;
- 2. 验签阶段(接收方)
- 解密签名:接收方收到后,使用发送方的公钥去解密数字签名,得到原作者计算的摘要A;
- 重新计算:接收方用同样的哈希算法,对收到的明文文件重新计算一次,得到摘要B;
- 对比结果:如果 摘要A == 摘要B,则验签成功;
典型的数字签名算法:
- RSA签名:应用最广泛,但开销较大;
- ECDSA签名:椭圆曲线数字签名算法,基于椭圆曲线密码学,密钥更短、速度更快,广泛应用于 Bitcoin/Ethereum等区块链加密、Apple Pay 以及现代网络协议中;
- Ed25519签名:一种新型的现代签名算法,具有极高的安全性和抗侧信道攻击能力,广泛用于SSH和新版TLS;
- SM2 签名:中国国家商用密码标准中的非对称签名算法,广泛应用于国内电子政务、数字证书(CA)和网银系统中;
数字签名和消息认证码的区别:
两者都能防篡改,但数字签名拥有更高阶的法律效力:
| 特性/名称 | 消息认证码 | 数字签名 |
| 底层技术 | 对称加密 | 非对称加密 |
| 抗抵赖性 | 无法防抵赖 | 完美防抵赖 |
| 计算速度 | 极快,适合每笔的网络数据包的防御 | 较慢,适合重大契约、文件、证书 |
5. 公钥证书
公钥证书,通常简称为数字证书,是密码学中用于证明某个公钥确实属于特定所有者的电子凭证。
它通过权威第三方的信用背书,彻底解决了非对称加密中“如何证明这个公钥是你的,而不是攻击者伪造的”这一核心安全难题。
根据国际通用的X.509标准,一个标准的公钥证书就像一张高度防伪的数字身份证,包含以下关键信息:
- 1. 版本号&唯一序列号;
- 2. 证书持有者信息(Subject):如域名(peiqiblog.com)、企业名;
- 3. 持有者的【公钥】(Public Key);
- 4. 颁发机构信息(Issuer):如Let’s Encrypt,DigiCert;
- 5. 有效期(Validity Period):生效与失效时间;
- 6. CA的数字签名(Digital Signature) | (由 CA 用自己的私钥对上述 1-5 项内容加密生成);
公钥证书的核心价值在于防篡改和可追溯,核心流程如下:
- 1. 申请阶段:用户(如网站所有者)生成一对公钥和私钥,将公钥和身份信息打包成证书签名请求(CSR)提交给证书颁发机构(CA);
- 2. 签发阶段:CA验证用户的身份真实性后,用CA自己的私钥对用户的公钥和身份信息进行数字签名,生成证书;
- 3. 验证阶段:当客户端(如浏览器)访问该网站时,网站会出示该证书。浏览器使用内置的CA公钥解密签名,并核对证书内容。如果解密成功且内容一致,说明证书未被篡改,且确实由可信CA颁发;
公钥证书的运转依赖于一套完整的安全架构——PKI(公钥基础设施)。在PKI中,信任是层层传递的:
- 根证书(Root Certificate):位于信任链的最顶端。由全球最权威的CA机构自签名生成。操作系统和浏览器在出厂时,就会预先内置这些根证书;
- 中间证书(Intermediate Certificate):根CA为了安全,通常不直接给普通网站签发证书,而是先签发给中间CA;
- 叶子证书(End-Entity Certificate):最终部署在服务器或设备上的证书。信任链传递逻辑:浏览器信任“根CA” → 根CA信任“中间CA” → 中间 CA 信任“你的网站”。只要根证书在浏览器的白名单里,你的证书就会被自动信任;
1. 一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。