API 密钥和 API 令牌用法有什么区别?

信息安全 验证 访问控制 oauth api oauth2
2021-08-16 08:56:09

从我所做的所有研究中,我发现 API 密钥不如访问令牌安全(在使用 oAuth 的情况下),并且应该只用于监控目的。

但据我了解,服务器会同时生成它们。因此,如果我要使用相同的强硬算法来创建我的访问令牌,或者创建 API 密钥,这不会使它们相似吗?示例将有助于更好地理解它们,因为我没有找到任何示例。

一些参考资料: https ://cloud.google.com/endpoints/docs/when-why-api-key https://zapier.com/engineering/apikey-oauth-jwt/

2个回答

API 密钥是公开的,有意的。它们是授权机制,而不是身份验证机制(您的链接中提到了这一点)。它们是如何产生的并不重要,重要的是它们是如何被处理的。换句话说:“任何拥有此密钥的人都可以进入”。

因此,当您想要授权而不需要进行身份验证时,您可以使用 API 密钥。您使用在处理中受到保护的身份验证令牌来验证连接。换句话说,“这是你的唯一密钥,允许你进入这个时间”。

由于与应用层协议消息(排序、语法、数据单元保护——或缺乏),而不是仅由使用特定加密算法、模式和/或密钥大小产生的保护。但是,如果 API 密钥字符串生成器比 OAuth 访问令牌字符串生成器更可预测,我不会感到惊讶。API 密钥通常在 HTTP 请求的第一行中作为 HTTP GET查询参数发送,如下面的 Google Maps JavaScript API 所示:

<script async defer src="https://maps.googleapis.com/maps/api/js key=YOUR_API_KEY&callback=initMap" type="text/javascript"></script>

由于 API 密钥字符串作为 HTTP GET查询参数传递,因此中间 Web 服务器(包括代理)和使用 JavaScript 或 ActionScript 等客户端脚本语言的浏览器更容易读取和/或对 API 密钥的写入权限。将此与其他类型的 HTTP 操作(例如PUTPOST )进行比较,其中查询参数对上述技术的隐藏程度更高。几乎所有的 web 服务器软件都会将上面script标签中的src属性值写入access_log和/或error_log包括 API 密钥的文件,因为查询参数变量值是 CGI(通用网关接口)环境变量的一部分:SCRIPT_PATHQUERY_STRING有关详细信息,请参阅CWE-598


另一方面,OAuth 访问令牌是按会话生成的。在提供者收到请求用户有权获得请求权限的证明之前,不会发生由安全身份验证提供者授予访问令牌的情况;这种证明可以通过对凭据的了解(即相应的用户名和密码对)来建立。其他时候,访问控制可能更具限制性,访问令牌仅提供给特定应用程序/站点/API 中的一小部分权限子集子组件、操作区域、控制范围等。最终授予最终用户的权限可以像系统管理员希望的那样细化。

例如,访问令牌通常在 HTTP 请求标头的授权字段中传输到 URL 之外。有时,自定义身份验证框架实现将导致令牌在启用了HttpOnlySecureSameSite标志的 cookie 中传输 - 或作为自定义 HTTP 请求标头(如Oracle 云存储 SaaS 公开记录的X-Auth-Token ) :Oracle 的云存储服务 API

Web 浏览器/服务器软件记录 HTTP 请求标头和 cookie 值的情况极为罕见;由于 CORS(跨源资源共享),它们也更难以以编程方式访问。相比之下,作为 HTTP GET 参数传递的 API 密钥可以使用客户端 JavaScript 从 DOM(文档对象模型)中提取。

由于这些原因,从 OAuth 等身份验证框架获取访问令牌所需的复杂性远高于记录 API 密钥使用所需的复杂性。此外,身份验证和授权框架的健壮性允许将访问令牌封装在 HTTP 协议中,从而很难查看或篡改令牌。