Rails的Session默认是存储在Cookies中的,Cookies显性存储在浏览器中,因此基于安全性的考虑,对Cookies进行加密是非常有必要的。
比如session的数据{user_id: 100},加密存储在Cookies中可能就是这样的形式:
BAh7BzoHaWRpBjoJbmFtZUkiC3cuZGVuZwY6BkVU--a547f29403e3d53174ddd88b7a3a64dfb8fdce6024d27105292fdbdf43c19f07
具体实现的方法是使用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调用的请求加上用户登录的验证,需要把用户的session数据加密记录在前端,调用API的时候请求的header中加上此数据。
网友评论