在 Rails 应用程序中优雅地重新加密令牌

Gracefully re-encrypting tokens in Rails app

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

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

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

问题:

有人对更新到更安全的令牌有什么建议吗?如果我更改令牌,我认为这会破坏令牌的解密,因此我可能会永久失去 read/use 数据库中所有用户身份令牌的能力。这显然是个问题,所以我想在这里仔细检查一下我的想法。

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

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

按照您的建议,我认为迁移没有问题。

documentation 似乎有一个有用的建议:

If your key is insufficient length relative to the algorithm that you use, you should also pass in insecure_mode: true; this will prevent Encryptor from raising an exception regarding insufficient key length. Please see the Deprecations sections for more details including an example of how to specify your model with default options from attr_encrypted v1.x.

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

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

gem 的 issue#109:

中似乎包含了完整的故事
1. Load all instances of Foo
2. Change key by redefining self.encryption_key
3. Save all instances of Foo