java安全加固组件通过定义securitycontext统一上下文、策略可配的加解密服务及标准化签名验签协议,实现可复用、可审计、防绕过的安全契约。

定义标准安全上下文接口
所有安全操作必须基于一个轻量但完备的上下文对象,例如 SecurityContext:
- 封装请求原始数据(URI、method、headers、query、body 字符串)
- 携带调用方标识(appKey / clientId)、时间戳(timestamp)、随机数(nonce)
- 声明本次操作类型:ENCRYPT / DECRYPT / SIGN / VERIFY
- 不暴露密钥,只提供密钥ID(如 keyId="app_123_v2"),由密钥管理器按需加载
加解密算法必须限定为“策略可配”的标准实现
禁止硬编码 AES/CBC/128 或 RSA/1024 等具体参数。应通过配置中心或 Spring Boot 配置驱动:
- 对称加密统一走 AesCryptoService:默认使用 AES/GCM/NoPadding,密钥长度强制 256 位,IV 自动生成并随密文 Base64 拼接(格式:base64(iv)+":"+base64(ciphertext))
- 非对称加解密走 RsaCryptoService:仅支持 RSA/ECB/OAEPWithSHA-256AndMGF1Padding,禁用 PKCS#1 v1.5(易受 Bleichenbacher 攻击)
- 所有加解密方法签名统一为:String encrypt(String plain, String keyId) 和 String decrypt(String cipher, String keyId)
签名验签必须绑定业务参数规范与安全比对机制
签名不是“把参数拼一拼再哈希”,而是一套带约束的协议:
- 签名前必须标准化参数:GET 参数 + POST 表单 + JSON body(经 Jackson ObjectMapper.writerWithDefaultPrettyPrinter() 序列化后排序键)全部合并进一个 TreeMap
- 签名字符串拼接规则固定:key1=value1&key2=value2&...×tamp=1724179920000&nonce=abcde&appKey=xxx(不含 sign 字段,value 全部 URL 解码后再拼)
- 验签方法必须使用 MessageDigest.isEqual() 对比签名,且 timestamp 与 nonce 校验必须前置(拒绝超时或已存在 nonce 的请求)
- 验签接口统一为:boolean verify(SecurityContext ctx, String expectedSign)
安全组件必须提供拦截即生效的集成点
业务无需手动调用 sign() 或 verify(),而是通过声明式方式启用:
- 注解驱动:@RequireSignature(algorithm = "HMAC-SHA256") 可标注在 Controller 方法上
- 全局 Filter 拦截所有匹配路径(如 /api/v1/**),自动提取 X-Signature、X-Timestamp 等头字段构建 SecurityContext
- 失败响应统一封装为 401 Unauthorized,且响应体不区分是签名错、超时还是密钥不存在(防信息泄露)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











