SecureApi使用文档SecureApi使用文档
主页
开始使用
版本历史
  • 中国大陆
  • 国际
  • 简体中文
  • English
主页
开始使用
版本历史
  • 中国大陆
  • 国际
  • 简体中文
  • English
  • 快速开始

    • 开始使用
    • 安装
    • 配置
    • 试一下
  • 指南

    • 注解
    • URL匹配
    • 异常处理
    • 加密算法
    • CipherUtils
    • 两种模式
    • DH密钥协商
    • 数字签名校验
  • JS示例
  • 最佳实践
  • 微服务调用
  • 黑金刚

配置

有两种配置方法, yml 和 Bean 方式,看你喜欢哪一个,如果是对安全性要求较高,建议使用 Bean 方式动态设置密钥,而不是写在 yml 里。

yml模式

下面是 yml 的完整配置,有些配置项是可选的,在注解中均已解释

secure-api:
  # 开启SecureApi功能,如果为false则其余配置项均不生效
  enabled: true
  # 开启接口数据数字签名校验
  sign-enabled: false
  # 生成的key和密文等是否是符合url规范的,默认开启,开启后与前端配合时前端要自行处理密文的 url safe 转换,在 "JS示例" 篇有代码示例
  url-safe: true
  # 开启加解密日志打印,会打印出接口名、加密模式、算法、明文和密文等信息
  show-log: true
  # 加密模式,common和session_key可选,session_key是会话密钥模式,用于每次请求都使用不同的密钥,需要前端配合
  mode: common
  # 加密算法
  cipher-algorithm: rsa_ecb_sha256
  # session_key模式配置项,与前端协商的会话密钥类型,common模式下此配置不生效
  session-key-cipher-algorithm: aes_ecb_pkcs5
  # 对称算法用于加解密的密钥,Base64格式,cipher-algorithm选择对称加密算法时配置,也可为空,组件会随机生成一个
  key:
  # 对称算法用于加解密的偏移量,Base64格式,cipher-algorithm选择对称加密算法时配置,也可为空,组件会随机生成一个
  iv:
  # 非对称算法用于加密的公钥,Base64格式,cipher-algorithm选择RSA非对称加密算法时配置,也可为空,组件会随机生成一对
  public-key:
  # 非对称算法用于解密的私钥,Base64格式,cipher-algorithm选择RSA非对称加密算法时配置,也可为空,组件会随机生成一对
  private-key:
  # 开启接口数字签名校验后可以配置数字签名RSA公钥,也可为空,组件会随机生成一对
  sign-public-key:
  # 开启接口数字签名校验后可以配置数字签名RSA私钥,也可为空,组件会随机生成一对
  sign-private-key:
  # 需要加密的接口路径匹配,遵循spring boot拦截器的正则规则,留空或者不配置代表不使用url匹配,只对注解的接口进行解密
  encrypt-url:
    # 配置了此项,接口有无注解都将进行返回值加密
    include-urls: /**
    # 即使配置了排除,注解的优先级也高于此项
    exclude-urls: /test1,/test2
  # 需要解密的接口路径匹配,遵循spring boot拦截器的正则规则,留空或者不配置代表不使用url匹配,只对注解的接口、参数、字段进行解密
  decrypt-url:
    # 配置了此项,接口、参数、字段有无注解都将进行解密
    include-urls: /**
    # 即使配置了排除,注解的优先级也高于此项
    exclude-urls:
  # Date类型日期格式化
  date-format: yyyy-MM-dd HH:mm:ss
  # LocalDateTime类型日期格式化
  local-date-time-format: yyyy-MM-dd HH:mm:ss
  # LocalDate类型日期格式化
  local-date-format: yyyy-MM-dd
  # LocalTime类型日期格式化
  local-time-format: HH:mm:ss

Bean方式

注意,一旦使用了 Bean 方式来配置,yml 里的配置项都将失效

import icu.xuyijie.secureapi.cipher.CipherAlgorithmEnum;
import icu.xuyijie.secureapi.cipher.CipherUtils;
import icu.xuyijie.secureapi.cipher.RsaKeyPair;
import icu.xuyijie.secureapi.model.SecureApiProperties;
import icu.xuyijie.secureapi.model.SecureApiPropertiesConfig;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;

import java.util.ArrayList;
import java.util.Arrays;

@SpringBootConfiguration
public class SecureApiConfig {
    /**
     * 这里的配置了Bean会导致yml配置的数据失效
     * @return SecureApiPropertiesConfig
     */
    @Bean
    public SecureApiPropertiesConfig secureApiPropertiesConfig() {
        SecureApiPropertiesConfig secureApiPropertiesConfig = new SecureApiPropertiesConfig();
        secureApiPropertiesConfig.setEnabled(true);
        // 生成的key和密文是符合url规范的,默认开启,开启后与前端配合时前端要自行处理密文的 url safe 转换,在 "JS示例" 篇有代码示例
        secureApiPropertiesConfig.setUrlSafe(true);
        secureApiPropertiesConfig.setShowLog(true);
        secureApiPropertiesConfig.setMode(SecureApiProperties.Mode.COMMON);
        secureApiPropertiesConfig.setCipherAlgorithmEnum(CipherAlgorithmEnum.RSA_ECB_SHA256);
        
        // 密钥可以不设置,组件会自动生成一个,并打印在控制台,如果需要手动生成,只需要使用组件提供的CipherUtils
        CipherUtils cipherUtils = new CipherUtils(CipherAlgorithmEnum.RSA_ECB_SHA256);
        // 因为我们选择的是非对称加密RSA,所以生成一个密钥对,getRandomRsaKeyPair("1")可传入seed参数,在测试时可用于控制每次生成的密钥相同
        RsaKeyPair randomRsaKeyPair = cipherUtils.getRandomRsaKeyPair();
        // 把生成的密钥对设置到secureApiPropertiesConfig
        secureApiPropertiesConfig.setPublicKey(randomRsaKeyPair.getPublicKey());
        secureApiPropertiesConfig.setPrivateKey(randomRsaKeyPair.getPrivateKey());
        
        // 配置数字签名校验密钥对
        RsaKeyPair randomRsaKeyPair2 = cipherUtils.getRandomRsaKeyPair("2");
        secureApiPropertiesConfig.setSignPublicKey(randomRsaKeyPair2.getPublicKey());
        secureApiPropertiesConfig.setSignPrivateKey(randomRsaKeyPair2.getPrivateKey());
        
        // 不需要使用url匹配功能可以删除掉下面两行,或者传入空数组
        // secureApiPropertiesConfig.setEncryptUrl(new SecureApiProperties.UrlPattern(Arrays.asList("/**"), new ArrayList<>()));
        // secureApiPropertiesConfig.setDecryptUrl(new SecureApiProperties.UrlPattern(Arrays.asList("/**"), Arrays.asList("/secureApiTest/testForm")));
        return secureApiPropertiesConfig;
    }
}
在 Github 上编辑
最近更新:
编著者: XuYijie
Prev
安装
Next
试一下