美文网首页
接口安全

接口安全

作者: 小哥哥的简书 | 来源:发表于2019-03-28 13:48 被阅读0次

接口安全问题

请求身份是否合法?

请求参数是否被篡改?

请求是否唯一?

AccessKey&SecretKey (开放平台)

请求身份

为开发者分配AccessKey(开发者标识,确保唯一)和SecretKey(用于接口加密,确保不易被穷举,生成算法不易被猜测)。

防止篡改

参数签名

按照请求参数名的字母升序排列非空请求参数(包含AccessKey),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA;

在stringA最后拼接上Secretkey得到字符串stringSignTemp;

对stringSignTemp进行MD5运算,并将得到的字符串所有字符转换为大写,得到sign值。

请求携带参数AccessKey和Sign,只有拥有合法的身份AccessKey和正确的签名Sign才能放行。这样就解决了身份验证和参数篡改问题,即使请求参数被劫持,由于获取不到SecretKey(仅作本地加密使用,不参与网络传输),无法伪造合法的请求。

重放攻击

虽然解决了请求参数被篡改的隐患,但是还存在着重复使用请求参数伪造二次请求的隐患。

timestamp+nonce方案

nonce指唯一的随机字符串,用来标识每个被签名的请求。通过为每个请求提供一个唯一的标识符,服务器能够防止请求被多次使用(记录所有用过的nonce以阻止它们被二次使用)。

然而,对服务器来说永久存储所有接收到的nonce的代价是非常大的。可以使用timestamp来优化nonce的存储。

假设允许客户端和服务端最多能存在15分钟的时间差,同时追踪记录在服务端的nonce集合。当有新的请求进入时,首先检查携带的timestamp是否在15分钟内,如超出时间范围,则拒绝,然后查询携带的nonce,如存在已有集合,则拒绝。否则,记录该nonce,并删除集合内时间戳大于15分钟的nonce(可以使用redis的expire,新增nonce的同时设置它的超时失效时间为15分钟)。

实现

请求接口:http://api.test.com/test?name=hello&home=world&work=java

客户端

生成当前时间戳timestamp=now和唯一随机字符串nonce=random

按照请求参数名的字母升序排列非空请求参数(包含AccessKey)

stringA="AccessKey=access&home=world&name=hello&work=java&timestamp=now&nonce=random";

拼接密钥SecretKey

stringSignTemp="AccessKey=access&home=world&name=hello&work=java&timestamp=now&nonce=random&SecretKey=secret";

MD5并转换为大写

sign=MD5(stringSignTemp).toUpperCase();

最终请求

http://api.test.com/test?name=hello&home=world&work=java&timestamp=now&nonce=nonce&sign=sign;

服务端

Token&AppKey(APP)

在APP开放API接口的设计中,由于大多数接口涉及到用户的个人信息以及产品的敏感数据,所以要对这些接口进行身份验证,为了安全起见让用户暴露的明文密码次数越少越好,然而客户端与服务器的交互在请求之间是无状态的,也就是说,当涉及到用户状态时,每次请求都要带上身份验证信息。

Token身份验证

用户登录向服务器提供认证信息(如账号和密码),服务器验证成功后返回Token给客户端;

客户端将Token保存在本地,后续发起请求时,携带此Token;

服务器检查Token的有效性,有效则放行,无效(Token错误或过期)则拒绝。

安全隐患:Token被劫持,伪造请求和篡改参数。

Token+AppKey签名验证

与上面开发平台的验证方式类似,为客户端分配AppKey(密钥,用于接口加密,不参与传输),将AppKey和所有请求参数组合成源串,根据签名算法生成签名值,发送请求时将签名值一起发送给服务器验证。这样,即使Token被劫持,对方不知道AppKey和签名算法,就无法伪造请求和篡改参数。再结合上述的重发攻击解决方案,即使请求参数被劫持也无法伪造二次重复请求。

实现

登陆和退出请求

后续请求

客户端

和上述开放平台的客户端行为类似,把AccessKey改为token即可。

服务端

源码

请移步聚合支付平台,博主正在开发的一款开源项目,其中接口验证采用的就是上文中开放平台的验证方案,欢迎大家Star!

相关文章

  • 安全接口

    个人总结接口安全需要注意以下几点 一、避免明文: post —— post、get等请求方式只是语义不同,本质都是...

  • 接口安全

    接口安全问题 请求身份是否合法? 请求参数是否被篡改? 请求是否唯一? AccessKey&SecretKey (...

  • 接口安全

    接口安全要求: 防伪装攻击(案例:在公共网络环境中,第三方 有意或恶意 的调用我们的接口) 防篡改攻击(案例:在公...

  • app接口设计之安全性

    1. 什么是接口 2. 接口的作用 3. API接口保障安全性原则 4. 接口安全需求 5. signature签...

  • API接口安全性设计

    API接口安全性设计 接口的安全性主要围绕Token、Timestamp和Sign三个机制展开设计,保证接口的数据...

  • 开放平台API接口安全策略汇总

    开放平台API接口安全策略汇总 在设计开放平台接口过程中,往往会涉及接口传输安全性相关的问题,本文对接口加密及签名...

  • SpringBoot 如何保证接口安全?老鸟们都是这么玩的!

    为什么要保证接口安全 对于互联网来说,只要你系统的接口暴露在外网,就避免不了接口安全问题。 如果你的接口在外网裸奔...

  • 『居善地』接口测试 — 17.接口测试的认证

    1、接口的安全机制 一般在实际项目的接口开发中,接口的安全机制是绕不开的一个话题。不管是自己内部使用的接口也好,还...

  • PHP接口安全

    在接口及过程加密方法上,使用md5、AES等算法,进行比对,相同就allow,不同就deny; 或者通过当前use...

  • 接口安全方法

    服务端对外开放API接口,尤其对移动应用开放接口的时候,更需要关注接口安全性的问题,要确保应用APP与API之间的...

网友评论

      本文标题:接口安全

      本文链接:https://www.haomeiwen.com/subject/lecqbqtx.html