web api 安全认证的方案(很严肃)

本贴最后更新于 2386 天前,其中的信息可能已经时移世改

当你开发了你的网站的 api,就必须对 api 的调用者进行安全认证

现在普遍的方案是(https 是必须的): 给你一个 app_id 和 secret_id

  1. 用 app_id 和 secret_id 换取临牌 token,token 有时效性,一定时间再去换一个新的
  2. 每个请求头都附带 app_id ,token 和 timestamps(时间戳),nonce(随机数),以及根据某个预设规则把这些东西加上请求内容(请求的内容可以加密)用签名算法(MD5,SHA1 或者 HMCA-MD5)搞成一个签名字符 signature,一起发送给服务端
  3. 服务端根据 token 判断是否合法的请求身份,根据 signature 判断请求的有效性(包含时间有效性,是否被篡改),然后如果内容是加密的再进行一次解密

以上方案基本是现在微信,支付宝等的概要(如果那块说的很不对,求大家马上说明)
但我仔细想想还是有如下问题

  • 第 1 步 直接传 app_id 和 secret_id 不安全,被截获了不就完了? 我觉得 secret_id 永远不能直接传送,不过好像支付宝有安全的第一步认证,加密摘要什么的,反正微信是没有,就直接传,这个不是很不好吗?
  • token 虽然有时效性,但是签名算法都是公开的,MD5,SHA1 大家都会,被截获了还是有机会短时间被盗用啊? MHAC 是不错的,但是 HMAC 利用了 secret_id,那我就很好奇了为啥要去搞个 token?

带着第二疑问我看到了七牛的 API,七牛的 API 没有什么远程获取 token 的机制,每次的 token 都是自己生成的,七牛每次的请求需要有一个凭证:这个凭证的生成办法是,对请求的 url 或者内容用 secret_id 做 HMAC 算法,然后转生 base64,加上 app_id 形成最后的凭证

也就是说根本不需要服务器提供 token,因为 HMAC 算法需要一个密钥,用 HMCA 做摘要等于起到了两个目的,1 防止篡改 2 app_id 和 secret_id 的认证,因为错误的 secret_id 无法生成出这个 app_id 的凭证,这不就等同于用户名密码的校验了?

那个为什么还需要远程获取 token 这个动作?? 个人认为这个东西有所多余了
请大家指正!!!

  • 安全

    安全永远都不是一个小问题。

    189 引用 • 813 回帖
  • token

    令牌、凭证、代币、记号,whatever...

    7 引用 • 14 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • token 不单单根据 app_id 和 secret_id 来获取。。。

    在服务端还有一个东西,一起生成 token

    这样子每次使用 token,就可以减少 secret_id 在网路上传输。

    而且 token 是全局的,如果多个应用共用一个微信的话,就可以通过共用 token 来提高安全性。

    secretid 只在维护 token 的那台服务器维护

    1 回复
  • 88250

    我想主要是因为 token 有时效性,服务端在需要的情况下方便控制。

  • mainlove
    作者

    每次用 secret_id 做 HMCA 签名,secret 永远不需要传

  • 714593351

    我感觉,token 更多的是服务控制,而不是判断请求的有效性。换取 token 主要是为了对客户端 secret 有效性做校验的,比如需要将某个 secret 失效,直接在换取 token 的时候就可以拦截。

    如果没有 token,那么需要在每个接口前增加 secret 有效性校验。

    类似网站的登录,登录后每次请求只要携带 cookie,系统就认为是登录后的请求,不需要校验用户是否有效。

    1 回复
  • Angonger

    安全性呢?

  • Tnima

    这个是具体场景的问题,你说 7 牛没有 token 那是因为你是 server 操作啊!
    如果是客户端,那么 7 牛为了安全依然需要 token.
    参见:
    https://github.com/qiniu/js-sdk/

    1 回复
  • mainlove
    作者

    七牛的 token 就是凭证 每次需要生成
    传统的 token 是一段时间内不变

    1 回复
  • Tnima

    你还是没看懂,算了,你想怎么理解就怎么理解吧.

请输入回帖内容 ...

推荐标签 标签

  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    57 引用 • 22 回帖 • 4 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 126 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    15 引用 • 7 回帖 • 10 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 230 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    284 引用 • 4481 回帖 • 656 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    19 引用 • 31 回帖 • 4 关注
  • danl
    62 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 108 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 2 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 346 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 8 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1056 回帖 • 2 关注
  • CodeMirror
    1 引用 • 2 回帖 • 116 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 267 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 622 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    76 引用 • 390 回帖
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    123 引用 • 168 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 440 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 37 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 133 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    27 引用 • 66 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 423 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 452 关注
  • 安全

    安全永远都不是一个小问题。

    189 引用 • 813 回帖
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 1 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