Rails的Session默認是存儲在Cookies中的,Cookies顯性存儲在瀏覽器中,因此基于安全性的考慮,對Cookies進行加密是非常有必要的。
比如session的數(shù)據(jù){user_id: 100},加密存儲在Cookies中可能就是這樣的形式:
BAh7BzoHaWRpBjoJbmFtZUkiC3cuZGVuZwY6BkVU--a547f29403e3d53174ddd88b7a3a64dfb8fdce6024d27105292fdbdf43c19f07
具體實現(xiàn)的方法是使用ActiveSupport::MessageVerifier這個類。
http://api.rubyonrails.org/classes/ActiveSupport/MessageVerifier.html
@verifier = ActiveSupport::MessageVerifier.new('s3Krit', digest: 'SHA256')
# 加密
cookies[:remember_me] = @verifier.generate([@user.id, 2.weeks.from_now])
# 解密
id, time = @verifier.verify(cookies[:remember_me])
這里的s3Krit,是加密用的secret,一般會使用特別長的隨機字符,Rails中會使用config/secrets.yml中的設置,加密后被破解的幾率就大大降低了。
為什么會研究這個,因為前后端分離,打算在API調(diào)用的請求加上用戶登錄的驗證,需要把用戶的session數(shù)據(jù)加密記錄在前端,調(diào)用API的時候請求的header中加上此數(shù)據(jù)。