安全存储访问令牌

Tom*_*rth 12 security encryption oauth access-token

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

长期访问令牌与特定服务的用户名和密码一样好,但是通过与其他人交谈,它似乎最多(包括我自己)以纯文本形式存储访问令牌.这似乎与在纯文本中存储密码一样糟糕.显然,人们不能对令牌进行加盐和散列.

理想情况下我想加密它们,但我不确定最好的方法,特别是在开源项目上.

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

akt*_*ton 10

您是否只想验证他人提供的令牌?如果是这样,请将其视为密码.使用字节派生算法,如基于密码的密钥派生函数2(PBKDF2)(也在RFC 2898中描述),具有10,000次迭代并存储前20个字节左右.收到令牌时.它实际上并不可逆.

您是否要将令牌呈现给其他人进行身份验证?如果是这样,这是一个挑战,因为如果您的应用程序可以解密或以其他方式访问令牌,攻击者也可以.想想Shannon的Maxim,攻击者就知道这个系统,特别是对于一个开源项目.

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