Skip to content

响应数据加密拦截器 🔐

功能介绍 💡

WARNING

响应数据加密拦截器就像一个加密邮差,负责在数据返回给客户端之前对其进行加密处理。在高安全要求的系统中,它通过对响应数据进行加密来保护敏感信息,防止数据在传输过程中被窃取或篡改。

核心特性

  • 🔒 支持多种高安全性加密算法:3DESSM4
  • 📦 加密数据统一通过 data 字段返回
  • ✅ 使用 encrypt: true 标识数据已加密

加密算法说明 🔒

3DES加密

  • 加密方式:3DES(Triple DES)加密算法
  • 加密模式:CBC(Cipher Block Chaining)模式
  • 填充方式:PKCS5Padding
  • 密钥长度:24字节(192位)
  • IV处理:随机生成IV,并在密文第一个字节存储IV长度,后面跟着IV和实际密文
  • 加密流程:对象 → JSON字符串 → 3DES加密
  • 响应格式:加密后的数据通过 data 字段返回,并设置 encrypt: true 标识

SM4加密

  • 加密方式:SM4(国密算法)加密算法
  • 加密模式:CBC(Cipher Block Chaining)模式
  • 填充方式:PKCS5Padding
  • 密钥长度:16字节(128位)
  • IV处理:随机生成IV,并在密文第一个字节存储IV长度,后面跟着IV和实际密文
  • 加密流程:对象 → JSON字符串 → SM4加密
  • 响应格式:加密后的数据通过 data 字段返回,并设置 encrypt: true 标识

加解密示例

go
// 加密示例
plaintext := []byte(`{"userId":"12345","username":"admin","token":"xxx"}`)
key := []byte("a748d0d6a748d0d6a748d0d6") // 24字节密钥
ciphertext, err := Encrypt3DES(plaintext, key)
// ciphertext格式:[IV长度(1字节)][IV(8字节)][密文]

// 解密示例
plaintext, err := Decrypt3DES(ciphertext, key)
// plaintext: {"userId":"12345","username":"admin","token":"xxx"}

详细配置说明 ⚙️

核心参数说明

参数名类型必填默认值说明
enabledbooleanfalse是否启用拦截器
rulesarray[object]-加密规则配置列表

加密规则配置详解 (rules)

