dsh-cn-crypto:项目里的密码学代码,该用国密的地方是否还在用国际算法

前言

在等保、密评或行业商用密码要求下,团队往往要先回答一个问题:代码里涉及密码保护时,算法与工作模式是否符合国内规范,有没有仍停留在 ECB、弱哈希或过短 RSA 上。手工翻 Cipher.getInstance、createHash 和配置里的算法名,成本高,也容易漏掉「只写 AES 却默认落到 ECB」这类写法。

DeepSeek Harness(DSH)把能力拆成可安装的插件。下面介绍维护者 feely0208 发布的 dsh-cn-crypto(npm 包名 @deepwhale-cn/dsh-cn-crypto,分类 admin-security):一个条件性静态检查器,只在项目里确实存在密码学相关代码时才跑规则,帮助你对照国密与常见不安全用法做确认,而不是给所有仓库一律套上国密要求。

这是什么、不是什么

是:条件性检查器。检测到项目中有密码学代码后,检查该用国密或合规参数的场景里,是否仍在使用国际算法、不安全模式或明显不安全的参数。

不是:不要求「所有项目都必须用国密」。国密适用于涉及商用密码的场景(例如关键信息基础设施、等保三级及以上、有行业要求的金融/政务/能源、需要过密评等)。规则通过 when 限定;纯业务代码、没有密码学调用的项目上,按 README 说明一条都不会跑,也不会因此报错。

也不是:密码学审计或密评的替代品。不判断密钥管理流程、不检查密码模块资质、不验证协议实现是否正确;命中结果是提示确认,不是违规判定。

插件当前版本为 0.1.0(MIT 许可证),依赖 @deepwhale-cn/dsh-guard-core,要求 Node.js ≥ 18,DSH 引擎 >=0.1.0-rc.6 <0.3.0。

检查哪些内容

共 5 条规则,均在项目出现密码学代码时才会执行:

级别 规则 ID 说明
高 CRYPTO-ECB 使用 ECB 模式,含 aes-128-ecb、AES/ECB/PKCS5Padding、MODE_ECB,以及 Java 中 Cipher.getInstance("AES") 仅写算法名(提供者默认常为 ECB)
高 CRYPTO-WEAK-HASH MD5 / SHA-1 调用点(如 createHash('md5')、MessageDigest.getInstance("SHA1")、hashlib.md5()、DigestUtils、CryptoJS 及 "md5" 等算法名字符串)
高 CRYPTO-RSA-KEYLEN RSA 密钥长度小于 2048(如 512 / 1024 / 1536,出现在 modulusLength、keySize、initialize、genrsa、RSA.generate 等位置)
高 CRYPTO-HARDCODED-IV IV / salt 硬编码为字符串字面量,或 Java 用 IvParameterSpec("...") 直接包常量
中 CRYPTO-NO-SM 项目有密码学代码,但全项目找不到 SM2 / SM3 / SM4 痕迹(files-lack + when)

CRYPTO-NO-SM 易被误读:只表示「在写密码学代码但未看到国密」,需先确认项目是否落在商用密码应用范围内,再决定是否改造。

README 中单独说明了 Java 里 ECB 的陷阱——只写 "AES" 并不等于「没选模式」,往往等价于选了 ECB:

Cipher.getInstance("AES")                       // 提供者默认 ECB/PKCS5Padding
Cipher.getInstance("AES/ECB/PKCS5Padding")      // 显式 ECB
Cipher.getInstance("AES/CBC/PKCS5Padding")      // 带明确工作模式的写法

规则依据在 README 中列出,包括 GB/T 39786-2018、SM2/SM3/SM4 相关国标、《密码法》第二十七条对关键信息基础设施商用密码保护的要求,以及 OWASP Cryptographic Storage Cheat Sheet 中对 ECB、弱哈希、RSA 长度与 IV/salt 的说明。

安装与启用

在 DSH 环境中安装插件(命令来自官方 README):

dsh plugin --profile web add @deepwhale-cn/dsh-cn-crypto

若只使用 CLI,可不经过 DSH profile:

npx @deepwhale-cn/dsh-cn-crypto

安装或启用前,建议自行查看 GitHub 仓库 源码与 MIT 许可证。插件以当前 DSH 进程权限扫描工作区,应对其文件访问范围有预期。

典型用法

安装后可通过 dsh-cn-crypto 命令行工具操作:

dsh-cn-crypto --demo          # 用内置样本查看检出效果
dsh-cn-crypto --list-rules    # 列出规则及依据
dsh-cn-crypto --html r.html   # 生成 HTML 报告
dsh-cn-crypto --json          # JSON 输出,便于 CI 二次处理
dsh-cn-crypto --quiet         # 仅输出结论行

退出码:存在 high / critical 级别命中时为 1,可挂在 CI 卡口。中等级别(如 CRYPTO-NO-SM)是否阻断流水线,需结合你们对商用密码范围的判定自行约定。

适用场景与边界

适合:已在或准备做密评、等保密码条款对照、行业商用密码改造的团队,希望在改代码或合入前快速扫一遍常见国际算法与不安全参数;与 DSH 工作流里其他「深鲸网安守护」类插件(README 中列有等保对照、日志留存、国密合规等同系列链接)搭配时,可按「链式安全问题」分工使用。

需注意:

  • 不做「缺国密即违规」的判定;未见 SM 算法不等于违法,见上文条件性设计。
  • 不扫描部署层(密码机、KMS、网关侧统一加密等)。
  • 不校验密码模块是否通过认证。
  • 不覆盖密钥轮换、分级、托管等密钥管理。
  • MD5 等用于非安全用途(如缓存键、对象存储 ETag)时,可按 README 说明忽略对应提示。

使用者须遵守所在地法律法规;README 声明对使用本项目造成的后果自行承担责任。

结尾

dsh-cn-crypto 把「有密码学代码时,国际算法与不安全参数是否仍残留、是否完全看不到国密」收成五条可复现的规则,适合作为合规改造前的代码侧核对工具,而不是替代密评或全量安全审计。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye