在Rails中,secret_key_base可以更新而不会丢失以前签名的数据吗?

时间:2016-01-07 12:14:33

标签: ruby-on-rails security ruby-on-rails-4 cookies

在Rails 4.x中,secret_key_base用于签署会话cookie以及通过调用cookies.signed创建的任何其他签名cookie。

我想更新/循环/滚动此secret_key_base,但不会失去对所有以前签名的Cookie的访问权限(我不介意丢失会话)。有可能这样做吗?

理想情况下,我喜欢以下内容:

  1. 添加新的secret_key_base
  2. 在一段时间内同时使用旧secret_key_base和新secret_key_base,以便使用旧密钥签名的Cookie可以使用较新的密钥重新签名。
  3. 删除旧的secret_token
  4. 我知道从使用secret_key_base升级到^\d+,(\d+\/\w+\/\d+)的功能类似。有没有办法使用Rails实现这一目标?

2 个答案:

答案 0 :(得分:2)

您可以通过覆盖Cookie中间件中的encryptedsigned等一些方法来首先尝试使用旧secret_key_base读取Cookie来实现此目的。如果成功,那么您可以将它们升级到新的。最终所有旧的cookie都将升级到新的,然后您可以删除自定义的补丁。看看

https://github.com/rails/rails/blob/8350925bec434168f56b4fae22b5298cb4a83c41/actionpack/lib/action_dispatch/middleware/cookies.rb

还要检查消息验证程序在这里的工作方式。

https://github.com/rails/rails/blob/8350925bec434168f56b4fae22b5298cb4a83c41/actionpack/lib/action_dispatch/middleware/cookies.rb#L251

希望有所帮助。

答案 1 :(得分:0)

你可以用不同的方式解决它。 现在保留旧的secret_key并创建一个临时表,您可以存储映射到特定用户的所有cookie数据。也可以使用redis。如果您确定已收到所有现有cookie数据,则可以更改secret_key。这应该使所有cookie数据无效。现在,只要收到cookie,您就可以首先检查用户是否存在该数据,并相应地设置cookie并从临时表/ key_store中删除该条目。临时表为空后,您可以完全删除该机制