第2章 国密接口分类:先看清再动手

好,咱们正式开始聊国密接口。

很多同学一上来就问:“国密接口到底长啥样?” 我的回答通常是:你先别管它长啥样,先搞清楚它分几类。分清楚类,你才知道测试用例该往哪个方向写。

刚入行那会儿,我拿到一份密码模块的接口文档,整整200页。硬啃了两天,发现其实核心就4类东西。搞懂这4类,剩下的全是细枝末节。

国密接口的核心四分类:

  • 密码算法API —— 算力基础
  • 密钥管理API —— 安全基石
  • 证书接口 —— 身份信任链
  • 签名验签接口 —— 数据完整性保障

下面我一个个拆开讲。讲的时候我会穿插一些项目里踩过的坑,你听着会更有感觉。

2.1 密码算法API:最底层的算力

密码算法API,说白了就是提供加密、解密、哈希运算的底层接口。SM2、SM3、SM4、SM9,这些算法你都得能调得动。

我建议你测试时重点关注三个维度:

  • 算法支持度:接口到底支不支持SM2/SM3/SM4?支持到什么版本?有些老实现SM4只有ECB模式,没有CBC模式,这就是兼容性隐患。
  • 参数完整性:密钥长度、初始向量、填充模式,这些参数能不能传?传错了给什么错误码?
  • 性能基线:单次加密/解密耗时多少?开1000个线程并发会崩溃吗?

举个例子。我在测试一款国产密码卡时,SM3哈希接口返回的结果长度是31字节,不是标准的32字节。当时我差点以为是算法实现错了,后来查了内核驱动版本才发现,是内部一个指针偏移算错了。这种问题不跑边界测试根本抓不出来。

测试小技巧: 对密码算法API,永远准备两份数据——一份是标准向量(国标附录),一份是异常向量(空输入、长输入、非法密钥)。两个都跑通才算过关。

2.2 密钥管理API:安全的基石

密钥管理接口,我愿称之为“最容易被忽视的雷区”。很多团队测算法测得很嗨,一到密钥管理就随便点点完事。结果出问题的全是密钥管理。

密钥管理API主要有以下操作:

  1. 密钥生成:SM2密钥对、SM4会话密钥。随机数质量够不够?有没有重复?
  2. 密钥导入/导出:明文还是密文?格式是PKCS#8还是自定义结构?
  3. 密钥存储:存哪里了?软存储还是硬安全芯片?能不能被非授权读取?
  4. 密钥销毁:用完的密钥真清干净了吗?内存里残留就麻烦了。

我曾经接过一个项目,客户的密码机密钥导出接口有两个版本:一个输出PEM格式,一个输出DER格式。文档里写的是“支持两种标准格式”,但实际测试发现,PEM格式的头部注释写错了,导致第三方解析失败。你想想看,这种问题只靠“看着通”是测不出来的,必须得真拿解析器去解一遍。

注意: 密钥生命周期管理是密码合规检查的重点。尤其密钥销毁,大部分接口只做了“标记删除”,实际数据还在内存里。合规审计时这是致命漏洞。

2.3 证书接口:身份信任链

证书接口,管的是X.509证书的签发、验证、解析。国密这边,SM2证书的结构跟RSA证书不太一样,很多现成的通用库不兼容。

证书接口常见的操作:

  • 证书链验证:根证书 -> 中间CA -> 终端证书。路径长度、有效期、吊销状态,全得验。
  • 证书格式转换:PEM、DER、PKCS#7、PKCS#12。每个换了个壳,解析逻辑就可能不一样。
  • CRL/OCSP查询:证书吊销了怎么办?接口支不支持实时查询?

我印象最深的一次,是测一个电子签章平台的证书解析接口。它读入SM2证书时,公钥长度解析对了,但曲线参数标识读错了。结果签名验签成功,但公钥导出后曲线不对,别的模块根本用不了。嗯,这种问题只能靠全流程联调才能暴露。

2.4 签名验签接口:数据完整性保障

签名验签接口,是最能体现“兼容性”难度的。因为签名结果谁都能验,但标准不统一就会出幺蛾子。

签名验签的测试点:

测试项 说明 常见坑
签名算法版本 SM2签名主版本号、子版本 不同厂商实现标准有偏移
签名值编码格式 ASN.1 DER / 原始R+S拼接 格式不匹配,验签直接失败
原文预处理 是否做SM3哈希再签名 有的接口内部自动做,有的让你自己先哈希
空签名验签 长度为0的签名值 部分接口直接崩溃

有个真实案例。某支付系统对接两家密码厂商,A厂签名结果输出的是ASN.1 DER编码的r||s,B厂输出的是固定64字节的r+s拼接。结果数据交换时,两边怎么都验不过。查了一天,才发现是编码格式问题。你说冤不冤?

我的建议: 签名验签接口做兼容性测试,务必准备一个“标准互认用例”。用国密局官方的测试向量签一次,验一次,两边结果一致才算过。不要相信“我觉得能验过”。

2.5 四类接口的关系

这四类接口不是孤立的。

国密接口四类关系图 密码算法API 密钥管理API 证书接口 签名验签接口 密码算法API是底层算力,密钥管理API提供材料,证书接口建立信任,签名验签接口完成最终操作。

从图上你看得出来,密码算法API是中心节点。密钥管理API给它提供密钥材料,证书接口给它提供公钥/私钥对,最后签名验签API在算法之上封装业务逻辑。

这意味着什么?意味着你测试单接口的时候,得知道它在整个链条里承担什么角色。单纯测一个SM2签名接口通过,不代表整个链路能跑通。密钥对不匹配、证书链不完整,都会导致签名验签失败。

我个人习惯是把四类接口的测试设计成“分段验证 + 端到端验证”双模式。分段验证确保每个接口自身没问题,端到端验证模拟真实业务场景。两条线并行,覆盖率才够。

好,这一章就先到这儿。记住这四类接口的分类,后面每类展开讲的时候,你心里有地图,不会迷路。