如何在数据库中存储 OAuth 2 访问令牌?

JDT*_*JDT 9 database node.js access-token

我在这方面看到了很多线索,但没有具体说明如何做到这一点。

我目前正在让用户通过 OAuth2 向第 3 方进行身份验证,作为回报,我获得了访问令牌。

我想长期存储此访问令牌,因此我正在使用数据库来执行此操作。

我的问题是如何处理这个数据库条目以确保安全。

我无法对它进行哈希处理(就像密码一样),因为我需要能够阅读并使用原件代表用户呼叫第 3 方。

因此,我只能保持原样,找到一种 2 向加密方法(是否有最佳/推荐的 npm 包?)或我不知道的其他解决方案。

我对访问令牌的安全性没有经验 - 所以不知道采取的最佳途径,并希望提供任何见解。

谢谢

Exa*_*a37 7

我想长期存储此访问令牌,因此我正在使用数据库来执行此操作

对此的解决方案是在将数据保存到数据库之前对其进行加密,并在每次需要访问时对其进行解密。在您的情况下,我认为对称加密是正确的选择,因此您需要拥有一个必须始终保持安全的私钥。此类加密最常用的算法是AES 也称为高级加密标准,对于您的用例,建议使用 AES-256 实现。

虽然Security Stack Exchange 上的这个问题并没有完全解决您的情况,但它的答案可能会帮助您更好地理解加密/解密数据库字段中的数据的流程。这个包含流程可视化表示的答案可能是您想要首先查看的答案

现在您对流程有了一个直观的了解,您可能想阅读这篇文章该文章将引导您了解在数据库中存储敏感数据的基本加密策略:

为了安全地将数据存储在数据库中,您首先要在字节数组中生成一个强大的密钥值。这最好以编程方式生成。这个单一的密钥可用于加密您想要存储的所有数据。

当您执行加密操作时,您使用此密钥初始化您的加密器,然后为您要加密的每条记录生成一个新的、唯一的初始化向量。

当您的应用程序需要处理数据时,IV 包含在数据行中,可与私钥结合使用以解密数据以供软件使用。

到这个时候,您必须对如何在数据库中保护您的令牌有更好的了解,如果允许的话,我想在我走之前提出一项建议和一项警告......

首先,我强烈建议您仅支持通过安全通信渠道(即 https)进行通信。现在没有理由不使用 https,SSL 证书现在可以免费使用Lets-encrypt

我无法对它进行哈希处理(就像密码一样),因为我需要能够阅读并使用原件代表用户呼叫第 3 方。

基于此,我将假设您的节点服务器是唯一一个代表用户调用第三方服务数据的服务器,然后将自己作为 API 公开给使用它的客户端,可能是网站和/或移动应用程序。

这是真的,我想提醒您,您的服务器可能会成为本系列文章中公开的 API 滥用的对象:

  • 数据抓取 - 从 API 自动收集专有数据。
  • 帐户劫持 - 重用被盗凭据登录您的服务帐户。
  • Fake Account Factories - 自动 API 操作以创建大量机器人控制的帐户。
  • 聚合 - 作为商业企业的一部分,未经许可将您的数据与他人的数据聚合。
  • 欺骗即服务 - 允许用户欺骗基于游戏化和奖励的平台的 Web 应用程序。