在商用密码应用安全性评估(简称“密评”)以及日常的网络安全评估中,国密算法(SM2、SM3、SM4)的落地应用是核心考点。很多技术人员在面对抓包分析、协议握手和数据库落盘时,往往容易把各种算法的作用和组合方式记混。
为了能先彻底搞懂、再结合实战应用,我们可以把这几个算法想象成一套“银行安保系统”,带大家从底层原理出发,一路看到抓包实战与数据库落盘。
一、 算法三剑客:各司其职的“安保小队”
用一个通俗的生活场景来对号入座,这三个算法的作用一目了然:
SM4(对称加密)—— 上了锁的运钞铁柜
特点:加解密用的是同一把钥匙,速度极快。
作用:专门用来保护海量数据的机密性(防止别人看)。箱子锁上后,别人拿到了也看不懂里面的明文。
SM2(非对称加密/签名)—— 双钥防伪信箱 / 专属数字印章
特点:成对出现,分为公钥(公开投递)和私钥(自己开箱)。
作用:专门用来做身份鉴别和数字签名(防止别人假冒,证明“你真的是你”)。
SM3(杂凑/哈希算法)—— 火眼金睛的 24 小时电子哨兵
特点:单向不可逆,具有“雪崩效应”(哪怕改动一个标点符号,算出来的特征码都会面目全非)。
作用:不管输入多大的文件,它都能瞬间算出一段独一无二的“数字指纹”。只要内容被动过,指纹立刻对不上。
二、 实战演练:从抓包看网络传输与身份鉴别
理解了底层原理后,我们在分析系统登录或通信时,通过 Wireshark 抓包(如 TLCP 国密双向协议),就能一眼认出它们在不同阶段的协同作战:
1. 身份鉴别阶段:SM2 + SM3
在哪里看:在 TLS/TLCP 握手包中的 Certificate(证书) 环节。
怎么用:服务器会出示自己的国密双证书(签名证书和加密证书)。证书内部的公私钥以及防伪数字签名正是基于 SM2-with-SM3 算法。
目的:客户端通过验证这个签名,确认正在连接的是“官方正品”服务器,完美防范钓鱼劫持。
整体流程

抓包记录:

2. 数据传输阶段:SM4 + SM3
在哪里看:在 Server Hello 报文的 Cipher Suite(密码套件) 中(例如常见的ECC_SM4_CBC_SM3)。
怎么用:服务器在握手中“拍板”选定传输算法。后续双方向后传输的所有业务数据,都会通过 SM4 进行对称加密(防窃听),同时嵌入 SM3 保证数据在网上传输时没有被中间人篡改(防篡改)。
整体流程

3.数据存储安全 SM4 + HMAC-SM3
数据在网络上安全传输到达服务器后,解密并写入数据库,这就进入了数据存储安全阶段。在这里,合规的关键不仅在于“加密”,更在于“防篡改”。
很多系统仅仅对敏感字段做了 SM4 加密落盘,却忽略了完整性保护,这在密评中是典型的缺陷。为了防范内部高权限管理员或黑客绕过应用层、直接在数据库后台偷偷修改密文,HMAC-SM3(基于密钥的杂凑消息认证码)就登场了。
1. 为什么纯 SM3 还不够?必须用 HMAC-SM3?
纯 SM3 就像是一份公开的“防伪指纹”,任何人只要拿到数据都可以重新算一遍。如果黑客在后台偷偷篡改了密文,顺手用纯 SM3 重新算了个新指纹换上去,系统就可能被骗过。
HMAC-SM3 在 SM3 的基础上强行引入了一个只有系统内部知道的“秘密密钥(Secret Key)”。黑客虽然能改数据,但他没有这个秘密密钥,根本无法伪造出合法的指纹。只要数据被动过,系统一校验就会立刻报警。
2. HMAC-SM3 在数据库里是怎么落地的?(效果展示)
在实际企业级 Java 开发中(如配合 Hutool 工具包),HMAC-SM3 的落地方案主要有两种:
方案一:独立成列(字段分开存)
数据库表结构中,除了常规的密文字段,专门开辟一列来存放校验码。
import cn.hutool.crypto.digest.HMac;
import cn.hutool.crypto.digest.HmacAlgorithm;
public class Sm3MacDemo {
public static void main(String[] args) {
byte[] secretKey = "my_secret_key_16".getBytes();
// 使用 HmacSM3 算法
HMac hMac = new HMac(HmacAlgorithm.HmacSM3, secretKey);
String ciphertext = "7d8f9b2c4e5a6789abcdef0123456789"; // 模拟 SM4 密文
String macHex = hMac.digestHex(ciphertext); // 计算防伪指纹
System.out.println("密文存入列: " + ciphertext);
System.out.println("MAC存入列: " + macHex);
}
}
数据库实际查出来的展示效果:

特点:结构直观,做密评或审计时一目了然
方案二:融合打包(密文与 MAC 拼成一个字段)
为了保持数据库表结构简洁,不增加新列,很多加密组件会将密文与校验码像“肉夹馍”一样打包存入同一个字段中。
import cn.hutool.crypto.digest.HMac;
import cn.hutool.crypto.digest.HmacAlgorithm;
import cn.hutool.core.util.HexUtil;
public class FusionDemo {
public static void main(String[] args) {
byte[] secretKey = "my_secret_key_16".getBytes();
HMac hMac = new HMac(HmacAlgorithm.HmacSM3, secretKey);
byte[] ciphertextBytes = HexUtil.decodeHex("7d8f9b2c4e5a6789abcdef0123456789");
byte[] macBytes = hMac.digest(ciphertextBytes);
// 融合打包:将密文字节与 MAC 字节拼在一起,再转成 Hex
byte[] fusedBytes = new byte[ciphertextBytes.length + macBytes.length];
System.arraycopy(ciphertextBytes, 0, fusedBytes, 0, ciphertextBytes.length);
System.arraycopy(macBytes, 0, fusedBytes, ciphertextBytes.length, macBytes.length);
String storedValue = HexUtil.encodeHexStr(fusedBytes);
System.out.println("数据库单一字段存入: " + storedValue);
}
}
数据库实际查出来的展示效果:

效果:表面上看是一长串连续的 Hex 字符(前半部分为 SM4 密文,末尾直接粘着 HMAC-SM3 指纹),对业务表结构零侵入。
整体流程

抓包记录:

四、 总结速查表
将这三个阶段串联起来,国密算法在系统中的全生命周期防护便一目了然:

评论列表