在做广告系统的时候,笔者发现大部分对接平台的广告系统都是基于token授权法授权接口,此token它一直保持不变,由广告商提供,可以说这是裸奔界面,但该界面对安全要求不高,只能防止恶意呼叫和验证渠道的身份。
作者去年写了一篇API统一的授权平台为第三方系统呼叫内部服务开放接口提供统一的授权管理。除了方便管理接口授权外,没有其他用途,但成本部署。这应该是我做过的最没有意义的项目之一。
今天介绍的API授权机制也可能被广泛使用API接口授权机制,我记得当作者以前做微信支付功能时,微信提供的支付接口也使用这种方式:签名。优点:简单,不影响性能,不需要额外成本。
该授权 *** 的逻辑是,授权方为每个访问平台设置唯一的身份识别(key)设置独立密钥实际上相当于帐户密码。接入方系统需要在请求头携带三个参数,即身份识别(key)、发起请求的时间戳和签名,授权方系统在收到请求时验证签名,验证通过后放行请求。
从请求头获取验证签名的过程是key与时间戳,然后根据密钥生成签名(调用人和授权人使用相同的签名算法),最后比较请求头获得的签名是否相等。如果是,验证成功,否则验证失败。
基于签名算法的授权 *** 实现过程如下:
授权方:
1.为接入方提供签名生成算法,并为接入方生成密钥和身份标识;
2.在项目中拦截需要验证的签名界面,从请求头获取时间戳和身份标志,根据密钥和签名算法生成签名,将生成的签名与从请求头获得的签名进行比较。如果相同,请继续步骤3,否则将拒绝要求;
3.请求及时性验证,将当前的系统时间戳与从请求头获得的时间戳进行比较,如果请求在有效时间内放行,否则拒绝并响应签名过期。
接入方:
1.从授权方获取对接文件,并向授权方索要密钥和身份标识;
2.根据文件提供的签名生成算法封装签名法;
3.发起请求时,将身份标识、当前时间戳、签名写入请求头。
签名生成算法可以自定义,如身份识别(key)、时间戳(timestamp)与密钥拼接后,使用不可逆算法加密字符串并生成签名MD5算法。规则越复杂,就越难破解。
签名和时间戳有什么好处?
首先,为签名增加及时性。授权方系统可以根据要求时间戳与系统当前时间戳进行比较,限制签名只能在一秒或五秒内有效。但双方的系统时间必须正确。
第二,安全。如果黑客拦截了您系统的请求,然后修改请求并启动请求,则必须需要时间。因此,当系统收到篡改请求时,签名的有效期已经过去。如果更改请求头传输的时间戳,授权方系统生成的签名与请求头传输的签名不同,请求无效。
即使您知道授权方(肉鸡)系统的签名规则,如果您不知道密钥,您也无法生成有效的签名。由于签名采用不对称加密算法,几乎不可能通过爆炸力破解密钥。
那为什么不使用格式化的时间字符串来戳时间呢?
这可能是考虑时区的兼容性。如果不同机房的时区不同,时间会不同,但时间戳是一样的。
为了充分发挥这种授权 *** 的安全性,首先生成签名规则必须足够复杂,然后签名的加密算法是不可逆的,不能使用Base64最后,密钥应该足够长和复杂,以确保即使知道签名生成规则,也不可能通过暴力破解密钥。
签名规则指的是生成加密之前的签名字符串的规则,如规则:key 密钥 时间戳 key 密钥key为“app”,密钥为"123",时间戳为"1111111111111",加密前拼接生成的签名是"app1231111111111111app123",最终签名可以通过加密算法加密拼接的字符串来生成。
每个接口都要写一遍签名逻辑不麻烦吗?
不需要。对于授权人,签名验证逻辑可以通过过滤器或拦截器完成;对于调用人来说,使用不同的框架有不同的 *** ,但我们总能想到写签名逻辑的 *** ,不是吗?
本文转载自微信公众号「Java艺术」,可以通过以下二维码关注。转载本文请联系Java艺术微信官方账号。