跳到主要内容

加密算法

国密算法 + 密码机 HSM 模块,上海 CA 是 HSM 中的一种。其实密码机就是一个硬件,我们服务在使用密钥的时候,都去调用密码机进行操作。

国密算法

国密算法 (SM 系列) 是由中国国家密码管理局认定的国产密码算法体系:

一、对称加密算法(加密解密使用同一密钥)

SM4(分组密码,最常用)

  • 分组长度和密钥长度均为 128 位
  • 公开算法,2012 年正式发布
  • 应用广泛:通信加密、VPN、物联网设备等
🔐 国密标准
(分组密码)
SM1/SM4128 位✅ 中国商用密码标准。SM1 硬件实现为主;SM4 可用于软硬件,重要性等同国内 AES。

二、非对称加密算法(公钥加密,私钥解密)

SM2(椭圆曲线公钥密码)

  • 公开算法,2010 年发布,是国密体系核心
  • 功能包括:数字签名、密钥交换、公钥加密
  • 替代 RSA/ECDSA,安全性更高,密钥长度更短

特点:

SM2 签名强制绑定国密 SM3 哈希算法(256 位),好处就是,可以先计算出一个摘要,然后对摘要进行签名。例如,如果要签名的数据很大有 1G 这种, 此种方法就极大加速了签名的速度。

三、哈希算法(数据摘要)

SM3(杂凑算法)

  • 公开算法,2010 年发布
  • 输出 256 位摘要,替代 MD5/SHA-1
  • 应用于数字签名、完整性验证、密码杂凑等

使用的包为同济开源的包(github.com/tjfoc/gmsm)

国际算法标准

对称加密算法

