URL参数签名

请求接口:http://api.test.com/test?name...

客户端

生成当前时间戳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并转换为大写
sign=MD5(stringSignTemp).toUpperCase();
最终请求

http://api.test.com/test?name...×tamp=now&nonce=nonce&sign=sign;

以上是url的参数签名过程,其中拼接secret这一步,这里secret是暴露在前端的,这样的话这个secret还要什么意义呢?

阅读 4.1k
1 个回答

URL 参数签名的作用是防止中间人修改参数或者截获 url 进行二次请求

因为有签名,所以任何人在中途试图修改 url 的参数,都是无法进行的。又因为加入了时间戳,所以在允许的时间误差范围外,这个 url 就会失效。

secret 暴露在前端的话,如果攻击者直接扒你的 js 代码,你等于完全暴露在攻击者面前。改参数的同时按照签名算法一并吧签名也改了,你连裤子都被人扒了。所以要么把签名这一步放在后端,或者干脆让后端去代理请求这个 API。

所以一般是客户端用这种方式来保证参数防篡改,前端还是老老实实上 https 吧。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题