mirror of
https://gitee.com/xiaonuobase/snowy.git
synced 2026-10-06 06:52:58 +08:00
3.4 KiB
3.4 KiB
国密与安全指南
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 摘要——任何口令不得明文/可逆存储
- 日志:不打口令与敏感字段明文
鉴权安全
- 白名单最小化:免登录接口必须逐条登记 GlobalConfigure.NO_LOGIN_PATH_ARR(改后重启);禁止用通配符放开大范围
- 越权防护:编辑/删除接口校验数据归属(当前用户机构/本人);关键操作加 @CommonNoRepeat
- SQL 注入:QueryWrapper 一律 checkSqlInjection() + lambda 列名;动态排序字段过 CommonSortOrderEnum.validate + toUnderlineCase
- 上传安全:走 dev/file 标准接口(图片接口校验格式);下载走 authDownload(鉴权)
- 会话: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 | 白名单 |