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

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

当你开发了你的网站的 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 回复
  • 其他回帖
  • 714593351

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

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

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

    1 回复
  • Angonger

    安全性呢?

  • mainlove
    作者

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

  • 查看全部回帖

推荐标签 标签

  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    180 引用 • 447 回帖
  • frp

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

    15 引用 • 7 回帖 • 1 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    40 引用 • 40 回帖
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    106 引用 • 152 回帖 • 1 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 3 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    397 引用 • 3416 回帖 • 1 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    76 引用 • 37 回帖
  • Rust

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

    57 引用 • 22 回帖 • 2 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    122 引用 • 73 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    108 引用 • 54 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    492 引用 • 1383 回帖 • 367 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 177 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 154 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 85 回帖
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 497 关注
  • Ngui

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

    7 引用 • 9 回帖 • 345 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 601 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 635 关注
  • 安装

    你若安好,便是晴天。

    128 引用 • 1184 回帖
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 512 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 456 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 684 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 688 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 418 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 3 关注