加密算法
国密算法 + 密码机 HSM 模块,上海 CA 是 HSM 中的一种。其实密码机就是一个硬件,我们服务在使用密钥的时候,都去调用密码机进行操作。
国密算法
国密算法 (SM 系列) 是由中国国家密码管理局认定的国产密码算法体系:
一、对称加密算法(加密解密使用同一密钥)
SM4(分组密码,最常用)
- 分组长度和密钥长度均为 128 位
- 公开算法,2012 年正式发布
- 应用广泛:通信加密、VPN、物联网设备等
| 🔐 国密标准 (分组密码) | SM1/SM4 | 128 位 | ✅ 中国商用密码标准。SM1 硬件实现为主;SM4 可用于软硬件,重要性等同国内 AES。 |
二、非对称加密算法(公钥加密,私钥解密)
SM2(椭圆曲线公钥密码)
- 公开算法,2010 年发布,是国密体系核心
- 功能包括:数字签名、密钥交换、公钥加密
- 替代 RSA/ECDSA,安全性更高,密钥长度更短
特点:
SM2 签名强制绑定国密 SM3 哈希算法(256 位),好处就是,可以先计算出一个摘要,然后对摘要进行签名。例如,如果要签名的数据很大有 1G 这种, 此种方法就极大加速了签名的速度。
三、哈希算法(数据摘要)
SM3(杂凑算法)
- 公开算法,2010 年发布
- 输出 256 位摘要,替代 MD5/SHA-1
- 应用于数字签名、完整性验证、密码杂凑等
使用的包为同济开源的包(github.com/tjfoc/gmsm)
国际算法标准
对称加密算法
AES
- 特点:加解密速度快,安全性极高,硬件支持好。
- 模式:需配合工作模式使用,如 ECB(不推荐)、CBC(常用)、CTR、GCM(可同时加密和认证,推荐)。
- 应用:无线通信(Wi-Fi)、文件加密(ZIP, RAR)、磁盘加密(BitLocker)、SSL/TLS 协议等。
| 🇺🇸 现代标准 (分组密码) | AES (高级加密标准) | 128, 192, 256 位 | ✅ 黄金标准,绝对主力。由 NIST 选拔,安全、高效,广泛应用于各类场景。 |
对称加密(分组加密)填充
分组算法中,加密是以块为单位进行的一次加密,所以要求数据是块的整数倍,如果不符合要求,需要进行填充。 确保数据是块的整数倍,适应加密算法的要求。
举例:
在 AES 算法中,对明文的加密要求按照 AES 的 KEY 的长度对齐,叫做块大小即 BlockSize,以 AES-128 为例,它的秘钥长度就是 128bit(16 个字节),也就是说明文会分割成一个又一个的 128bit 的块,之后 AES 再对这些块分别进行加密。这样就面临了一个问题,若一个明文或者一个明文分割后的块大小小于块的大小,那么便无法进行加密,因此我们需要对明文进行填充。
有三种常用的填充:
- ZeroPadding,数据长度不对齐时使用 0 填充,否则不填充。
- PKCS7Padding,假设数据长度需要填充 n(n>0)个字节才对齐,那么填充 n 个字节,每个字节都是 n;如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小。
- PKCS5Padding,PKCS7Padding 的子集,块大小固定为 8 字节。
由于使用 PKCS7Padding/PKCS5Padding 填充时,最后一个字节肯定为填充数据的长度,所以在解密后可以准确删除填充的数据,而使用 ZeroPadding 填充时,没办法区分真实数据与填充数据,所以只适合以\0 结尾的字符串加解密。
二、非对称加密算法(公钥加密,私钥解密)
RSA 与椭圆曲线算法(ECC,Elliptic Curve Cryptography)是目前最主流的两大非对称加密体系,核心差异源于 数学基础、性能特性、安全设计,最终决定了它们的场景适配边界。
| 对比维度 | RSA 算法 | 椭圆曲线算法(ECC) |
|---|---|---|
| 数学基础 | 大整数分解难题(将大素数乘积还原为两个素数) | 椭圆曲线离散对数难题(ECDLP):有限域椭圆曲线上的点运算不可逆 |
| 安全等级 vs 密钥长度 | 安全等级依赖密钥长度,增长缓慢: - 128 位对称安全 → 2048 位 RSA - 192 位对称安全 → 3072 位 RSA - 256 位对称安全 → 4096 位 RSA | 安全等级与密钥长度高度相关,增长高效: - 128 位对称安全 → 256 位 ECC(如 secp256r1/Ed25519) - 192 位对称安全 → 384 位 ECC(如 secp384r1) - 256 位对称安全 → 521 位 ECC(如 secp521r1) |
| 密钥大小 | 2048 位密钥 → 256 字节;4096 位 → 512 字节 | 256 位 ECC 密钥 → 32 字节;384 位 → 48 字节 |
| 性能表现 | - 公钥操作(验签、加密):中等速度 - 私钥操作(签名、解密):极慢(2048 位 RSA 签名比 256 位 ECC 慢 5-10 倍) - 密钥生成:慢(4096 位 RSA 密钥生成需数百毫秒) | - 公钥操作(验签、加密):快(比 RSA 快 2-3 倍) - 私钥操作(签名、解密):极快(比 RSA 快 5-10 倍) - 密钥生成:极快(毫秒级) |
| 带宽 / 存储开销 | 大(签名结果 / 密文体积大,如 2048 位 RSA 签名 256 字节) | 小(签名结果 / 密文体积小,如 Ed25519 签名仅 64 字节,是 RSA 的 1/4) |
| 实现复杂度 | 低(数学逻辑简单,参数选择容错率高) | 中高(曲线参数需严格合规,侧信道攻击防护要求高,劣质实现易导致安全漏洞) |
| 兼容性 | 极高(支持所有旧系统、硬件设备,无兼容门槛) | 高(主流系统 / 库原生支持,但部分老旧设备(如 legacy 嵌入式设备)可能不兼容) |
| 量子计算风险 | 高(Shor 算法可高效破解大整数分解) | 高(Shor 算法可破解 ECDLP),但相同安全等级下,ECC 抗量子攻击的「安全冗余」略优于 RSA |
| 标准归属 | 国际通用标准(PKCS#1、RFC 8017) | 国际标准(NIST FIPS 186-4、RFC 8032)+ 国密标准(SM2,GM/T 0003-2012) |
| 典型应用场景 | 1. 证书签名(如 HTTPS 根证书、代码签名) 2. 加密少量数据(如对称密钥交换) 3. 老旧系统兼容场景 | 1. 高并发 API 签名 / 验签 2. 区块链(交易签名、零知识证明) 3. 移动设备 / 物联网(资源受限场景) 4. 国密合规场景(SM2) 5. TLS 1.3 密钥交换 |
| Golang 支持 | 标准库 crypto/rsa 原生支持(签名、加密、密钥生成) | 标准库支持: - crypto/ecdsa(secp256r1/P384/P521)- crypto/ed25519(Ed25519 签名)- x/crypto/curve25519(密钥交换)国密支持: github.com/tjfoc/gmsm(SM2) |
通过上面的对比,一般都会选用 ECC 椭圆曲线算法生成公私钥。
常用的为:SM2(secp256v1)、secp256r1、secp256k1
- secp256k1 算法,使用 github.com/ethereum/go-ethereum/crypto/secp256k1
- secp256r1 算法,使用 crypto/ecdsa
- secp256v1 算法,使用的是 github.com/tjfoc/gmsm v1.4.1
三、哈希算法(数据摘要)
哈希算法分类
按用途可分为两类,核心差异是 “安全性优先” 还是 “性能优先”:
- 加密型哈希算法:侧重密码学安全(抗碰撞、单向性),用于数据加密、身份认证等场景;
- 非加密型哈希算法:侧重计算性能,用于普通数据处理(无安全要求)。
(一)非加密型哈希算法(性能优先)
这类算法不保证密码学安全,但计算速度极快,适合非安全场景。
1. CRC 系列(循环冗余校验)
- 原理:将数据视为二进制多项式,除以预设的 “生成多项式”,余数即为 CRC 值(基于二进制除法的校验逻辑);
- 常用版本:CRC8(8 位输出)、CRC16(16 位)、CRC32(32 位)、CRC64(64 位);
- 特点:硬件实现友好(如网卡、存储芯片),计算速度秒杀加密型哈希,但碰撞易构造(无安全性);
- 典型应用:压缩包 / 文件快速校验(如 ZIP、RAR 的 CRC32 校验)、网络数据包校验(防止传输错误)、硬盘坏道检测。
2. MurmurHash
- 设计目标:高性能、低碰撞率(非加密),由 Austin Appleby 设计;
- 主流版本:MurmurHash3(替代老旧的 1/2 版本),支持 32 位 / 64 位输出;
- 特点:雪崩效应优秀,碰撞率远低于 CRC,速度比 SHA-2 快 10 倍以上;
- 典型应用:Redis 哈希表底层、Java HashMap 优化、分布式系统一致性哈希(如 Kafka 分片)、大数据处理(Hadoop/Spark)。
3. CityHash
- 背景:Google 开发,针对 64 位处理器优化;
- 特点:比 MurmurHash 更快(尤其处理长字符串),碰撞率更低;
- 典型应用:Google 内部分布式系统、大数据文本处理。
4. FNV 哈希(Fowler-Noll-Vo)
- 原理:基于简单的位运算 + 乘法(FNV-1/FNV-1a),实现成本极低;
- 版本:FNV-32/64/128;
- 特点:代码行数少(可手写),速度快,碰撞率中等;
- 典型应用:小型内存哈希表、嵌入式系统数据索引。
(二)加密型哈希算法(安全优先)
这类算法是密码学核心,需满足严格的抗碰撞、单向性要求。
1. MD5(Message-Digest Algorithm 5)
- 背景:1992 年由 Ron Rivest 设计,输出 128 位哈希值(通常表示为 32 位十六进制字符串);
- 计算过程:将输入分块(512 位 / 块)→ 初始化 4 个 32 位寄存器 → 四轮循环运算 → 拼接寄存器结果;
- 现状:已完全不安全(2004 年王小云团队证明 MD5 存在强碰撞,2017 年可秒级构造碰撞数据);
- 应用:仅用于非安全场景的完整性校验(如普通文件下载校验,不涉及密码 / 隐私),密码学场景已彻底淘汰。
2. SHA 系列(Secure Hash Algorithm)
由美国 NIST(国家标准与技术研究院)制定,是目前最主流的加密型哈希算法,分三代:
| 版本 | 输出长度 | 安全性 | 典型应用 | 现状 |
|---|---|---|---|---|
| SHA-1 | 160 位 | 已被攻破(2017 年谷歌公开碰撞攻击) | 曾用于 HTTPS、Git 提交 | 已弃用 |
| SHA-2 | SHA-256(256 位) SHA-512(512 位) | 无有效碰撞攻击,安全 | HTTPS(TLS 1.2/1.3)、比特币挖矿(SHA-256)、密码存储(加盐) | 目前主流,推荐使用 |
| SHA-3 | SHA3-256(256 位) SHA3-512(512 位) | 抗量子攻击潜力(相对),安全 | 新一代密码学场景(如区块链、国密替代) | 逐步普及,补充 SHA-2 |
- 关键说明:
- SHA-2 是当前核心(如 SHA-256),比特币挖矿本质是暴力计算 SHA-256 哈希值以满足特定条件;
- SHA-3(原名 Keccak)与 SHA-2 无技术关联,基于 “海绵结构”,抗量子攻击能力优于 SHA-2。
3. HMAC(Hash-based Message Authentication Code)
- 本质:不是独立哈希算法,而是 “哈希算法 + 密钥” 的组合(消息认证码);
- 原理:将密钥与消息分两次哈希(
HMAC = H( (K ⊕ opad) || H( (K ⊕ ipad) || 消息 ) )),既校验数据完整性,又验证发送方身份(防止篡改 + 伪造); - 常用变体:HMAC-SHA256(主流)、HMAC-SHA1(逐步淘汰)、HMAC-MD5(仅兼容);
- 典型应用:API 接口签名(微信支付 / 阿里云 API)、TLS 握手认证、用户登录令牌校验。
哈希算法的典型应用场景
- 密码存储:不存储明文密码,仅存储 “密码 + 随机盐” 的哈希值(如 SHA-256 + 盐),即使哈希值泄露,也无法反推明文;
- 数据完整性校验:文件下载后对比哈希值(如 Linux 系统 ISO 镜像的 SHA-256 值),防止篡改 / 传输错误;
- 数字签名:结合非对称加密(如 SHA-256+RSA),验证数据来源和完整性(如电子合同、软件签名);
- 哈希表 / 缓存:MurmurHash/CRC 用于 HashMap、Redis 等,实现 O (1) 级快速查找;
- 分布式系统:一致性哈希(MurmurHash)实现数据分片 / 负载均衡(如 Kafka、Elasticsearch);
- 区块链:比特币(SHA-256)、以太坊(Keccak-256/SHA3-256)用于区块哈希计算和挖矿。
| 场景类型 | 推荐算法 | 避坑提醒 |
|---|---|---|
| 非安全快速校验 | CRC32、MurmurHash3 | 不要用于密码 / 隐私数据 |
| 密码学安全场景 | SHA-256、SM3(国内) | 禁用 MD5/SHA-1 |
| 消息认证(验签) | HMAC-SHA256 | 密钥需妥善保管,避免硬编码 |
| 未来兼容 | SHA3-256、SM3 | 提前适配抗量子攻击算法 |
哈希算法加盐
哈希加盐是针对密码存储场景的核心安全优化手段,解决了单纯哈希密码易被彩虹表、撞库攻击破解的问题。
一、为什么需要加盐?
单纯对密码做哈希(如 SHA-256 ("123456"))存在致命缺陷:
- 彩虹表攻击:黑客预计算海量常见密码(如 123456、admin)的哈希值,制成「明文 - 哈希值」对照表(彩虹表),只需对比数据库中的哈希值,就能秒级反推出明文密码;
- 批量撞库:若多个用户用相同密码,不加盐的哈希值完全一致,黑客破解一个就能批量破解所有相同密码的账户;
- 快速暴力破解:SHA-256、MD5 等哈希算法计算极快(每秒数亿次),黑客可暴力枚举简单密码。
加盐的核心价值:让相同密码生成不同哈希值,彻底失效彩虹表,大幅提升破解成本。
二、加盐的核心原理
「盐(Salt)」是一段随机生成、足够长度、唯一的字符串,将其与明文密码拼接后再计算哈希值,最终存储「盐 + 哈希值」(而非密码本身)。
核心公式
哈希值 = Hash(盐 + 明文密码) (或 哈希值 = Hash(明文密码 + 盐))
- 盐的特性:每个用户 / 每次密码修改都生成独立盐(而非全局固定盐),长度至少 16 位(推荐 32 位),由随机字母、数字、符号组成;
- 验证逻辑:用户登录时,系统取出该用户的盐,与输入密码拼接后计算哈希,对比是否与存储的哈希值一致。
三、进阶:单纯加盐仍不够,需结合「慢哈希算法」
单纯加盐 + SHA-256 仍有风险:SHA-256 计算速度极快(GPU 每秒可算数十亿次),黑客可暴力枚举「盐 + 密码」组合。因此密码存储必须用「慢哈希算法」(专为密码设计,通过多次迭代增加计算耗时),常见的有:
| 算法 | 核心特点 | 推荐度 |
|---|---|---|
| BCrypt | 基于 Blowfish 加密,自带随机盐(无需手动生成),可调整 cost 因子(越大越慢) | ★★★★★ |
| PBKDF2 | 多次迭代哈希(如 10 万次 SHA-256),NIST 推荐,兼容性好 | ★★★★☆ |
| Argon2 | 2015 年密码哈希竞赛冠军,支持「计算 + 内存」双重复杂度,抗 GPU 破解最优 | ★★★★★ |
四、加盐的常见误区(避坑重点)
- 使用固定盐:如所有用户共用一个盐(如 "salt123"),黑客只需针对该盐重新生成彩虹表,加盐等于失效;
- 盐长度过短:如 4 位数字盐(0000-9999),黑客可暴力枚举所有盐,再结合彩虹表破解;
- 只加盐不做慢哈希:仅用 SHA-256 加盐,计算速度仍快,黑客可暴力破解简单密码;
- 盐不存储 / 分开存储:盐必须和哈希值存在同一行(如数据库同字段),若盐丢失,无法验证密码;
- 手动拼接逻辑漏洞:如密码和盐的编码不一致(UTF-8/GBK 混淆),导致验证失败;
- 复用盐:同一用户修改密码后仍用旧盐,降低安全性(需每次生成新盐)。
密码机 HSM
HSM 的全称是 Hardware Security Module,即硬件安全模块。 它是一种专为密码学操作和数字密钥管理而设计的物理计算设备,可以理解为一个高度安全、防篡改的“保险箱”,里面保管着系统最核心的机密——加密密钥,并在此安全边界内执行所有关键操作。
它是一个专用的、加固的、可信任的硬件“黑盒”。其设计哲学是:密钥永远不应该以明文形式出现在 HSM 之外。所有涉及密钥的操作(如加密、解密、签名)都在 HSM 内部完成,外部只能得到处理结果。
核心功能:
- 密钥的全生命周期管理:
- 安全生成:在设备内部真随机数生成器中创建高强度密钥。
- 安全存储:密钥被存储在受硬件保护的、不可提取的区域。
- 安全使用:所有加密运算在芯片内部完成,密钥本身绝不外泄。
- 备份与恢复:通常通过将密钥加密成多个“密钥分量”,由不同人员保管,确保即使设备损坏,密钥也能安全恢复。
- 执行密码学操作:
- 加密/解密
- 数字签名与验证
- 生成和验证消息认证码
- 真随机数生成
- 提供物理和逻辑安全:
- 防篡改:外壳带有入侵自毁机制,一旦被物理打开或探测,会自动清零所有密钥。
- 防旁路攻击:能抵抗功耗分析、时序攻击等侧信道攻击。
- 严格的访问控制:需要通过多因素认证(如智能卡+密码)才能使用,并支持细粒度的权限分离(例如,某人只能用来签名,但不能查看密钥)。
密码机是一种硬件密码机,所以需要密码机提供出签名,验签等方法。