我继承了一个与Facebook集成并加密从Facebook发送的令牌的Rails应用程序,它可以保存为用户的识别验证标记。
出于多种原因,我最终更新了我的红宝石,并且发生了一些好处的变化,这导致了该应用程序问题。最重要的是对attr_encrypted
的更改,通过encrypted
GEM,它可以处理该Facebook代币的加密,因为它已保存到数据库中。
麻烦是,该应用程序是实时的并且已经有很多用户,它具有一个基本的秘密加密密钥,对于新更新的attr_encrypted
的安全标准来说太短了。具体来说,当我现在尝试加密一个令牌时(目前在测试中;我还没有实时推动这些更改),错误地说,关键需要为32个字节。
问题:
是否有人建议更新更安全的令牌?如果我更改令牌,我认为它将打破令牌的解密,以便我可能会永久失去读取/使用数据库中所有用户身份令牌的能力。这显然很有问题,所以我想在这里仔细检查我的想法。
我目前的想法是迁移:运行一个迁移,该迁移通过我的旧键解密了存储的令牌,然后用新的,更长的键保存一个新加密的令牌。
。然后我可以摆脱旧钥匙而没有任何问题。正确的?任何人都可以考虑attr_encrypted
GEM的特殊性或通常不考虑加密问题的问题吗?
我认为迁移没有问题。
看来该文档有一个有用的建议:
如果您的密钥相对于使用的算法不足,则还应通过
指定模型的示例。insecure_mode: true;
传递,这将阻止加密器提高有关密钥长度不足的例外。请参阅"折旧"部分以获取更多详细信息,其中包括如何使用attr_encryptedv1.x。
这意味着您可以使用新版本的attry-conteded按照您的建议来运行迁移。
您应该首先进行干式运行,以查看您的所有钥匙和令牌是否平均创建,并且能够以相同的方式迁移。如果是,那么您可以运行重新加密。
整个故事看起来像是该宝石的问题#109:
1. Load all instances of Foo
2. Change key by redefining self.encryption_key
3. Save all instances of Foo