安全存储访问令牌

14

我应该采取哪些安全措施,以确保如果我的数据库被入侵,长期访问令牌不会被盗?

长期访问令牌对于特定服务与用户名和密码一样重要,但从与他人的交流中发现大多数人(包括我自己)将访问令牌存储为明文。这似乎就像将密码以明文形式存储一样糟糕。显然,您不能对令牌进行salt & hash。

理想情况下,我希望对它们进行加密,但我不确定最佳方法是什么,尤其是在开源项目上。

我想答案可能类似于存储付款信息和PCI合规性的答案,但我也想问一下为什么没有更多讨论呢?也许我漏掉了什么。


1
你说的“尤其是在开源项目上”是什么意思?你认为什么因素让你选择特定类型的加密方案与闭源项目不同?请解释一下。 - Michael J. Gray
1个回答

13

您只是想验证他人提供的令牌吗?如果是,就像处理密码一样处理它。使用字节派生算法(如密码基础密钥派生函数 2 (PBKDF2),也在RFC 2898中描述),迭代10,000次并存储前20个字节左右。当接收到令牌时,它是不可逆的。

您想向其他人提供令牌以进行身份验证吗?如果是,这是一个挑战,因为如果您的应用程序可以解密或以其他方式访问令牌,则攻击者也可以。考虑香农的最大化原则,攻击者知道系统,特别是对于开源项目。

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


谢谢 - 我更多地是指你使用案例的后者,即当用户不在场时,我需要能够在以后使用令牌。 - Tom Ashworth
1
@akton 但是为什么要像密码一样处理令牌呢?(明文)密码是我们不希望攻击者获取的信息,因为他/她可以尝试使用它来登录到具有相同密码的不同服务。但是令牌仅对您自己的服务有效-因此,如果攻击者得到了令牌/数据库,他/她可能会造成比仅使用令牌登录到您的帐户更多的危害...我看漏了什么吗? - Philipp Kyeck
1
假设问题是正确的,令牌是一种针对每个用户的长期凭证,可用于验证用户身份。换句话说,它就像是一个密码。 - akton
短期访问令牌的答案会不会有所不同? - AlikElzin-kilaka
1
@AlikElzin-kilaka 这取决于“短暂”的意思是什么。如果它只在单个请求或操作中使用,那么保护的需求就要小得多。如果您在请求或操作之间存储它,则应像上面指示的那样加以保护。 - akton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接