参数名类型必填说明示例值
urlsarray[string]需要进行加密的URL地址列表/demo/get
encrypt-typestring加密算法类型,支持DES3SM4DES3
secretstring数据加密密钥(DES3算法要求24位,SM4算法要求16位)a748d0d6a748d0d6a748d0d6
forbid-urlsarray[string]排除不需要加密的URL地址/demo/public/**
typestring验证类型,支持merchant(按商户验证)merchant
merchant-secretmap[string][string]商户密钥映射,key为商户ID,value为密钥{"1001": "key1", "1002": "key2"}

配置示例 📋

基础配置

yaml
gateway:
  filter:
    response-encrypt:
      enabled: true  # 启用响应加密
      rules:
        - urls:
            - /demo/get  # 需要加密的地址
          secret: a748d0d6a748d0d6a748d0d6  # 加密密钥

高级配置

yaml
gateway:
  filter:
    response-encrypt:
      enabled: true  # 启用响应加密
      rules:
        - urls:
            - /api/**  # 所有API接口
          secret: a748d0d6a748d0d6a748d0d6
          forbid-urls:
            - /api/public/**  # 排除公开接口

商户验证配置

yaml
gateway:
  filter:
    response-encrypt:
      enabled: true
      rules:
        - urls:
            - /api/merchant/**
          type: merchant  # 启用商户验证
          merchant-secret:  # 商户密钥配置
            "1001": "D5E5F589769DA629A2F8C344F4749C0A"  # 商户1001的密钥
            "1002": "E6F6F690870EB73B3F9D455G5850D1B"  # 商户1002的密钥
          forbid-urls:
            - /api/merchant/public/**  # 排除公开接口

完整配置示例

yaml
gateway:
  filter:
    response-encrypt:
      enabled: true
      rules:
        # 3DES加密 - 用户敏感数据
        - urls:
            - /api/user/profile/**
            - /api/user/account/**
            - /api/auth/login
          encrypt-type: DES3
          secret: user_data_key_24_bytes_long  # 24字节密钥
        
        # SM4加密 - 支付交易数据
        - urls:
            - /api/payment/**
            - /api/transaction/**
            - /api/wallet/**
          encrypt-type: SM4
          secret: payment_sm4_key_1  # 16字节密钥
          forbid-urls:
            - /api/payment/methods/**  # 支付方式不加密
        
        # 商户多租户配置
        - urls:
            - /api/merchant/data/**
          type: merchant
          encrypt-type: DES3
          merchant-secret:
            "M001": "merchant001_key_24_bytes_abc"  # 商户M001专用密钥
            "M002": "merchant002_key_24_bytes_def"  # 商户M002专用密钥
            "M003": "merchant003_key_24_bytes_ghi"  # 商户M003专用密钥

高级场景配置

yaml
gateway:
  filter:
    response-encrypt:
      enabled: true
      rules:
        # 高安全级别 - 管理后台数据
        - urls:
            - /api/admin/user/**
            - /api/admin/system/**
          encrypt-type: SM4
          secret: admin_secure_key1  # 16字节管理密钥
          forbid-urls:
            - /api/admin/logs/**
            - /api/admin/health/**
        
        # 中安全级别 - 业务数据
        - urls:
            - /api/business/report/**
            - /api/business/analytics/**
          encrypt-type: DES3
          secret: business_data_key_24_bytes  # 24字节业务密钥
          forbid-urls:
            - /api/business/config/**
            - /api/business/status/**
        
        # 低安全级别 - 一般数据
        - urls:
            - /api/common/user-info/**
          encrypt-type: DES3
          secret: common_response_key_24_byte  # 24字节通用密钥
          forbid-urls:
            - /api/common/public/**
            - /api/common/cache/**

不同业务场景配置

金融系统

yaml
gateway:
  filter:
    response-encrypt:
      enabled: true
      rules:
        # 交易数据 - 最高安全级别
        - urls:
            - /api/transaction/detail/**
            - /api/account/balance/**
            - /api/transfer/record/**
          encrypt-type: SM4
          secret: finance_sm4_key_1  # 16字节金融密钥
        
        # 用户资产信息
        - urls:
            - /api/asset/**
            - /api/portfolio/**
          encrypt-type: DES3
          secret: asset_data_key_24_bytes_fin  # 24字节资产密钥
          forbid-urls:
            - /api/asset/types/**  # 资产类型不加密
        
        # 银行接口 - 多机构配置
        - urls:
            - /api/bank/account/**
          type: merchant
          encrypt-type: SM4
          merchant-secret:
            "BANK001": "bank001_secure_key16"  # 银行001密钥
            "BANK002": "bank002_secure_key16"  # 银行002密钥
            "BANK003": "bank003_secure_key16"  # 银行003密钥

电商平台

yaml
gateway:
  filter:
    response-encrypt:
      enabled: true
      rules:
        # 用户隐私数据
        - urls:
            - /api/user/profile/**
            - /api/user/address/**
            - /api/user/payment-method/**
          encrypt-type: DES3
          secret: user_privacy_key_24_bytes_
        
        # 订单敏感信息
        - urls:
            - /api/order/detail/**
            - /api/order/payment-info/**
          encrypt-type: SM4
          secret: order_secure_key1
        
        # 商家数据
        - urls:
            - /api/seller/finance/**
            - /api/seller/analytics/**
          type: merchant
          encrypt-type: DES3
          merchant-secret:
            "SHOP001": "shop001_data_key_24_bytes_a"
            "SHOP002": "shop002_data_key_24_bytes_b"
            "SHOP003": "shop003_data_key_24_bytes_c"
          forbid-urls:
            - /api/seller/products/**  # 商品信息不加密

医疗系统

yaml
gateway:
  filter:
    response-encrypt:
      enabled: true
      rules:
        # 患者隐私数据 - 最高安全级别
        - urls:
            - /api/patient/medical-record/**
            - /api/patient/diagnosis/**
            - /api/patient/prescription/**
          encrypt-type: SM4
          secret: medical_sm4_key_1  # 16字节医疗密钥
        
        # 医生操作记录
        - urls:
            - /api/doctor/operation/**
            - /api/doctor/notes/**
          encrypt-type: DES3
          secret: doctor_record_key_24_bytes
        
        # 医院多机构配置
        - urls:
            - /api/hospital/patient-data/**
          type: merchant
          encrypt-type: SM4
          merchant-secret:
            "HOSP001": "hospital001_key16"  # 医院001密钥
            "HOSP002": "hospital002_key16"  # 医院002密钥
            "HOSP003": "hospital003_key16"  # 医院003密钥
          forbid-urls:
            - /api/hospital/departments/**  # 科室信息不加密

教育平台

yaml
gateway:
  filter:
    response-encrypt:
      enabled: true
      rules:
        # 学生个人信息
        - urls:
            - /api/student/profile/**
            - /api/student/grade/**
            - /api/student/transcript/**
          encrypt-type: DES3
          secret: student_data_key_24_bytes_
        
        # 考试答案和成绩
        - urls:
            - /api/exam/result/**
            - /api/exam/answer/**
          encrypt-type: SM4
          secret: exam_result_key1
        
        # 学校多租户配置
        - urls:
            - /api/school/student-data/**
          type: merchant
          encrypt-type: DES3
          merchant-secret:
            "EDU001": "school001_key_24_bytes_edu"
            "EDU002": "school002_key_24_bytes_edu"
            "EDU003": "school003_key_24_bytes_edu"
          forbid-urls:
            - /api/school/courses/**  # 课程信息不加密

企业办公系统

yaml
gateway:
  filter:
    response-encrypt:
      enabled: true
      rules:
        # 员工敏感信息
        - urls:
            - /api/employee/salary/**
            - /api/employee/performance/**
            - /api/employee/personal/**
          encrypt-type: SM4
          secret: hr_secure_key_16b
        
        # 财务数据
        - urls:
            - /api/finance/report/**
            - /api/finance/budget/**
          encrypt-type: DES3
          secret: finance_report_key_24_byte
        
        # 部门数据
        - urls:
            - /api/department/confidential/**
          encrypt-type: DES3
          secret: dept_confidential_key_24_b
          forbid-urls:
            - /api/department/structure/**  # 组织架构不加密

商户验证说明

  • 当type设置为merchant时,系统会根据请求中的商户ID选择对应的密钥
  • 商户ID必须通过请求头传递X-Merchant-Id
  • 如果找不到对应的商户密钥,将使用默认密钥
  • 建议为每个商户配置独立的密钥
  • 建议结合签名使用

注意事项

  1. 商户密钥配置

    • 确保每个商户的密钥都是唯一的
    • 定期更新商户密钥
    • 妥善保管密钥信息
    • 避免在日志中打印密钥
  2. 安全建议

    • 使用HTTPS传输
    • 实现密钥定期轮换机制
    • 记录密钥使用日志
    • 设置密钥有效期

响应示例 📝

加密前的响应数据

json
{
    "code": 0,
    "msg": "success",
    "data": {
        "userId": "12345",
        "username": "admin",
        "token": "eyJhbGciOiJIUzI1NiJ9..."
    }
}

加密后的响应数据

json
{
    "code": 0,
    "msg": "success",
    "data": "U2FsdGVkX1+2tOLqT8HqVJ6Y+6P8v+3/RjMYn+5p+8Q=",
    "encrypt": true
}

最佳实践 💡

  1. 密钥管理

    • 使用高强度的密钥(建议24位以上)
    • 不同环境使用不同的密钥
    • 定期更换密钥
    • 安全存储密钥,避免泄露
  2. 加密策略

    • 只对敏感数据接口启用加密
    • 合理使用排除规则
    • 避免对大数据量响应启用加密
    • 配合请求加密使用,实现双向加密
  3. 性能优化

    • 设置合理的缓存策略
    • 避免重复加密
    • 监控加密性能影响

常见问题 ❓

  1. 加密失败

    • 检查密钥格式是否正确
    • 验证数据格式是否符合要求
    • 确认加密算法配置是否正确
  2. 客户端解密问题

    • 确保使用相同的密钥
    • 验证加密算法实现是否一致
    • 检查是否正确处理 encrypt 标志
  3. 性能问题

    • 评估加密对响应时间的影响
    • 优化加密范围
    • 考虑使用缓存机制

安全提示 ⚠️

CAUTION

  1. 密钥是系统安全的核心,必须严格保护
  2. 建议使用HTTPS传输加密数据
  3. 定期更新密钥,降低泄露风险
  4. 避免在日志中打印加密密钥和原始数据
  5. 建议配合请求加密和签名验证使用

相关文档 📚