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
加密方式:
- 对称加密
- 非对称加密
- md5签名(不可解密) 最安全
可以使用hutool工具包的工具类。
怎么防重放?
- 加nonce随机数 只能用一次,一次后就失效
- 服务端要保存用过的随机数
- 加timestamp 时间戳,校验它的有效期
参数5:nonce 随机数 只能用一次 服务端要保存用过的随机数 ,留存下来。使用过的就不能再使用了。
参数6:timestamp 时间戳,校验它的有效期 5分钟内有效
服务端校验方式:
服务端用一模一样的参数和算法去生成签名,只要和用户传的一致,就表示密钥一致
综合上述,在请求头中会添加五个参数
- accessKey
- secretKey ,不传递
- body,用户请求参数
- sign,body + secretKey -》md5加密 -》sign
- nonce,随机数
- timestamp,时间戳