📌  相关文章
📜  API 密钥及其安全性

📅  最后修改于: 2021-10-19 04:35:36             🧑  作者: Mango

在对 API Keys 和 OAuth Credential 进行了大量讨论之后,在本文中,我们将从安全和隐私的角度重点讨论哪个更好。但在进一步讨论之前,让我们先回忆一下AuthenticationAuthorization是什么意思?

身份验证是指通过使用用户 ID、用户名、密码等凭据来验证您的身份。它涉及确定您是否是您所说的那样,您正在使用您提供的凭据。一个最普遍的例子是我们几乎在所有网站上都会遇到的登录表单。

另一方面,授权旨在确定您是否有权访问资源。在系统验证您的身份后,下一步是根据您的身份授予您对资源的访问权限。

例如,如果我们以笔记本电脑为例。假设笔记本电脑中有 2 个用户,一个是 Admin,另一个是 ABC。 ABC 无权删除文件。 ABC只能创建一个文件,读取一个文件,修改一个文件。
如果用户已输入管理员凭据。系统将首先将凭据与数据库中的凭据进行匹配,以确定此用户是哪个用户,或者在某个情况下它是否是合法用户。在对凭据进行身份验证后,系统会知道它是管理员,因此它将看到管理员的权限集并仅授予管理员的权限。像管理员也可以删除文件。但是如果是ABC用户,则只能创建文件,读取文件,修改文件,不允许删除。这就是众所周知的授权。

看完这些区别之后,我们就可以很容易地理解 API Key 和 OAuth 之间的区别了。 API 有三种类型的安全机制 –

  1. HTTP 基本身份验证:在这种机制中,HTTP 用户代理提供用户名和密码。由于此方法仅依赖于 HTTP Header 并且整个身份验证数据都在不安全的线路上传输,因此很容易发生中间人攻击,用户可以简单地捕获 HTTP Header 并使用 copy-cat Header 和恶意数据包。由于强制实施 SSL,此方案非常慢。 HTTP 基本身份验证可用于速度不成问题的内部网络等情况。
  2. API 密钥:由于 HTTP 基本身份验证的速度慢且极易受到攻击,API 密钥开始出现。 API Key 是在 API 注册或创建账户时分配给用户的代码。 API 密钥是使用 API 开发相关机构制定的一组特定规则生成的。每当实体(开发人员、用户或特定程序)调用 API 时,都需要传递这段代码。尽管易于使用且速度很快,但它们非常不安全。问题仍然存在,为什么?
    问题是,API Key 是一种身份验证方法,而不是授权方法。它们就像用户名和密码,从而提供进入系统的入口。通常,API Key 放置在以下位置:授权标头、基本身份验证、正文数据、自定义标头、查询字符串。

    任何时候在发出请求时,我们都需要通过将 API 密钥放置在上述任何地方来发送它。因此,如果网络在任何时间点受到威胁,那么整个网络都会暴露出来,并且可以轻松提取 API 密钥。
    API 密钥一旦被盗,就可以无限期使用。除非且直到项目所有者撤销 API 密钥并生成新的 API 密钥。

  3. OAuth: OAuth 不仅是一种身份验证或授权的方法,而且还是这两种方法的混合。每当使用 OAuth 凭据调用 API 时,用户都会登录系统,生成令牌。请记住,此令牌仅对一个会话有效,之后用户必须通过再次登录系统来生成新令牌。将此令牌提交给服务器后,用户将根据凭据获得角色的授权。
    现在,如果以 Youtube Data API 为例,首先用户将通过提交用户名和密码等凭据来验证自己,然后将生成的令牌提交给服务器并为角色授权自己。

    下图显示了 OAuth 凭证的工作原理:

    登录成功后会生成一个token。该令牌在呈现给服务器时决定调用用户的适当权限并相应地生成结果。图像中突出显示的部分代表生成的授权令牌。

参考:

  1. https://nordicapis.com/3-common-methods-api-authentication-explained/
  2. https://zapier.com/engineering/apikey-oauth-jwt/
  3. https://apifriends.com/api-security/api-keys-oauth/
  4. https://cloud.google.com/endpoints/docs/openapi/when-why-api-key
  5. https://nordicapis.com/why-api-keys-are-not-enough/