密码学
一、加密算法
1、对称加密算法 - AES-Advanced Encryption Standard
-
是什么?
AES 就是目前最流行、最安全的对称加密算法,简单说就是加密和解密用同一个密码。
📌 适用场景(生活 / 工作中常见)- 手机 / 电脑锁屏密码:你的手机开机密码,实际是用 AES 加密了手机数据;
- APP 本地数据存储:比如微信的聊天记录、支付宝的本地缓存,都是 AES 加密;
- 点对点保密传输:比如你给朋友传保密文件、公司内部系统的敏感数据传输;
- 物联网设备:智能门锁、摄像头的通信数据,用 AES 加密保证安全。
-
为什么?
术语- 明文、密文、密钥
- 密钥长度:长度越长,越安全,破解难度越大
AES-128:密钥长度 128 位(最常用,手机 / APP / 普通场景);
AES-192:密钥长度 192 位(中高安全场景,不常用);
AES-256:密钥长度 256 位(最高安全级别,银行 / 军工 / 政务)
-
加密流程
AES 不是简单的 “替换字符”,而是一套标准化的「搅乱流程」,可以理解为给明文做 3 轮 “花式搅乱”,最终变成密文,解密就是反向搅乱:- 分组:把明文切成固定大小的 “小块”(每块 128 位),就像把长纸条切成一段一段的;
- 搅乱:用密钥对每个小块做「替换、移位、混合」操作,把明文的字符顺序、内容彻底打乱;
- 拼接:把搅乱后的小块重新拼起来,就得到了密文。
✅ 重点:不管明文多长,AES 都会按固定规则分组处理,解密时反向操作即可,速度非常快,手机 / 电脑运行毫无压力。
-
加密模式
-
模式 1:ECB 模式(有坑,禁止使用)
💡 大白话:把明文分成小块,每一块用同一个密钥单独加密,就像把蛋糕切成小块,每块都抹同一种果酱。
❌ 缺点:如果明文里有重复的内容,加密后的密文也会重复,容易被攻击者找到规律,安全性低。
👉 适用场景:几乎不用,了解即可,面试会问到。 -
模式 2:CBC 模式(纯加密场景流行)
💡 大白话:加密前先加一个「初始向量(IV)」,每一块的加密结果会影响下一块,就像接力赛,前一棒的结果决定后一棒的起跑,彻底避免重复密文。
✅ 优点:安全性高,没有 ECB 的漏洞,是目前最常用的模式。
✅ 关键:CBC 模式需要两个东西:密钥 + 初始向量(IV),IV 是随机的,长度固定为16字节 - 128 位,不需要保密,但必须和密钥一起用。 -
模式 3:GCM 模式(加密 + 防篡改 + 防伪造)
💡 CBC 的「升级款」,AES-GCM 是带认证的流加密模式,大白话就是「加密数据的同时,生成一个 “防伪验证码”」,解密时先验这个验证码,验证码不对,直接拒绝解密(说明数据被改了 / 是伪造的),而且它是流加密、不用填充,速度比 CBC 还快,现在行业里基本都用 GCM 替代 CBC 了
核心三要素:AES-128 密钥 16位/24位/32位 + 12 字节唯一 IV(必选随机生成,可明文传)+16 字节 Tag(加密生成解密验证);
示例:- 你和朋友约定密钥:奶茶不加糖;
- 你用密钥加密明文「今晚 8 点 XX 餐厅聚餐」,生成密文 + 防伪验证码(Tag 16字节-128位)(比如密文:%@6&*ab9,Tag:123456);
- 你把「密文 + Tag」一起传给朋友;
- 朋友收到后,先用密钥验 Tag:
- ✅ Tag 对得上:说明数据没被改、不是伪造的,正常解密出明文;
- ❌ Tag 对不上:直接扔掉,不解密,知道数据被动手脚了。
-
区别:GCM 的 IV 为什么要求「唯一」而不是「随机」?
大白话理解:同一个密钥下,只要 IV 不重复,即使明文相同,加密后的密文和 Tag 也绝对不同;如果 IV 重复了,黑客能通过对比密文,直接破解出密钥,整个 GCM 加密就等于裸奔了。
而 CBC 的 IV 只要求随机,不强制唯一(重复了只是密文重复,不会直接泄露密钥),所以GCM 对 IV 的要求更严,但 12 字节的 IV 随机生成,重复的概率比中彩票还低,放心用。 -
适用场景:
- HTTPS/TLS:现在的浏览器和服务器通信(TLS1.2/TLS1.3),默认用 AES-GCM 加密,保证网页数据的保密和完整;
- 物联网设备:智能门锁、摄像头、手环的通信数据,GCM 速度快、轻量,还能防篡改(防止坏人伪造设备指令);
- 移动端 APP:微信 / 支付宝的聊天记录、支付数据,手机银行的交易数据,都用 GCM 加密;
- 金融 / 支付:银行卡交易、扫码支付的核心数据,加密的同时保证不被篡改;
- 大数据传输:流加密速度快,适合大文件 / 大流量数据的加密传输,无填充省步骤。
-
2、非对称加密
-
是什么?
非对称加密的核心是公钥(Public Key)+ 私钥(Private Key) 成对生成,这对钥匙是 “数学绑定” 的 ——公钥加密的内容,只有对应的私钥能解密;私钥签名的内容,只有对应的公钥能验签,反之亦然,而且从公钥推不出私钥,这是安全的核心。- 加密 / 解密:公钥加密,私钥解密(核心解决 “密钥安全传输” 问题,配合 AES 用);
- 签名 / 验签:私钥签名,公钥验签(核心解决 “防抵赖、防篡改”,比如签合同,你用私钥签,别人用你的公钥验,证明是你签的,不是别人伪造的)。
- 缺点:非对称加密从不直接加密大文件 / 大文本(速度太慢),实际项目中都是非对称加密 + 对称加密结合用(非对称加密 AES 密钥,AES 加密实际数据),这是行业标配!
-
有对称加密为什么还要非对称加密?
对称加密使用一把钥匙通加解密,但它有个致命痛点:密钥没法安全传给对方(传的过程中容易被截获),而非对称加密就是专门解决这个问题的 —— 核心是生成一对钥匙(公钥 + 私钥),公钥随便给人,私钥自己藏好,加密 / 解密、签名 / 验签用不同的钥匙,完美解决密钥传输和身份认证问题。
非对称加密的解决方案(公钥随便传,私钥自己藏)- 朋友先生成一对钥匙:私钥(自己藏在口袋里,绝对不给人)+ 公钥(写在纸上,贴在大街上,谁都能拿);
- 你拿朋友的公钥,把 AES 密钥 “奶茶不加糖” 加密成乱码,传给朋友;
- 坏人就算截获了乱码,也只有朋友的私钥能解密,拿到真正的 AES 密钥;
- 你和朋友用解密后的 AES 密钥,加密聚餐纸条(非对称加密速度慢,一般不直接加密大内容,只加密 AES 密钥,这是行业通用玩法!)。
-
分类
目前主流的非对称加密算法分两类:- 一类是加密 + 签名都能做的通用型(RSA、ECC),RSA 是老大哥(兼容性拉满),ECC(椭圆曲线)是新主流(更安全、更轻量,现在首选);
- 一类是只做签名 / 验签的专用型(DSA、ECDSA),ECDSA 替代了老旧的 DSA,是目前数字签名的标配。
(1)ECC(椭圆曲线加密,Elliptic Curve Cryptography)—— 新主流,首选!
ECC 是目前最推荐的非对称加密算法,也是未来的趋势,核心基于椭圆曲线离散对数难题),最大的优势是:同样的安全级别下,ECC 的密钥长度比 RSA 小得多,速度更快、更轻量,特别适合移动端、物联网、区块链等对性能 / 存储空间有要求的场景。- 对比 RSA:
- 256 位的 ECC 密钥 ≈ 2048 位的 RSA 密钥(安全级别基本一致);
- 密钥小:256 位 ECC 密钥比 2048 位 RSA 密钥小近 10 倍,存储 / 传输更方便;
- 速度快:加解密 / 签名验签的速度比 RSA 快 2-5 倍,移动端 / 物联网设备跑起来毫无压力。
- 常用密钥长度
- 256 位(主流,大部分场景够用,手机 / APP / 物联网 / HTTPS);
- 384 位(高安全场景,金融 / 政务);
- 521 位(最高安全级别,军工 / 核心机密)。
- 适用场景(现在的主流,能选 ECC 就不选 RSA)
- HTTPS/TLS1.3(现在浏览器默认用 ECC 握手,替代 RSA);
- 移动端 APP(微信 / 支付宝 / 手机银行的身份认证、签名);
- 物联网(智能门锁 / 摄像头 / 手环的密钥协商、签名);
- 区块链(比特币 / 以太坊的钱包地址、交易签名,用的是 ECC 的 secp256k1 曲线);
- 数字证书(新申请的 SSL 证书,基本都是 ECC 类型,比 RSA 证书小);
- 轻量级设备(单片机 / 传感器,存储空间小,跑不动大的 RSA 密钥)。
(2)RSA-老大哥,兼容性拉满
RSA 是最经典的非对称加密算法,由三位数学家发明(Rivest+Shamir+Adleman),名字就是三人首字母,核心基于大质数分解难题—— 大白话就是:“把两个超大的质数乘起来得到一个数,很容易;但反过来,把这个大数分解成两个原始质数,极难”,目前 2048 位以上的 RSA 密钥,全世界的计算机都无法暴力破解。
RSA 是过去几十年的非对称加密 “扛把子”,兼容性无敌,所有系统 / 编程语言 / 设备都支持,现在虽然被 ECC 赶超,但老系统 / 老设备还在广泛使用,是 “兜底选择”。
- 常用密钥长度
- ❌ 1024 位:2015 年后就被证明可以被破解,绝对不能用!
- 2048 位(主流,老系统 / 兼容性要求高的场景);
- 4096 位(高安全场景,金融 / 政务,不推荐用,密钥大、速度慢,不如用 256 位 ECC);
- 核心特点
- 优点:兼容性无敌,任何设备 / 语言都支持,开发不用考虑适配问题;
- 缺点:密钥大、速度慢,2048 位 RSA 的加解密速度比 256 位 ECC 慢很多,不适合轻量级设备。
- 适用场景
- 老系统 / 老设备的密钥协商、加密(比如传统金融系统、旧版服务器);
- 兼容性要求极高的场景(比如需要适配各种老旧终端的系统);
二、哈希算法
哈希算法(Hash Algorithm)是密码学和数据处理的基础工具,它不等同于加密算法 —— 它无密钥、不可逆、把任意长度数据变成固定长度的哈希值,核心作用是做数据指纹、完整性校验、密码存储,是加解密体系的 “黄金辅助”,但绝对不是加密算法(加密算法是可逆的)。
-
是什么?
任意长度的原始数据(小到一个字符,大到几个 G 的文件),通过哈希算法,计算出一个固定长度、唯一的字符串(哈希值 / 散列值 / 摘要),这个哈希值就像数据的 “数字指纹”—— 指纹能唯一标识人,哈希值能唯一标识原始数据(理想状态)。
核心特点:- 固定长度:输入任意长,输出都一样长
- 正向快速:计算哈希值快,反向推不出原始数据
- 雪崩效应:输入改一点,哈希值全变
- 抗碰撞性:不同输入,几乎不可能算出相同哈希值
-
哈希算法的实际应用
-
应用 1:密码存储(最核心的安全场景,绝对不能存明文)
这是哈希算法最经典的应用 ——网站 / APP 绝对不会存储你的明文密码,只会存储密码的哈希值,这是行业铁律。- 核心流程(以 SHA-256 + 加盐为例)
- 你注册账号,输入密码123456;
- 服务器生成一个随机的盐值(Salt)(比如abc123),把密码 + 盐值拼接(123456abc123);
- 服务器用 SHA-256 计算拼接后的数据的哈希值,得到f987654321abcdef...;
- 服务器只存储盐值和哈希值,不存储任何明文密码;
- 你登录时,输入密码123456,服务器用相同的盐值拼接,计算哈希值,和存储的哈希值对比 —— 相同则登录成功,不同则失败。
- 关键:为什么要 “加盐”?
防止彩虹表破解—— 黑客会提前计算出大量常见密码的 MD5/SHA-256 哈希值,做成 “彩虹表”,如果密码不加盐,黑客可以通过哈希值反向匹配出明文密码;加盐后,哪怕是常见密码,哈希值也会完全不同,彩虹表彻底失效。✅ 示例:密码123456的 SHA-256 哈希值是固定的,但加盐abc123后,哈希值就变了,加盐def456后,哈希值又变了,每个用户的盐值都不同,彻底防彩虹表。 - 为什么不用加密存储密码?
加密是可逆的,如果服务器的加密密钥泄露,黑客可以解密出所有用户的明文密码;而哈希是不可逆的,哪怕哈希值泄露,黑客也推不出明文密码,安全性更高。
- 核心流程(以 SHA-256 + 加盐为例)
-
应用 2:数字签名的 “前置步骤”(和非对称加密配合,核心)
之前讲非对称加密的签名 / 验签时,提到 “非对称加密从不直接加密大数据”,数字签名也是如此 ——不会直接用私钥对原始数据签名,而是先对原始数据做哈希,再用私钥对哈希值签名,哈希在这里起到 “压缩数据、保证完整性” 的核心作用。- 数字签名完整流程(ECC 私钥 + SHA-256,行业标配)
- 哈希的核心作用
- 压缩数据:把大数据变成 64 个字符的哈希值,非对称签名速度提升上万倍;
- 保证完整性:如果合同被篡改,哪怕改一个字,哈希值就会全变,验签必然失败,无法伪造。
✅ 这是哈希 + 非对称加密的经典配合,也是 HTTPS、电子合同、区块链签名的核心原理。
-
应用 3:数据完整性校验(生活中最常见,比如下载文件 / 传文件)
- 你下载软件、电影、安装包时,网站会给出一个哈希值(如 SHA-256),这就是用哈希算法做数据完整性校验,防止文件被篡改、被植入病毒;
- 网盘 / U 盘传文件:怕文件损坏,计算哈希值对比,确认文件完整;
- 区块链区块校验:每个区块链区块都包含上一个区块的哈希值,一旦某个区块被篡改,后续所有区块的哈希值都会变,全网节点校验会失败,保证区块链的不可篡改。
-
应用 4:区块链的 “核心基石”(哈希 + 加密的极致结合)
区块链的不可篡改、去中心化特性,完全基于哈希算法的特性,以比特币为例:- 区块哈希:每个区块包含交易数据、时间戳、上一个区块的哈希值,用 SHA-256 计算出当前区块的哈希值 —— 如果修改区块内的任何交易数据,区块哈希值会全变,后续所有区块的哈希值也会变,全网节点会拒绝这个篡改后的区块;
- 交易哈希:每笔比特币交易都用 SHA-256 计算哈希值,唯一标识一笔交易,防止交易被伪造;
- 钱包地址:比特币的钱包地址,是通过 ECC 公钥做 SHA-256+RIPEMD160 哈希计算后得到的,不可逆,保证钱包地址的安全。
-
应用 5:普通数据处理(非安全场景,哈希表 / 数据索引)
哈希算法不仅用于密码学,还用于普通的程序开发,比如编程语言中的哈希表(HashMap/HashTable),核心是用哈希算法计算数据的哈希值,作为数据的索引,实现O (1) 时间复杂度的增删改查,提升程序效率。
示例:Java 中的HashMap,用键(Key)的哈希值计算存储位置,快速找到值(Value);
特点:这里用的哈希算法(如 Java 的 Object.hashCode ())是非安全型的,不要求抗碰撞性,只要求计算速度快,和密码学哈希算法不同。
-

浙公网安备 33010602011771号