类 SaSignTemplate

java.lang.Object
cn.dev33.satoken.sign.SaSignTemplate

public class SaSignTemplate extends Object
API 参数签名算法,在跨系统接口调用时防参数篡改、防重放攻击。

以 SSO 数据拉取为例,流程大致如下:
1. 以 md5( loginId={账号id}8nonce={随机字符串}8timestamp={13位时间戳}8key={secretkey秘钥} ) 生成签名 sign。
2. 将 sign 作为参数,拼接到请求地址后面,如:http://xxx.com?loginId=100018nonce=xxx8timestamp=xxx8sign=xxx。
3. 服务端接收到请求后,以同样的算法生成一次 sign 。
4. 对比两次 sign 是否一致,一致则通过,否则拒绝 。

从以下版本开始:
1.30.0
作者:
click33
  • 字段详细资料

    • key

      public static String key
    • timestamp

      public static String timestamp
    • nonce

      public static String nonce
    • sign

      public static String sign
  • 构造器详细资料

    • SaSignTemplate

      public SaSignTemplate()
    • SaSignTemplate

      public SaSignTemplate(SaSignConfig signConfig)
      构造函数
      参数:
      signConfig - 签名参数配置对象
  • 方法详细资料

    • getSignConfig

      public SaSignConfig getSignConfig()
      获取:API 签名配置
      返回:
      /
    • getSignConfigOrGlobal

      public SaSignConfig getSignConfigOrGlobal()
      获取:API 签名配置: 1. 如果用户自定义了 signConfig ,则使用用户自定义的。 2. 否则使用全局默认配置。
      返回:
      /
    • getSecretKey

      public String getSecretKey()
      获取:API 签名配置的秘钥
      返回:
      /
    • setSignConfig

      public SaSignTemplate setSignConfig(SaSignConfig signConfig)
      设置:API 签名配置
      参数:
      signConfig - /
    • joinParams

      public String joinParams(Map<String,?> paramsMap)
      将所有参数连接成一个字符串(不排序),形如:b=28a=18c=3
      参数:
      paramsMap - 参数列表
      返回:
      拼接出的参数字符串
    • joinParamsDictSort

      public String joinParamsDictSort(Map<String,?> paramsMap)
      将所有参数按照字典顺序连接成一个字符串,形如:a=18b=28c=3
      参数:
      paramsMap - 参数列表
      返回:
      拼接出的参数字符串
    • createSign

      public String createSign(Map<String,?> paramsMap)
      创建签名:md5(paramsStr + keyStr)
      参数:
      paramsMap - 参数列表
      返回:
      签名
    • digestFullStr

      public String digestFullStr(String fullStr)
      使用摘要算法创建签名
      参数:
      fullStr - 待摘要的字符串
      返回:
      签名
    • addSignParams

      public Map<String,Object> addSignParams(Map<String,Object> paramsMap)
      给 paramsMap 追加 timestamp、nonce、sign 三个参数
      参数:
      paramsMap - 参数列表
      返回:
      加工后的参数列表
    • addSignParamsAndJoin

      public String addSignParamsAndJoin(Map<String,Object> paramsMap)
      给 paramsMap 追加 timestamp、nonce、sign 三个参数,并转换为参数字符串,形如: data=xxx8nonce=xxx8timestamp=xxx8sign=xxx
      参数:
      paramsMap - 参数列表
      返回:
      加工后的参数列表 转化为的参数字符串
    • isValidTimestamp

      public boolean isValidTimestamp(long timestamp)
      判断:指定时间戳与当前时间戳的差距是否在允许的范围内
      参数:
      timestamp - 待校验的时间戳
      返回:
      是否在允许的范围内
    • checkTimestamp

      public void checkTimestamp(long timestamp)
      校验:指定时间戳与当前时间戳的差距是否在允许的范围内,如果超出则抛出异常
      参数:
      timestamp - 待校验的时间戳
    • isValidNonce

      public boolean isValidNonce(String nonce)
      判断:随机字符串 nonce 是否有效。 注意:同一 nonce 可以被多次判断有效,不会被缓存
      参数:
      nonce - 待判断的随机字符串
      返回:
      是否有效
    • checkNonce

      public void checkNonce(String nonce)
      校验:随机字符串 nonce 是否有效,如果无效则抛出异常。 注意:同一 nonce 只可以被校验通过一次,校验后将保存在缓存中,再次校验将无法通过
      参数:
      nonce - 待校验的随机字符串
    • isValidSign

      public boolean isValidSign(Map<String,?> paramsMap, String sign)
      判断:给定的参数 生成的签名是否为有效签名
      参数:
      paramsMap - 参数列表
      sign - 待验证的签名
      返回:
      签名是否有效
    • checkSign

      public void checkSign(Map<String,?> paramsMap, String sign)
      校验:给定的参数 生成的签名是否为有效签名,如果签名无效则抛出异常
      参数:
      paramsMap - 参数列表
      sign - 待验证的签名
    • isValidParamMap

      public boolean isValidParamMap(Map<String,String> paramMap)
      判断:参数列表中的 nonce、timestamp、sign 是否均为合法的
      参数:
      paramMap - 待校验的请求参数集合
      返回:
      是否合法
    • checkParamMap

      public void checkParamMap(Map<String,String> paramMap)
      校验:参数列表中的 nonce、timestamp、sign 是否均为合法的,如果不合法,则抛出对应的异常
      参数:
      paramMap - 待校验的请求参数集合
    • isValidRequest

      public boolean isValidRequest(SaRequest request, String... paramNames)
      判断:一个请求中的 nonce、timestamp、sign 是否均为合法的
      参数:
      request - 待校验的请求对象
      paramNames - 指定参与签名的参数有哪些,如果不填写则默认为全部参数
      返回:
      是否合法
    • checkRequest

      public void checkRequest(SaRequest request, String... paramNames)
      校验:一个请求的 nonce、timestamp、sign 是否均为合法的,如果不合法,则抛出对应的异常
      参数:
      request - 待校验的请求对象
      paramNames - 指定参与签名的参数有哪些,如果不填写则默认为全部参数
    • takeRequestParam

      protected Map<String,String> takeRequestParam(SaRequest request, String[] paramNames)
      从请求中提取指定的参数
      参数:
      request - 请求对象
      paramNames - 指定的参数名称,不可为空,如果传入空数组则代表只拿 timestamp、nonce、sign 三个参数
      返回:
      提取出的参数
    • splicingNonceSaveKey

      public String splicingNonceSaveKey(String nonce)
      拼接key:存储 nonce 时使用的 key
      参数:
      nonce - nonce 值
      返回:
      key