安全地存储访问令牌

Posted

技术标签:

【中文标题】安全地存储访问令牌【英文标题】:Securely storing an access token 【发布时间】:2012-09-11 06:04:27 【问题描述】:

我应该采取哪些安全措施来确保如果我的数据库受到损害,长期访问令牌不会被盗?

长期访问令牌与特定服务的用户名和密码一样好,但从与其他人的交谈来看,似乎大多数(包括我自己)以纯文本形式存储访问令牌。这似乎与以纯文本形式存储密码一样糟糕。显然不能对令牌进行加盐和哈希处理。

理想情况下,我想加密它们,但我不确定最好的方法,尤其是在开源项目中。

我想这个问题的答案类似于存储支付信息和 PCI 合规性,但我也想问为什么没有更多的讨论这个问题?也许我错过了什么。

【问题讨论】:

“尤其是在开源项目中”是什么意思?由于您的项目不是封闭源代码,您认为是什么使您决定采用特定类型的加密方案的决定不同? 【参考方案1】:

您只想验证其他人提供的令牌吗?如果是这样,请将其视为密码。使用像Password Based Key Derivation Function 2 (PBKDF2)(也在RFC 2898 中描述)这样的字节派生算法进行10,000 次迭代并存储前20 个字节左右。收到令牌时。它实际上是不可逆的。

您想将令牌提供给其他人进行身份验证吗?如果是这样,这是一个挑战,因为如果您的应用程序可以解密或以其他方式访问令牌,那么攻击者也可以。想想香农的格言,攻击者知道系统,尤其是对于开源项目。

在这种情况下,最好的方法是使用强大的算法(例如 AES256)加密令牌,使用强大的加密标准随机数生成器生成密钥,并将密钥安全地存储在与数据不同的位置,例如在上例中数据库外部的权限保护文件中。后者意味着 SQL 注入攻击不会泄露密钥。

【讨论】:

谢谢 - 我更多地指的是您的后一个用例,我需要能够在以后用户不在时使用令牌。 @akton 但为什么将令牌视为密码? (纯文本)密码是我们不希望攻击者获得 b/c 的信息,他/她可以尝试使用它以相同的密码登录到不同的服务。但是令牌仅对您自己的服务有效-因此,如果攻击者掌握了令牌/数据库,他/她可能会造成比仅使用令牌登录您的帐户更大的伤害...我没有看到什么? 假设问题是正确的,令牌是每个用户的长期证据,可以对用户进行身份验证。换句话说,它是一个密码。 短期访问令牌的答案会有所不同吗? @AlikElzin-kilaka 这取决于“短命”的含义。如果在单个请求或操作中使用它,则对保护的需求要少得多。如果您在请求或操作之间存储它,您应该按照上面的指示保护它。

以上是关于安全地存储访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中安全地存储访问令牌和秘密?

如何安全地存储 Discord(OAuth2) 用户的访问令牌?

OAuth 2.0 在哪里安全地存储访问令牌以供长期使用

为命令存储访问和刷新令牌

加密,然后将访问令牌存储在 localStorage

如何安全地实现“基于令牌的身份验证”以访问在 PHPFox 中开发的网站资源(即功能和数据)?