API签名认证讲解(为何6个参数)

什么是签名认证

使用accessKey,secretKey,来实现,签名认证,在调用接口的时候,通过这种签名认证的方式来防止用户进行恶意的刷接口。类似于使用腾讯云登第三方接口的认证。也可以将 accesskey 和 secretKey 比喻成类似与用户名与用户密码。

保证安全性的使用

一般规范由以下参数实现

通过 http request Header 头传递参数

参数1: accessKey 调用的标识(复杂,无序,无规律)

参数2:secretKey 密钥 (复杂,无序,无规律) 该参数不传递

因为我们的请求可能被人拦截,而我们把密码放进请求头里面,可能会被别人获取千万不能把密钥直接在服务器之前传递

一般是根据密钥,生成签名sign

所以要加入参数3,参数4,签名sign

参数3: 用户请求参数 body

参数4: sign 签名 —> 由 secertKey + 用户请求参数(body) 生成= sign (使用md5加密)

sign =( 用户参数 + 密钥 ) 使用签名生成算法(md5,HMac,Sha1)

例如 dzjhfakhjad = abc + abcdefgh

加密方式:

  1. 对称加密
  2. 非对称加密
  3. md5签名(不可解密) 最安全

可以使用hutool工具包的工具类。

怎么防重放?

  1. 加nonce随机数 只能用一次,一次后就失效
  2. 服务端要保存用过的随机数
  3. 加timestamp 时间戳,校验它的有效期

参数5:nonce 随机数 只能用一次 服务端要保存用过的随机数 ,留存下来。使用过的就不能再使用了。

参数6:timestamp 时间戳,校验它的有效期 5分钟内有效

服务端校验方式:

服务端用一模一样的参数和算法去生成签名,只要和用户传的一致,就表示密钥一致

综合上述,在请求头中会添加五个参数

  1. accessKey
  2. secretKey ,不传递
  3. body,用户请求参数
  4. sign,body + secretKey -》md5加密 -》sign
  5. nonce,随机数
  6. timestamp,时间戳
04-27 12:45