2012-11-30 73 views
1

默認情況下,導軌使用cookie存儲會話信息。我跟隨的教程說這是最好的方式,速度超快,而且它都被加密。但是,當我base64解碼cookie內容時,我可以在那裏看到我的會話信息。它混入了很多亂碼字符,但它在那裏。在導軌中加密會話信息

我在這裏錯過了什麼?

沒有軌道使用該祕密令牌的東西來加密cookie中的信息?我怎樣才能做到這一點?

回答

3

Rails使用祕密令牌登錄會話。原始數據仍然存在,但更改它將導致它不再匹配簽名,Rails將拒絕它。 cookie字符串看起來像session_data--signature,會話數據是base64編碼的編組對象,簽名是HMAC(session string, secret token)

會話數據的一般假設是它不是祕密的(因爲它通常應該只包含一些東西,如CSRF令牌和用戶ID),但它不應該由用戶更改。 Cookie簽名完成了這一點。

如果您需要實際加密數據以便用戶永遠不會看到數據,則可以使用類似OpenSSL對稱加密的方式進行此操作,也可以切換到非cookie數據存儲。

這是我自己應用程序的Cookie存儲中的變體;我沒有測試過它,但理論上這應該爲您生成實際加密的cookie。請注意,這將比默認的Cookie存儲慢得多,並且根據其運行時間,可能會成爲DOS向量。此外,加密的數據比未加密的數據更長,會話cookie有4kb的限制,所以如果你在會話中存儲了大量數據,這可能會導致你超過這個限制。

# Define our message encryptor 
module ActiveSupport 
    class EncryptedMessageVerifier < MessageVerifier 
    def verify(message) 
     Marshal.load cryptor.decrypt_and_verify(message) 
    end 

    def generate(value) 
     cryptor.encrypt_and_sign Marshal.dump(value) 
    end 

    def cryptor 
     ActiveSupport::MessageEncryptor.new(@secret) 
    end 
    end 
end 

# And then patch it into SignedCookieJar 
class ActionDispatch::Cookies::SignedCookieJar 
    def initialize(parent_jar, secret) 
    ensure_secret_secure(secret) 
    @parent_jar = parent_jar 
    @verifier = ActiveSupport::EncryptedMessageVerifier.new(secret) 
    end 
end