API签名,接口签名验签
当系统从外部获取数据时,通常是通过API接口调用来实现。请求者和接口提供者之间的通信过程需要考虑以下问题:
1.请求参数是否已被篡改;
2.请求的来源是否合法;
3.请求是否唯一。
今天,我们来讨论一下主流的通信安全解决方案。
参数签名模式
这种方式是主流。它要求调用者根据商定的算法生成签名字符串。作为请求的一部分,接口提供者可以检查签名以了解它是否合法。通常,步骤如下:
接口提供者给出appid和appsecret。
调用者根据appid、appsecret和request参数,按照一定的算法生成签名sign。
接口提供者验证签名
生成签名的步骤如下:
按字母顺序排列所有业务请求参数
参数名和参数值链接成一个字符串a。
将appsecret添加到字符串A的开头和结尾,形成新的字符串b。
对字符串进行md5,得到签名符号
请求的参数假设为:f=1,b=23,k=33,排序后为b=23,f=1,k=33,链接参数名和参数值后为b23f1k33,首尾加appsecret后,md5:
md5(secretkey1value1key2value2.秘密的).
php版本签名的实现:
公共静态函数符号($appSecret,$params) {
如果(!is_array($params))
$ params=array();
ksort($ params);
$ text=“”;
foreach ($params as $k=$v) {
$text。=$ k . $ v;
返回MD5(app secret。$text。$ app secret);
接口调用者的请求地址类似于:
/api/?f=1 b=23 k=33符号=符号值
上述签名方法安全有效地解决了参数篡改和认证问题。如果参数被篡改了也没问题,因为别人无法知道appsecret,也无法重新生成一个新的标志。
这里使用md5算法进行签名,也可以选择其他签名方式,如RSA、SHA等。
另外,微信微信官方账号在开发时,也采用了类似的方法来验证服务器地址的有效性,只是签名生成方式不同。
请求唯一性保证
Md5签名方式可以保证源和请求参数的合法性,但是一旦请求链接泄露,就可以重复请求,这对于一些拉数据的接口来说不是好事,相当于泄露数据。
时间戳被附加到请求上,并且时间戳也被用作签名的一部分。时间戳在接口提供者处被验证,并且仅允许特定时间范围内的请求,例如1分钟。因为请求方和接口提供方的服务器可能会有一定的时间误差,建议时间戳误差在5分钟以内。允许的时间误差越大,链接的有效性越长,请求的唯一性的保证越弱。所以需要在两者之间衡量。
密钥的保存
在签名的过程中,appsecret起着决定性的作用,所以如何保存就成为关键。我们按类别来讨论吧。
调用者的代码更容易在服务器上运行。除非服务器被攻破,否则外部连接无法知道appsecret。当然需要注意的是,appsecret的值是不能写入日志的,其他敏感值也是禁止写入日志的,比如账号密码等信息。
如果是客户端请求接口,就需要多想想了。如果appsecret硬编码到客户端,就有反编译的风险,尤其是android。可以将appsecret带到客户端登录验证成功后返回给客户端的信息中(当然,返回的数据也有可能被拦截,真的防不胜防。)。特别是在android开发中,如果appsecret是硬编码的,建议把appsecret放在NDK编译成so文件,然后在app启动后读取。
Totp:基于时间的一次性密码算法(基于时间的一次性密码算法)
在一些小项目中,可能不需要复杂的签名验证,只需要调用方的身份验证即可。TOTP(rfc6238)可以满足。
TOTP是基于时间的一次性算法。客户端和服务器就密钥达成一致,加上时间作为运算因子,得到一个6位数。当客户端请求服务器时,它生成一个6位数字,服务器使用相同的算法来验证6位数字是否合法。
再来讨论一下,和本文讨论的话题关系不大。
TOTP允许客户端和服务器之间的时间误差,例如密码在n分钟内有效。给出源代码供参考:
服务器端php实现android,ios,黑莓客户端实现android app动态密码生成器
与TOTP类似,HTOP是一种基于时间的验证算法。这里就不讨论了。
基于TOTP的应用有很多,比如动态登录密码。用户登录时,不仅需要输入设定密码,还需要输入动态密码。每个用户的密钥都不一样,在用户手机上安装一个app就可以实现。动态密码每N分钟更改一次。Android客户端在各大应用市场搜索google-authenticator,比如百度应用市场,ios客户端也可以在appstore搜索。以下是一些下载链接:
Windows phoneWebOS
手机客户端如支付宝、QQ令牌、银行客户端等都有类似的应用。验证密码后,会有一个动态密码验证。他们使用的方案类似于google-authenticator。
大公司的运维人员,甚至所有员工登录内部OA系统(单点登录),都需要PIN令牌码的双重验证(PIN是自己设置的固定密码,令牌码是动态密码)。他们通常使用RSA SecurID双因素动态密码认证解决方案。
作者:hellojammyPlus
链接:http://www.jianshu.com/p/d47da77b6419
来源:简书
版权归作者所有。商业转载请联系作者授权,非商业转载请注明出处。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。