2017-02-17 55 views
1

我继承了一个与Facebook集成的Rails应用程序,并对从Facebook发送的令牌进行加密,将其保存为用户的身份验证令牌。在Rails应用程序中优雅地重新加密令牌

由于各种原因,我最终更新了我的Ruby,并且发生了一些导致应用程序问题的Gemfile更改。最重要的是对attr_encrypted的更改,它通过encrypted gem处理该Facebook令牌在保存到数据库时的加密。

问题是,该应用程序是活的并且已经有很多用户,它有一个基本秘密加密密钥,对于新更新的attr_encrypted的安全标准而言太短。特别是,当我尝试现在加密令牌时(现在进行测试;我没有实时推送这些更改),则会抛出错误,指出密钥需要为32个字节。

问题:

有没有人有更新到更安全的令牌的建议?如果我更改了令牌,我认为会中断令牌的解密,这样我可能会永久失去读取/使用数据库中所有用户身份令牌的能力。这显然很有问题,所以我想在这里仔细检查我的想法。

我目前的想法是迁移:运行迁移,循环遍历每个身份,使用我的旧密钥解密存储的令牌,然后使用新的更长的密钥保存新加密的令牌。

然后我可以摆脱旧的密钥没有任何问题。对?任何人都可以想到关于attr_encrypted宝石的特性或加密问题的任何问题,通常我可能没有想到?

+0

那么,什么是旧版本,有什么新的版本? –

回答

3

我认为没有问题,因为你已经提出了迁移。

看来documentation有一个有益的建议:

如果您的密钥是相对于您所使用的算法不够长,你也应该传递insecure_mode: true;这将防止加密器从提高公众对关键不足异常长度。请参阅Deprecations部分以获取更多详细信息,包括如何使用来自attr_encrypted v1.x的默认选项指定模型的示例。

这意味着您可以使用attr-encrypted的新版本按照您的建议运行迁移。

您应该首先进行空运行,以查看您的所有密钥和令牌是否都是平等创建的,并且能够以相同的方式进行迁移。如果是,那么你可以运行重新加密。

0

完整的故事,看起来像是覆盖在宝石的issue#109

1. Load all instances of Foo 
2. Change key by redefining self.encryption_key 
3. Save all instances of Foo