ruby-on-rails – 为Rails编写加密的cookie会话存储;我的方法安全吗?

默认情况下,
Ruby on Rails将会话数据存储在cookie中.这有许多优点,例如不需要在服务器端设置任何持久层.但是,会话数据未加密,我正在编写的Rails应用程序会在会话中放置可能敏感的数据.如果可能的话,我想避免存储会话数据服务器端,并且Rails的唯一现有加密cookie存储实现似乎被放弃了,所以我正在编写自己的加密cookie存储.

Rails cookie会话存储的工作方式如下:

>它将会话数据序列化为字节字符串.
>序列化数据转换为base64.
> base64数据由HMAC附加. Rails要求HMAC密钥至少为30个字节;默认情况下,Rails会生成一个128字节的随机字符串作为密钥,从/ dev / urandom获取.用于HMAC的默认哈希算法是SHA-1.
> base64数据HMAC作为cookie发送到HTTP客户端.
>当客户端执行请求时,Rails首先检查HMAC验证是否成功.如果没有,那么它将静默地丢弃cookie中的会话数据,就像用户根本没有发送任何会话数据一样.这也意味着如果管理员更改HMAC密钥,则所有旧会话将自动失效.
> base64数据是de-base64’ed并解组为Ruby数据结构.

我正在编写的加密cookie会话存储是普通cookie存储类的子类.它的工作原理如下:

>它插入步骤3.5:在步骤3之后,它将加密数据.
>它修改了第5步:在检查HMAC之前,它会解密数据.
>加密算法在CFB模式下为AES-256.据我所知,EBC将揭示重复模式.
>代码要求管理员指定正好为32个字节的加密密钥.加密密钥未进行哈希处理.默认情况下,它建议从/ dev / urandom获得一个正好为32字节的随机生成的加密密钥.
>它还要求管理员指定恰好16个字节的初始化向量. IV没有散列,默认情况下它表示从/ dev / urandom获得的随机生成的IV.

我加密前的HMAC(而不是加密后的HMAC)的原因是因为我希望能够检测到加密密钥或IV的变化.如果更改加密密钥或IV,我希望软件自动使旧会话无效.如果我在加密后进行HMAC,那么如果我更改加密密钥或IV,则HMAC验证将通过,这是不合需要的.

我的方法安全吗?如果没有,那么缺少什么?

几点说明:

>我想按照http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html的建议使用CTR,但遗憾的是OpenSSL(包含在Ruby标准库中)不支持CTR,我不想要求我的用户安装单独的第三方加密库.
>我想将SHA-256用于HMAC. daemonology.net建议不要使用SHA-512,因为潜在的“对32位系统的侧通道攻击”(无论这意味着什么).但是,并非每个平台都支持SHA-256作为HMAC的哈希算法.最值得注意的是,OS X上提供的Ruby不支持HMAC SHA256.我希望我的代码在OS X上开箱即用.

最佳答案 我不确定我是否100%正确地读你,但如果我,你似乎错过了使用IV的观点.您似乎计划拥有一个秘密IV,您将用于每个cookie.

IV不需要秘密.此外,您永远不应该使用相同的密钥重复使用相同的IV.

除此之外,我没有看到任何重大缺陷.这并不意味着它们不存在.

点赞