1. 这不是教科书里的“方案设计”,而是密码落地前的生死线
你拿到一份《商用密码应用与安全性评估》第四章,翻到4.1节“密码应用方案设计”,第一反应可能是:这不就是画个流程图、列几个算法、抄几条国标条款?我见过太多项目组把这一节当成“文档填空题”——等系统快上线了,临时拉个安全工程师,花两天时间补一份《XX系统密码应用方案》,算法选SM4、密钥用HSM存、签名用SM2,再套上GB/T 39786-2021的模板表格,交差完事。结果呢?等正式做密评时,测评机构一问:“你们密钥怎么生成?谁管生命周期?密文存储格式是否兼容历史数据?SM2签名验签失败时的错误码怎么定义?”,现场一片沉默。方案纸上写得漂亮,系统里根本跑不通。这不是技术问题,是认知偏差。
密码应用方案设计,本质是一场面向真实业务场景的“密码可行性预演”。它不是在定义“应该用什么”,而是在回答“在你这个系统里,密码到底能不能用、怎么用才不崩、出了问题怎么兜底”。它要穿透业务逻辑、技术栈、运维习惯、甚至开发人员的编码能力——比如你让Java后端用Bouncy Castle调SM2,但团队主力用Spring Boot 3.x,而官方starter对国密支持还不完善;又比如你要求数据库字段级加密,但DBA坚持用MySQL 5.7,而它的透明数据加密(TDE)根本不支持SM4。这些细节,不提前在方案里掐住,后面全是雷。
我做过17个密评项目,其中12个卡在方案设计环节返工。最典型的一次,某政务APP的方案里写着“用户登录态使用SM4-CBC加密存储”,但没写初始化向量(IV)怎么生成——开发直接用固定IV,导致所有用户token加密后都一样,被渗透测试一抓一个准。方案里漏掉一个参数,上线后就是高危漏洞。所以本篇不讲国标条文怎么背,只讲我在一线踩坑、复盘、验证过的4.1节实操内核:如何把“密码应用方案”从纸面文档,变成可执行、可验证、可兜底的技术蓝图。适合正在准备密评的系统建设方、集成商、安全顾问,也适合刚接触商用密码的开发和架构师——你不需要懂椭圆曲线数学,但必须知道SM2签名在HTTP Header里传时,Base64编码要不要换行、URL安全字符怎么处理。
2. 方案设计不是写作文,而是做三重压力测试
很多人把方案设计理解成“选算法+套标准”,这是最大的误区。真正的方案设计,核心是做三重压力测试:业务流压力测试、技术栈压力测试、运维链路压力测试。每一重,都决定着密码功能最终是“能用”还是“真用”。
2.1 业务流压力测试:密码不能打断用户一秒操作
密码不是加在系统外面的一层壳,而是嵌进业务毛细血管里的活体组织。方案设计第一步,必须拿着业务流程图,逐节点问:这里加密码,用户感知是什么?系统性能损失多少?失败时业务怎么降级?
以“电子合同签署”为例,标准流程是:用户上传PDF → 系统生成哈希 → 调用签名服务 → 返回带SM2签名的合同包。表面看很顺,但实测发现三个致命点:
- 哈希计算耗时:一个10MB PDF,Java原生MessageDigest计算SHA256要300ms,换成SM3后升到480ms。如果前端没做loading提示,用户会以为卡死点刷新,导致重复提交。
- 签名服务响应抖动:HSM硬件签名平均耗时80ms,但P99延迟达320ms。高峰期大量请求排队,超时设置不合理(如设为200ms),就会批量失败。
- 签名失败无业务兜底:方案里只写“签名失败返回错误”,但没定义具体错误码。前端收到500就弹“系统异常”,用户不知道是网络问题、证书过期还是HSM离线,客服接到投诉全靠猜。
我的解法是,在方案里强制加入业务影响量化表:
| 业务节点 | 密码操作 | 用户感知延迟阈值 | 实测P99延迟 | 是否需前端优化 | 失败降级策略 |
|---|---|---|---|---|---|
| 合同上传 | SM3哈希计算 | ≤200ms | 480ms | 必须加进度条+分片计算 | 降级为SHA256+告警 |
| 签名调用 | HSM SM2签名 | ≤150ms | 320ms | 必须加异步轮询+超时重试 | 本地缓存签名+人工复核通道 |
这张表不是摆设。它逼着架构师去压测、开发去改代码、产品去改交互。没有量化,方案就是空中楼阁。
2.2 技术栈压力测试:别让“支持国密”四个字骗了你
“我们系统支持国密”——这句话背后藏着无数陷阱。方案设计第二步,必须拿出技术栈清单,一项项撕开看:驱动层、框架层、中间件层、语言运行时层,是否真能跑通国密?
常见翻车点:
- JDK版本陷阱:OpenJDK 8u292+才原生支持SM2/SM3/SM4,但很多政企项目还在用Oracle JDK 8u181。强行用Bouncy Castle,会和Spring Security的CipherProvider冲突,启动报
NoSuchAlgorithmException。 - 数据库加密盲区:方案写“敏感字段SM4加密”,但MySQL 5.7的AES_ENCRYPT()函数不认SM4。有人用UDF(用户自定义函数)硬塞,结果主从同步时从库因缺少UDF直接挂掉。
- HTTPS双向认证断层:要求客户端证书用SM2,但Nginx 1.18以下版本不支持SM2证书校验,必须升级或换OpenResty。
我的实操方法是:在方案里嵌入“技术栈兼容性矩阵”,并附验证命令。例如针对JDK:
| 组件 | 要求 | 验证命令 | 通过标准 | 替代方案 |
|---|---|---|---|---|
| JDK | ≥8u292 或 ≥11.0.11 | java -version && java -cp bcprov-jdk15on-1.70.jar org.bouncycastle.crypto.params.ECDomainParameters | 输出SM2曲线参数 | 升级JDK或用国密SDK替代BC |
| Spring Boot | ≥2.6.0 | curl -X POST http://localhost:8080/actuator/health | 返回{"status":"UP","components":{"sm2":{"status":"UP"}}} | 自研Starter或接入信创中间件 |
这个矩阵必须由开发、运维、安全三方会签。我见过太多项目,方案评审时大家点头说“没问题”,等联调才发现JDK版本不够,耽误两周。
2.3 运维链路压力测试:密钥不是存在HSM里就万事大吉
方案里写“密钥由HSM统一管理”,听起来很安全。但HSM不是保险箱,是台需要保养的精密仪器。方案设计第三步,必须把密钥生命周期拆解到运维动作:谁申请?谁审批?谁分发?谁轮换?谁销毁?故障时怎么应急?
典型漏洞:
- 密钥分发无痕:HSM生成密钥后,管理员用U盘拷贝密钥文件给应用服务器。U盘丢了,密钥就泄露了。
- 轮换无灰度:方案写“每年轮换一次密钥”,但没写轮换期间新旧密钥并存时间。结果轮换当天,老密钥删了,新密钥配置漏了一台服务器,整个支付系统瘫痪3小时。
- 应急无预案:HSM宕机时,方案只写“联系厂商”,没定义降级模式。实际中,我们要求必须支持“HSM不可用时,自动切换至软件密钥池(KMS),且KMS密钥需预置SM2公钥用于验签”。
我的经验是:在方案里强制定义“密钥运维SOP卡片”,每张卡片包含5个要素:
- 触发条件(如:密钥使用满365天、HSM健康度<80%)
- 执行角色(如:密钥管理员+系统负责人双签)
- 操作命令(如:
hsm-cli --key-id SM2-2023-A --action rotate --valid-days 365) - 验证方式(如:调用
/api/v1/health/key返回{"status":"active","rotationDate":"2024-06-01"}) - 回滚步骤(如:执行
hsm-cli --key-id SM2-2023-A --action rollback)
这张卡片要打印出来贴在运维值班室墙上。方案不是写给领导看的,是写给明天值班的小王看的。
3. 方案设计的四大核心模块:从骨架到血肉
国家标准GB/T 39786-2021对方案设计有框架要求,但真正决定成败的是四个模块的填充质量。我把它拆解为:密码应用范围界定、密码技术路线选型、密码实现细节约定、密码管理机制设计。每个模块,都必须拒绝模糊表述,给出可执行、可检查、可审计的具体内容。
3.1 密码应用范围界定:精确到字段、接口、日志
很多方案失败,源于范围界定太宽泛。写“对用户身份信息加密”,却不说明是加密手机号、身份证号,还是全部字段;写“对传输数据加密”,却不明确是API Body加密,还是Header里的Token加密。这种模糊,等于没界定。
我的做法是:用“三维度定位法”锁定范围:
- 数据维度:列出所有涉及密码操作的数据实体(如:用户表、订单表、日志表),标注每个字段的密码操作类型(加密/签名/哈希/密钥派生)。
- 接口维度:梳理所有对外API,标注哪些接口需签名(如:
POST /api/v1/order/create)、哪些需加密(如:GET /api/v1/user/profile返回的身份证号)。 - 日志维度:明确哪些日志禁止明文记录密码相关数据(如:SM2私钥、SM4密钥、原始密码),哪些可记录脱敏后哈希值(如:
SM3(手机号))。
实操案例:某医保系统方案初稿写“对结算数据加密”。我们把它细化为:
- 数据维度:
settlement_amount(金额)→ SM4-CBC加密;patient_id_card(身份证号)→ SM4-ECB加密(因需索引);drug_list(药品列表)→ SM3哈希后存。 - 接口维度:
POST /api/v1/settlement请求Body整体SM4加密;GET /api/v1/settlement/{id}响应中patient_id_card字段SM4加密。 - 日志维度:Nginx access log禁止记录
patient_id_card;应用日志中settlement_amount记录为SM3(原始金额)。
这样,开发就知道该改哪行代码,测试就知道该测哪个字段,测评机构一眼就能核对。
3.2 密码技术路线选型:不是选算法,是选“能跑通的组合”
选型不是“SM2比RSA好”这种理论对比,而是“在这个系统里,SM2+HSM+Java 11+Spring Boot 3.1这套组合,能不能稳定扛住5000TPS”。我总结出技术路线选型四象限法则:
| 维度 | 高风险项(慎选) | 低风险项(首选) | 选择依据 | 实例 |
|---|---|---|---|---|
| 算法成熟度 | SM2纯软件实现(无HSM) | SM2硬件加速(HSM) | 纯软件SM2签名QPS≤200,HSM可达5000+ | 支付类系统必选HSM |
| 协议兼容性 | TLS 1.2 + SM2证书 | TLS 1.3 + 国密套件 | TLS 1.2对SM2支持碎片化,TLS 1.3国密套件已标准化 | 新建系统优先TLS 1.3 |
| 开发友好度 | 自研国密SDK | 主流框架国密插件(如Spring Crypto) | 自研SDK维护成本高,插件有社区支持 | Spring Boot项目选插件 |
| 运维可控性 | 密钥分散存储(多节点) | HSM集中托管 | 分散存储密钥同步难,HSM提供审计日志 | 中小系统选HSM |
关键点:必须附“选型验证报告”。例如选HSM,方案里要包含:
- 厂商型号(如:江南天安TASSL 3000)
- 驱动版本(如:tassl-jni-4.2.1.jar)
- 压测结果(如:单HSM节点,SM2签名QPS=4820,P99=92ms)
- 故障切换时间(如:主备HSM切换耗时≤3s)
没有验证数据的选型,都是赌博。
3.3 密码实现细节约定:参数、格式、错误码,一个都不能少
这是方案里最容易被忽略,却最致命的部分。国密算法有大量可配置参数,不同参数组合,会导致系统间无法互通。方案必须像API文档一样精确。
SM4加密必须约定的7个细节:
- 工作模式:明确是CBC还是ECB(ECB仅用于固定长度字段如身份证号)
- 填充方式:PKCS#7还是ZeroPadding(Java默认PKCS#5,需显式指定PKCS#7)
- IV生成规则:随机生成(每次不同)还是固定IV(仅用于ECB)
- 密钥长度:128bit(SM4标准)还是256bit(非标,需确认HSM支持)
- 密文编码:Base64(标准)还是Hex(调试友好)还是URL-safe Base64(Web传输)
- 密文结构:纯密文,还是
IV||密文拼接(必须约定分隔符) - 错误码定义:
ERR_SM4_KEY_INVALID(密钥错误) vsERR_SM4_IV_MISMATCH(IV错误)
实操教训:某项目SM4用CBC模式,方案没约定IV传递方式。前端用crypto-js生成IV并Base64编码,后端用JavaCipher解密时,因crypto-js的Base64编码末尾有换行符,JavaBase64.getDecoder()报IllegalArgumentException。查了三天才发现是换行符惹的祸。后来我们在方案里强制写:“IV必须URL-safe Base64编码,无换行,无空格”。
SM2签名必须约定的5个细节:
- 签名格式:ASN.1 DER(标准)还是纯R+S拼接(部分HSM支持)
- 哈希算法:SM3(国密标准)还是SHA256(兼容旧系统)
- 签名数据:原始数据签名,还是SM3哈希值签名(必须统一)
- 公钥格式:PEM(—–BEGIN PUBLIC KEY—–)还是DER二进制
- 验签失败错误码:
ERR_SM2_SIG_VERIFY_FAIL(签名无效) vsERR_SM2_PUBKEY_INVALID(公钥错误)
这些细节,要形成《密码实现规范附录》,作为开发编码的唯一依据。
3.4 密码管理机制设计:把“人”的因素写进方案
密码安全70%靠机制,30%靠技术。方案里必须设计可落地的管理机制,否则再好的技术也会被人为绕过。
我坚持在方案中固化四大管理机制:
- 密钥分级授权机制:按密钥用途分级(根密钥、主密钥、数据密钥),每级对应不同审批流程。例如数据密钥轮换,只需系统负责人审批;主密钥轮换,需安全总监+CTO双签。
- 密码操作审计机制:所有密钥生成、分发、轮换、销毁操作,必须记录操作人、时间、IP、HSM序列号,并实时同步至SIEM系统。方案里要写明审计日志字段(如:
{"action":"key_rotate","key_id":"SM2-APP-A","operator":"zhangsan","hsm_sn":"TASSL-2023-001"})。 - 密码应急响应机制:定义三级响应(预警、严重、灾难),每级对应不同动作。例如“HSM离线超5分钟”为严重事件,自动触发:1)切换至备用HSM;2)通知密钥管理员;3)启用软件密钥池;4)生成事件报告。
- 密码合规检查机制:每月自动扫描代码库,检查是否违规使用硬编码密钥、是否调用非国密算法(如RSA)、是否缺失SM2签名验签逻辑。扫描脚本要写在方案附件里。
特别提醒:所有机制必须绑定到具体角色和系统。写“密钥管理员负责审批”不行,要写“密钥管理员:张三(工号1001),登录堡垒机账号:km-admin,审批系统:https://kms.company.com/approve”。
4. 实操避坑指南:那些没写进国标,但天天发生的真问题
国标不会告诉你,SM2签名在HTTP Header里传,Base64编码的+号会被Nginx当空格处理;也不会告诉你,SM4加密后的密文,如果用JSON传输,某些老版本Fastjson会把/转义成\/导致解密失败。这些坑,只有踩过才知道。我把最痛的12个坑,按发生频率排序,附上根因和解法。
4.1 坑位TOP1:SM2签名验签失败,90%因为时间戳
现象:前端用SM2签名,后端验签总失败,但用测试工具单独验又能通过。
根因:签名时用了本地时间戳,验签时用服务器时间戳,两者相差超过5分钟(SM2标准允许偏差)。尤其跨时区部署时,前端在UTC+8,后端在UTC+0,差8小时。
解法:方案里强制约定——所有签名必须携带时间戳,且时间戳为UTC时间,精度到秒。验签时,先校验时间戳有效性(±5分钟),再验签。代码示例:
// 签名端(前端JS) const timestamp = Math.floor(Date.now() / 1000); // UTC秒时间戳 const dataToSign = `${timestamp}|${businessData}`; const signature = sm2.doSignature(dataToSign, privateKey); // 验签端(Java) String[] parts = signedData.split("\\|", 2); long timestamp = Long.parseLong(parts[0]); if (Math.abs(timestamp - System.currentTimeMillis()/1000) > 300) { throw new Exception("Timestamp expired"); } boolean valid = sm2.verify(signature, parts[1], publicKey);提示:时间戳必须放在签名数据最前面,且用
|分隔,避免业务数据含|导致解析错位。
4.2 坑位TOP2:SM4密文解密失败,根源在填充模式
现象:Java加密,Node.js解密失败,报BadPaddingException。
根因:Java默认PKCS#5填充,Node.js crypto默认PKCS#7,虽相似但不完全兼容;更隐蔽的是,某些HSM固件对填充处理有差异。
解法:方案里明确——所有SM4实现必须使用PKCS#7填充,且填充字节值必须为填充长度(如填充3字节,则填0x03 0x03 0x03)。禁用ZeroPadding。代码强制:
// Java端(必须显式指定) Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS7Padding", "BC"); // Node.js端(crypto-js需配置) CryptoJS.enc.Base64.parse(ciphertext).toString(CryptoJS.enc.Utf8); // 确保正确解析注意:PKCS#7和PKCS#5在128bit块长下等价,但为防歧义,方案里只写PKCS#7。
4.3 坑位TOP3:HSM密钥导入失败,卡在证书链验证
现象:HSM导入SM2证书失败,报CERTIFICATE_VERIFY_FAILED。
根因:HSM要求完整的证书链(Root CA → Intermediate CA → End Entity),而很多项目只导了End Entity证书;或者CA证书用了SHA256签名,但HSM固件只支持SM3。
解法:方案里规定——HSM导入证书前,必须用openssl verify验证完整链:
openssl verify -CAfile root-ca.crt -untrusted intermediate.crt end-entity.crt # 输出 OK 才可导入HSM同时,方案附件提供HSM支持的证书签名算法清单(如:SM3-RSA、SM3-SM2),要求CA签发时严格匹配。
4.4 坑位TOP4:密钥轮换后,老数据无法解密
现象:轮换SM4密钥后,历史订单数据解密失败。
根因:方案没约定密钥标识(Key ID)和密文绑定关系。新密钥覆盖了旧密钥,老密文找不到对应密钥。
解法:方案强制——所有密文必须前置Key ID标识,格式为<KeyID>:<Base64密文>。例如:SM4-2023-Q1:aGVsbG8=。解密时,先解析Key ID,再从KMS获取对应密钥。KMS必须保留所有历史密钥(至少3年)。
实操心得:Key ID命名规则必须写进方案,如
SM4-{年份}-{季度}-{环境}(SM4-2023-Q1-PROD),避免用UUID等不可读ID。
4.5 坑位TOP5:SM3哈希值不一致,因编码差异
现象:前端JS计算SM3,后端Java计算SM3,结果不同。
根因:JS字符串默认UTF-16,Java String默认UTF-8,同一中文字符串字节数不同。例如“你好”,UTF-8是6字节,UTF-16是4字节。
解法:方案约定——所有SM3输入必须为UTF-8字节数组。前端用new TextEncoder().encode("你好"),后端用"你好".getBytes(StandardCharsets.UTF_8)。禁止直接对字符串哈希。
4.6 坑位TOP6:国密SSL握手失败,因SNI不匹配
现象:浏览器访问HTTPS站点,报ERR_SSL_VERSION_OR_CIPHER_MISMATCH。
根因:Nginx配置了国密证书,但未开启SNI(Server Name Indication),而客户端(如Chrome)强制要求SNI。
解法:方案里Nginx配置必须包含:
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-SM2-SM4-GCM-SM3:EECDH+SM2; ssl_prefer_server_ciphers off; # 关键:启用SNI ssl_session_cache shared:SSL:10m; ssl_session_timeout 5m;4.7 坑位TOP7:密钥备份恢复失败,因HSM固件版本不一致
现象:HSM A备份的密钥,无法在HSM B上恢复。
根因:不同批次HSM固件版本不同,密钥格式不兼容。尤其跨厂商时(如江南天安备份,不能在格尔HSM恢复)。
解法:方案规定——同项目HSM必须同一厂商、同一固件版本(精确到小版本号)。采购时,要求厂商提供固件升级包和回滚方案,并写入SLA。
4.8 坑位TOP8:日志泄露密钥,因调试模式未关闭
现象:生产环境日志出现SM4 Key: 010203...。
根因:开发阶段为调试开启密钥打印,上线时忘记关闭,且日志框架未过滤敏感字段。
解法:方案强制——所有环境日志级别设为WARN及以上,禁止INFO级别打印密钥、密文、私钥。并在Logback配置中添加敏感词过滤:
<filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression> event.getMessage().contains("SM4") || event.getMessage().contains("privateKey") </expression> </evaluator> <onMatch>DENY</onMatch> </filter>4.9 坑位TOP9:SM2证书吊销检查失败,因OCSP响应超时
现象:客户端验签时,OCSP服务器无响应,导致业务阻塞。
根因:方案没定义OCSP超时策略和缓存机制。默认OCSP超时30秒,拖慢整个交易。
解法:方案规定——OCSP检查必须异步,超时设为2秒,失败时降级为CRL检查;OCSP响应缓存1小时。Nginx配置:
ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/nginx/ssl/root-ca.crt; resolver 8.8.8.8 valid=300s;4.10 坑位TOP10:密钥权限失控,因Linux文件权限错误
现象:应用服务器上,SM4密钥文件被普通用户读取。
根因:密钥文件权限设为644,而非400;属组未隔离,开发和运维同组。
解法:方案固化——所有密钥文件权限为400,属主为app用户,属组为keyadmin组;keyadmin组仅含密钥管理员。部署脚本强制:
chmod 400 /opt/app/keys/sm4.key chown app:keyadmin /opt/app/keys/sm4.key4.11 坑位TOP11:国密算法性能不足,因未启用硬件加速
现象:SM3哈希10MB文件耗时2秒,远超业务要求。
根因:方案选型写了“使用SM3”,但没写“启用CPU AES-NI指令集加速”或“调用HSM硬件SM3”。
解法:方案明确——所有SM3/SM4计算,必须启用硬件加速。JVM启动参数加:
-XX:+UseAES -XX:+UseAESIntrinsics -Dorg.bouncycastle.use.aes.native=true4.12 坑位TOP12:密评不通过,因方案未覆盖第三方组件
现象:系统用了Redis缓存,方案里没提Redis如何加密。
根因:方案只覆盖自研代码,忽略中间件、数据库、消息队列等第三方组件的密码需求。
解法:方案必须包含——第三方组件密码适配清单,例如:
- Redis:启用SSL(国密套件),密码传输加密;敏感value用SM4加密后存。
- Kafka:启用SASL/SCRAM-SM3认证,Topic数据SM4加密。
- MySQL:启用TDE(若版本支持SM4),或应用层加密。
实操心得:每次技术选型会议,必须拉上中间件负责人参会,共同签字确认。
5. 方案交付物清单:让密评一次过的关键附件
一份合格的密码应用方案,绝不是一篇Word文档。它必须包含可执行、可验证、可审计的交付物。我总结出密评一次过必备的7个附件,缺一不可。这些附件,不是锦上添花,是密评现场的“通关文牒”。
5.1 附件1:密码应用范围映射表(Excel)
这是密评员第一眼要看的。必须包含:
- 业务功能(如:用户注册、订单支付、电子签章)
- 对应数据表/字段(如:
user_info.id_card、order.payment_amount) - 密码操作类型(加密/签名/哈希/密钥派生)
- 算法及参数(SM4-CBC-PKCS7、SM2-256、SM3)
- 实施状态(已开发/测试中/待开发)
- 责任人(开发:李四;测试:王五)
提示:此表需与数据库ER图、API文档交叉验证,确保无遗漏字段。
5.2 附件2:技术栈兼容性验证报告(PDF)
包含所有技术组件的实测截图:
- JDK版本及国密算法支持验证(
java -cp bcprov.jar org.bouncycastle.crypto.params.ECDomainParameters输出) - HSM连接性测试(
hsm-cli --list-keys成功返回) - Nginx国密SSL握手测试(
openssl s_client -connect host:443 -tls1_3 -cipher ECDHE-SM2-SM4-GCM-SM3) - 数据库加密功能验证(
SELECT SM4_ENCRYPT('test', 'key'))
提示:截图必须带时间戳和系统hostname,防止造假。
5.3 附件3:密码实现规范(Markdown)
详细到每一行代码的规范:
- SM4加密/解密Java代码模板(含异常处理)
- SM2签名/验签JavaScript代码模板(含时间戳处理)
- SM3哈希Node.js代码模板(含UTF-8编码)
- 密钥加载KMS API调用示例(含鉴权头)
提示:此规范要纳入Git Hooks,提交代码时自动检查是否符合。
5.4 附件4:密钥生命周期管理SOP(Word)
图文并茂的操作手册:
- 密钥生成流程图(含审批节点)
- HSM密钥导入/导出详细步骤(含命令截图)
- 密钥轮换Checklist(共12项,每项打钩)
- 应急密钥恢复流程(含备用HSM切换步骤)
提示:SOP必须有版本号(如V2.3),每次密钥操作后更新版本。
5.5 附件5:密码审计日志规范(JSON Schema)
定义所有密码操作日志格式:
{ "type": "object", "properties": { "event": {"enum": ["key_generate", "key_rotate", "sign", "verify"]}, "key_id": {"type": "string"}, "operator": {"type": "string"}, "ip": {"type": "string"}, "hsm_sn": {"type": "string"}, "timestamp": {"type": "string", "format": "date-time"} } }提示:此Schema要对接ELK或Splunk,密评时可实时查询。
5.6 附件6:第三方组件密码适配方案(PPT)
针对每个中间件的改造方案:
- Redis:SSL配置、客户端加密SDK集成步骤
- Kafka:JAAS配置、Producer/Consumer加密代码片段
- Nacos:配置中心敏感配置SM4加密存储方案
提示:每页PPT必须有“改造前后对比”和“验证方法”。
5.7 附件7:密评预检自查表(Excel)
供项目组自测用,100%覆盖密评检查项:
- 密码应用范围是否全覆盖业务?
- 所有密钥是否有唯一Key ID?
- SM2签名是否携带有效时间戳?
- 日志是否过滤密钥、密文?
- HSM是否启用审计日志?
- 第三方组件是否适配国密?
提示:自查表得分≥95分,才允许提交密评。低于90分,退回整改。
我经手的项目,只要这7个附件齐全、真实、可验证,密评一次性通过率100%。附件不是为了应付检查,是把密码安全从“人治”变成“法治”的载体。方案设计的终点,不是交一份文档,而是交付一套让密码真正落地、可管、可控、可溯的工程体系。