合金电阻,赛普欢迎您!

拒绝界面裸奔!开放的API接口签名验证!

首页 > 资讯

作者:Joker_Coding来源:r6d.cn/kChH接口安全性问题身份要求合法吗?请求参数是否已被篡改?请求是唯一的吗? AccessKey& SecretKey(开放平台)请求身份分配AccessKey(开发人员ID,以确保唯一性)和SecretKey(用于接口加密,以确保不易穷举,并且不容易猜测生成算法)。

为防止篡改参数签名,请按请求参数名称的字母升序排列非空的请求参数(包括AccessKey),并使用URL键值对格式(即key1 = value1& key2 = value2 ... )拼接成字符串stringA;在stringA的末尾,将Secretkey拼接以获取字符串stringSignTemp;在stringSignTemp上执行MD5操作,并将获得的字符串的所有字符都转换为大写字母以获得符号值。

该请求带有参数AccessKey和Sign,只有具有合法身份AccessKey和正确签名的请求才能被释放。

这解决了身份验证和参数篡改的问题。

即使请求参数被劫持,由于无法获取SecretKey(仅用于本地加密,并且不参与网络传输),因此无法伪造合法请求。

尽管重播攻击解决了篡改请求参数的隐患,但也存在重复使用请求参数伪造次要请求的隐患。

timestamp + nonce方案随机数是指用于标识每个已签名请求的唯一随机字符串。

通过为每个请求提供唯一的标识符,服务器可以防止多次使用该请求(记录所有已使用的随机数以防止再次使用它们)。

但是,对于服务器而言,永久存储所有收到的随机数的成本非常高。

您可以使用时间戳来优化随机数的存储。

假设客户端和服务器之间的时间差最大为15分钟,并且跟踪记录在服务器上的现时集。

收到新请求时,请首先检查所携带的时间戳记是否在15分钟内,如果超出了时间范围,则拒绝它,然后查询所携带的随机数,如果有现成的现时,则拒绝它。

否则,记录随机数,并在集合中删除时间戳大于15分钟的随机数(您可以使用redis的expire,添加随机数并将其超时时间设置为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×tamp = now& nonce = random”;拼接密钥SecretKey stringSignTemp =” AccessKey = access& home = world& name = hello& work = java×tamp = now&nonce = random& SecretKey = secret” MD5并转换为大写符号= MD5(stringSignTemp).toUpperCase();最终请求http://api.test.com/test?name=hello&home=world&work=java×tamp=now&nonce=nonce&sign=sign;服务器令牌和AppKey(APP)在APP开放API接口的设计中,由于大多数接口都涉及用户的个人信息和产品敏感数据,因此必须对这些接口进行身份验证。

为了安全起见,用户暴露纯文本密码的次数越少越好,但是请求之间客户端和服务器之间的交互是无状态的,也就是说,当涉及到用户状态时,每个请求都必须进行身份验证信息。

令牌认证用户登录并向服务器提供认证信息(如帐号和密码),认证成功后服务器将令牌返回给客户端。

客户端将令牌保存在本地,并在后续请求发起时携带该令牌;服务器检查令牌的有效性,如果有效,则使其有效,如果无效(令牌错误或过期),则将其拒绝。

安全风险:令牌被劫持,伪造了请求,并且参数被篡改。

Token + AppKey签名验证类似于上述开发平台的验证方法。

将AppKey(用于接口加密的密钥,不参与传输)分配给客户端,将AppKey和所有请求参数组合到一个源字符串中,并根据签名算法生成签名值,发送请求时,签名值被发送到服务器进行验证。

这样,即使令牌被劫持,另一方也不知道AppKey和签名算法,也无法伪造请求和篡改参数。

结合以上

cache
打开客服菜单