API签名,接口签名验签

  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

  来源:简书

  版权归作者所有。商业转载请联系作者授权,非商业转载请注明出处。

API签名,接口签名验签