Files
snowy/.claude/docs/国密与安全指南.md
T
2026-08-18 21:45:12 +08:00

3.4 KiB
Raw Blame History

国密与安全指南

Snowy 的定位就是"国密前后端分离平台",软件层面满足等保测评。详细 API 见 .claude/skills/crypto-sm 与 .claude/skills/security-auth。

国密三层架构

层 算法 保护什么 实现
传输加密 SM2(非对称) 登录口令网络传输 前端 smCrypto.js 公钥加密 → 后端 CommonCryptogramUtil.sm2Decrypt
口令摘要 SM3(哈希) 口令存储 SysPasswordUtil / sm3Digest,库中只有摘要
字段加密 SM4-CBC(对称) 手机号/证件号等落库 CommonSm4CbcTypeHandler(MyBatis TypeHandler)

密钥配置:application.properties 的 snowy.cryptogram.* 段。密钥严禁硬编码、严禁入 git 明文变更。

敏感字段加密(新字段标准做法)

@TableName(value = "BIZ_PATIENT", autoResultMap = true)      // ①
public class BizPatient extends CommonEntity {

    @TableField(typeHandler = CommonSm4CbcTypeHandler.class)  // ②
    @Schema(description = "手机号")
    private String phone;
}

查询限制(重要):

  • 密文 like 永远查不到——精确查先 sm4Encrypt 再 eq;模糊查用 SM3 摘要辅助列(如 PHONE_HASH)
  • 参考实战:BizUser 的 phone/idCardNumber/emergencyPhone

口令处理规范

  • 传输:SM2(前端加密,后端解密)——新业务口令类字段照抄登录链路
  • 存储:SM3 摘要——任何口令不得明文/可逆存储
  • 日志:不打口令与敏感字段明文

鉴权安全

  1. 白名单最小化:免登录接口必须逐条登记 GlobalConfigure.NO_LOGIN_PATH_ARR(改后重启);禁止用通配符放开大范围
  2. 越权防护:编辑/删除接口校验数据归属(当前用户机构/本人);关键操作加 @CommonNoRepeat
  3. SQL 注入:QueryWrapper 一律 checkSqlInjection() + lambda 列名;动态排序字段过 CommonSortOrderEnum.validate + toUnderlineCase
  4. 上传安全:走 dev/file 标准接口(图片接口校验格式);下载走 authDownload(鉴权)
  5. 会话:Sa-Token 30 天;敏感系统建议配置缩短 + 单端登录(配置已有开关)

权限体系要点(防越权设计)

  • 接口权限:@SaCheckPermission 值 = URL,权限来自角色资源授权的 apiUrl 集合——新接口不授权 = 默认拒绝(默认安全)
  • 按钮权限:驼峰码只控制显示,后端必须有自己的校验(前端隐藏不是安全边界)
  • 数据范围:敏感数据列表按 orgId 数据范围过滤(角色管理→数据授权)

安全检查清单(上线前)

  • 无明文口令/敏感字段存储
  • 新公开接口白名单逐条登记
  • 敏感接口有权限注解 + 资源授权
  • 查询全走 checkSqlInjection
  • 上传走标准接口,下载鉴权
  • 日志无敏感明文
  • 密钥未硬编码、未提交变更
  • Knife4j 生产环境考虑关闭(配置开关)

参考实现

文件 内容
snowy-common/.../util/CommonCryptogramUtil.java 国密 API
snowy-common/.../handler/CommonSm4CbcTypeHandler.java 字段加密
snowy-plugin-biz/.../user/entity/BizUser.java SM4 字段实战
snowy-plugin-auth/.../login/service/impl/AuthServiceImpl.java SM2/SM3 登录链路
snowy-admin-web/src/utils/smCrypto.js 前端国密
snowy-web-app/.../core/config/GlobalConfigure.java 白名单