这样设计WEB API接口安全吗?

我要提供一个 HTTP 接口给客户端,因为是一个简单的需求,就是提交用户反馈,把userid,反馈内容等通过GET方式请求接口。

为了保证请求合法,有两种方式,一个是白名单,一个是构造签名。

这里采用了验证签名的方式,即参数按字典排序 + secret key 通过 sha1 加密构造签名,然后服务端收到参数也用同样的 secret key 加密,然后对比进行验证,这样做是否可行?

了解过 Oauth 2 ,签名,session + cookie方式,Basic 等鉴权和身份认证方式,但对于我这种需求,似乎这样简单的签名就可以满足安全要求了。

阅读 12k
9 个回答

各厂商流行的做法是签名

这里采用了验证签名的方式,即参数按字典排序 + secret key 通过 sha1 加密构造签名,然后服务端收到参数也用同样的 secret key 加密,然后对比进行验证,这样做是否可行?

,,,,,
JAVAScript暴露了你的secret key

签名认证的核心在于 secret 不能暴露给前端,所以顺序一定是:服务器生成 token 交给前端,前端带 token 请求,服务器检查 token。

注意生成 token 用的 secret 始终保存在服务端,前端自己不生成 token,否则 secret 和加密方法都暴露了。

至于使用什么样的 token,JWT 已经有规范了不用自己琢磨: https://jwt.io

客户端是浏览器的:采用前端rsa+token
客户端是native的:采用原生代码混淆+rsa+token

secret_key 不能暴露在参数中,可以这样
用户录入的字段为content,这样你需要传3个字段到服务器
user_id
content
timestamp

你可以再添加一个字段,命名为 verify_code,verify_code可以按照类似以下规则生成
md5(secret_key.substring(0, 4) + timestamp.substring(0, 4) + user_id + content + timestamp.substring(4, 10) + secret_key.substring(4, 10))

所以,按照你那种方法,最少要传4个参数到服务器比较稳妥
user_id
content
timestamp
verify_code

然后服务端只需校验verify_code

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