我应该采取哪些安全措施来确保如果我的数据库受到损害,长期访问令牌不会被盗?
长寿命的访问令牌与特定服务的用户名和密码一样好,但从与他人的交谈来看,似乎大多数(包括我自己)以纯文本形式存储访问令牌。这似乎与以纯文本形式存储密码一样糟糕。显然,不能对令牌进行加盐和哈希处理。
理想情况下,我想加密它们,但我不确定最好的方法,尤其是在开源项目中。
我想这个问题的答案类似于存储支付信息和 PCI 合规性,但我也想问为什么没有更多的讨论这个问题?也许我错过了一些东西。
我应该采取哪些安全措施来确保如果我的数据库受到损害,长期访问令牌不会被盗?
长寿命的访问令牌与特定服务的用户名和密码一样好,但从与他人的交谈来看,似乎大多数(包括我自己)以纯文本形式存储访问令牌。这似乎与以纯文本形式存储密码一样糟糕。显然,不能对令牌进行加盐和哈希处理。
理想情况下,我想加密它们,但我不确定最好的方法,尤其是在开源项目中。
我想这个问题的答案类似于存储支付信息和 PCI 合规性,但我也想问为什么没有更多的讨论这个问题?也许我错过了一些东西。
你只是想验证别人提供的令牌吗?如果是这样,请将其视为密码。使用字节派生算法,如基于密码的密钥派生函数 2 (PBKDF2)(也在RFC 2898中描述)进行 10,000 次迭代并存储前 20 个字节左右。收到令牌时。它实际上是不可逆的。
是否要将令牌提供给其他人进行身份验证?如果是这样,这是一个挑战,因为如果您的应用程序可以解密或以其他方式访问令牌,那么攻击者也可以。想想香农的格言,攻击者知道系统,尤其是对于开源项目。
在这种情况下,最好的方法是使用强大的算法(例如 AES256)加密令牌,使用强大的加密标准随机数生成器生成密钥,并将密钥安全地存储在与数据不同的位置,例如在上例中数据库外部的权限保护文件。后者意味着 SQL 注入攻击不会泄露密钥。