AES

  • 特点:加解密速度快,安全性极高,硬件支持好。
  • 模式:需配合工作模式使用,如  ECB(不推荐)、CBC(常用)、CTRGCM(可同时加密和认证,推荐)。
  • 应用:无线通信(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. 加密型哈希算法:侧重密码学安全(抗碰撞、单向性),用于数据加密、身份认证等场景;
  2. 非加密型哈希算法:侧重计算性能,用于普通数据处理(无安全要求)。
(一)非加密型哈希算法(性能优先)

这类算法不保证密码学安全,但计算速度极快,适合非安全场景。

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-1160 位已被攻破(2017 年谷歌公开碰撞攻击)曾用于 HTTPS、Git 提交已弃用
SHA-2SHA-256(256 位)

SHA-512(512 位)
无有效碰撞攻击,安全HTTPS(TLS 1.2/1.3)、比特币挖矿(SHA-256)、密码存储(加盐)目前主流,推荐使用
SHA-3SHA3-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 握手认证、用户登录令牌校验。

哈希算法的典型应用场景

  1. 密码存储:不存储明文密码,仅存储 “密码 + 随机盐” 的哈希值(如 SHA-256 + 盐),即使哈希值泄露,也无法反推明文;
  2. 数据完整性校验:文件下载后对比哈希值(如 Linux 系统 ISO 镜像的 SHA-256 值),防止篡改 / 传输错误;
  3. 数字签名:结合非对称加密(如 SHA-256+RSA),验证数据来源和完整性(如电子合同、软件签名);
  4. 哈希表 / 缓存:MurmurHash/CRC 用于 HashMap、Redis 等,实现 O (1) 级快速查找;
  5. 分布式系统:一致性哈希(MurmurHash)实现数据分片 / 负载均衡(如 Kafka、Elasticsearch);
  6. 区块链:比特币(SHA-256)、以太坊(Keccak-256/SHA3-256)用于区块哈希计算和挖矿。
场景类型推荐算法避坑提醒
非安全快速校验CRC32、MurmurHash3不要用于密码 / 隐私数据
密码学安全场景SHA-256、SM3(国内)禁用 MD5/SHA-1
消息认证(验签)HMAC-SHA256密钥需妥善保管,避免硬编码
未来兼容SHA3-256、SM3提前适配抗量子攻击算法

哈希算法加盐

哈希加盐是针对密码存储场景的核心安全优化手段,解决了单纯哈希密码易被彩虹表、撞库攻击破解的问题。

一、为什么需要加盐?

单纯对密码做哈希(如 SHA-256 ("123456"))存在致命缺陷:

  1. 彩虹表攻击:黑客预计算海量常见密码(如 123456、admin)的哈希值,制成「明文 - 哈希值」对照表(彩虹表),只需对比数据库中的哈希值,就能秒级反推出明文密码;
  2. 批量撞库:若多个用户用相同密码,不加盐的哈希值完全一致,黑客破解一个就能批量破解所有相同密码的账户;
  3. 快速暴力破解:SHA-256、MD5 等哈希算法计算极快(每秒数亿次),黑客可暴力枚举简单密码。

加盐的核心价值:让相同密码生成不同哈希值,彻底失效彩虹表,大幅提升破解成本。

二、加盐的核心原理

「盐(Salt)」是一段随机生成、足够长度、唯一的字符串,将其与明文密码拼接后再计算哈希值,最终存储「盐 + 哈希值」(而非密码本身)。

核心公式
哈希值 = Hash(盐 + 明文密码)  (或 哈希值 = Hash(明文密码 + 盐))
  • 盐的特性:每个用户 / 每次密码修改都生成独立盐(而非全局固定盐),长度至少 16 位(推荐 32 位),由随机字母、数字、符号组成;
  • 验证逻辑:用户登录时,系统取出该用户的盐,与输入密码拼接后计算哈希,对比是否与存储的哈希值一致。

三、进阶:单纯加盐仍不够,需结合「慢哈希算法」

单纯加盐 + SHA-256 仍有风险:SHA-256 计算速度极快(GPU 每秒可算数十亿次),黑客可暴力枚举「盐 + 密码」组合。因此密码存储必须用「慢哈希算法」(专为密码设计,通过多次迭代增加计算耗时),常见的有:

算法核心特点推荐度
BCrypt基于 Blowfish 加密,自带随机盐(无需手动生成),可调整 cost 因子(越大越慢)★★★★★
PBKDF2多次迭代哈希(如 10 万次 SHA-256),NIST 推荐,兼容性好★★★★☆
Argon22015 年密码哈希竞赛冠军,支持「计算 + 内存」双重复杂度,抗 GPU 破解最优★★★★★
四、加盐的常见误区(避坑重点)
  1. 使用固定盐:如所有用户共用一个盐(如 "salt123"),黑客只需针对该盐重新生成彩虹表,加盐等于失效;
  2. 盐长度过短:如 4 位数字盐(0000-9999),黑客可暴力枚举所有盐,再结合彩虹表破解;
  3. 只加盐不做慢哈希:仅用 SHA-256 加盐,计算速度仍快,黑客可暴力破解简单密码;
  4. 盐不存储 / 分开存储:盐必须和哈希值存在同一行(如数据库同字段),若盐丢失,无法验证密码;
  5. 手动拼接逻辑漏洞:如密码和盐的编码不一致(UTF-8/GBK 混淆),导致验证失败;
  6. 复用盐:同一用户修改密码后仍用旧盐,降低安全性(需每次生成新盐)。

密码机 HSM

HSM 的全称是 Hardware Security Module,即硬件安全模块。  它是一种专为密码学操作和数字密钥管理而设计的物理计算设备,可以理解为一个高度安全、防篡改的“保险箱”,里面保管着系统最核心的机密——加密密钥,并在此安全边界内执行所有关键操作。

它是一个专用的、加固的、可信任的硬件“黑盒”。其设计哲学是:密钥永远不应该以明文形式出现在 HSM 之外。所有涉及密钥的操作(如加密、解密、签名)都在 HSM 内部完成,外部只能得到处理结果。

核心功能:

  1. 密钥的全生命周期管理
    • 安全生成:在设备内部真随机数生成器中创建高强度密钥。
    • 安全存储:密钥被存储在受硬件保护的、不可提取的区域。
    • 安全使用:所有加密运算在芯片内部完成,密钥本身绝不外泄。
    • 备份与恢复:通常通过将密钥加密成多个“密钥分量”,由不同人员保管,确保即使设备损坏,密钥也能安全恢复。
  2. 执行密码学操作
    • 加密/解密
    • 数字签名与验证
    • 生成和验证消息认证码
    • 真随机数生成
  3. 提供物理和逻辑安全
    • 防篡改:外壳带有入侵自毁机制,一旦被物理打开或探测,会自动清零所有密钥。
    • 防旁路攻击:能抵抗功耗分析、时序攻击等侧信道攻击。
    • 严格的访问控制:需要通过多因素认证(如智能卡+密码)才能使用,并支持细粒度的权限分离(例如,某人只能用来签名,但不能查看密钥)。

密码机是一种硬件密码机,所以需要密码机提供出签名,验签等方法。