1

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

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

attr_encrypted问题是,该应用程序已经上线并且已经有很多用户,它的基本秘密加密密钥对于新更新的安全标准来说太短了。具体来说,当我现在尝试加密令牌时(目前在测试中;我还没有实时推送这些更改),会抛出一个错误,指出密钥需要为 32 个字节。

问题:

有没有人建议更新到更安全的令牌?如果我更改令牌,我假设这将破坏令牌的解密,因此我可能会永久失去读取/使用数据库中所有用户身份令牌的能力。这显然很成问题,所以我想在这里仔细检查一下我的想法。

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

然后我可以毫无问题地摆脱旧钥匙。正确的?任何人都可以想到的关于attr_encryptedgem 的特性或我可能没有考虑的一般加密问题的任何问题?

4

2 回答 2

3

正如您所提议的那样,我认为迁移没有问题。

似乎文档有一个有用的建议:

如果您的密钥相对于您使用的算法长度不足,您还应该传入insecure_mode: true;这将防止 Encryptor 引发有关密钥长度不足的异常。请参阅弃用部分了解更多详细信息,包括如何使用 attr_encrypted v1.x 中的默认选项指定模型的示例。

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

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

于 2017-02-18T10:08:13.820 回答
0

完整的故事看起来像是在那个 gem 的issue#109中介绍的:

1. Load all instances of Foo
2. Change key by redefining self.encryption_key
3. Save all instances of Foo
于 2017-02-22T20:05:03.640 回答