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

时间:2018-10-16 19:21:18

标签: node.js database access-token

我在此上看到了很多线程,但具体操作方法却不具体。

我目前正在让用户通过OAuth2与第三者进行身份验证,并且得到访问令牌作为回报。

我想长时间存储此访问令牌,因此我正在使用数据库来存储它。

我的问题涉及如何处理此数据库条目以确保安全性。

我无法对它进行哈希处理(就像输入密码一样),因为我需要能够代表用户阅读和使用原始文档来呼叫第三方。

因此,我将其保留下来,找到一种2路加密方法(是否有最好的/推荐的npm软件包?)或我不知道的另一种解决方案。

我对访问令牌的安全性没有丰富的经验-因此不知道采用哪种最佳途径,将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:1)

  

我想长时间存储此访问令牌,因此我正在使用数据库来存储

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

尽管安全堆栈交换上的Advanced Encryption Standard不能完全解决您的情况,但对它的回答可能有助于您更好地了解加密/解密数据库字段中数据的流程。 this question包含可视化的流程表示,可能是您要首先看到的。

现在,您已经对流程有了一个直观的了解,您可能希望阅读This answer,它会带您了解用于在数据库中存储敏感数据的基本加密策略:

  

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

     

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

     

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

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

首先,我强烈建议您仅支持通过安全通信通道(也称为https)进行通信。如今,没有理由不使用https,而this article可以免费使用SSL证书。

  

我无法对它进行哈希处理(就像输入密码一样),因为我需要能够代表用户阅读和使用原始文档来呼叫第三方。

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

这是真的,我想提醒您,您的服务器可能会成为Lets-encrypt上公开的API滥用主体:

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