【问题标题】:How to store OAuth 2 access tokens in a database?如何将 OAuth 2 访问令牌存储在数据库中?
【发布时间】:2019-03-21 09:51:17
【问题描述】:

我已经看到了很多关于此的主题,但没有具体说明如何这样做。

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

我想长时间存储这个访问令牌,所以我使用数据库来这样做。

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

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

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

我对访问令牌的安全性没有经验 - 所以不知道采取的最佳途径,如果提供任何见解,我将不胜感激。

谢谢

【问题讨论】:

    标签: node.js database access-token


    【解决方案1】:

    我想长时间存储这个访问令牌,所以我使用数据库来这样做

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

    虽然 Security Stack Exchange 上的 this question 不能完全解决您的情况,但它的答案可能会帮助您更好地了解加密/解密数据库字段中的数据的流程。 This answer 包含流的可视化表示可能是您首先要查看的。

    现在您已经对流程有了一个直观的了解,您可能想阅读this article,它将引导您了解在数据库中存储敏感数据的基本加密策略:

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

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

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

    此时您必须对如何在数据库中保护您的令牌有一个更好的了解,如果可以的话,我想在我去之前提出一个建议和一个警告......

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

    我不能散列它(因为我需要一个密码),因为我需要能够读取和使用原件来代表用户呼叫第 3 方。

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

    这是真的,我想提醒您,您的服务器可能会成为 API 滥用的对象,正如 this series of articles 所公开的那样:

    • 数据抓取 - 从 API 自动收集专有数据。
    • 帐户劫持 - 重复使用被盗凭据来登录您服务上的帐户。
    • Fake Account Factories - 自动化 API 操作以创建大量机器人控制的帐户。
    • 聚合 - 您的数据在未经许可的情况下作为商业企业的一部分与其他人的数据进行聚合。
    • Cheat as as Service - 允许用户在游戏化和基于奖励的平台上作弊的 Web 应用。

    【讨论】:

    • 有哪些方法可以针对您列出的 API 滥用方法进行迁移?
    • 您需要保护您的 API 服务器,使其能够高度自信地识别 what 正在做什么请求。我建议您阅读关于移动 API 安全性的文章 this series 以及我在 如何保护移动应用程序的 API REST? 问题上给出的其他 StackOverflow answer
    猜你喜欢
    • 2017-11-03
    • 2014-12-08
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多