2017-02-17 62 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 
相關問題