【问题标题】:Rails 5 cipher.key "key must be 32 bytes" errorRails 5 cipher.key“密钥必须为 32 字节”错误
【发布时间】:2016-09-28 07:59:51
【问题描述】:

全新的 Rails 应用程序。

Rails 版本 5.0.0.1,Ruby 版本 2.4.0preview2。

创建应用程序“demo”,运行一个简单的scaffold generate Product,并在尝试查看scaffold 的概述页面时出错(基本索引文件仍然可以正常加载Welcome to Rails 屏幕):

ProductsController#index 中的参数错误 密钥必须是 32 字节:

  cipher = new_cipher
  cipher.encrypt
  cipher.key = @secret

  # Rely on OpenSSL for the initialization vector
  iv = cipher.random_iv

问题行显然是 cipher.key = @secret。

我在 Rails 的 github 存储库中看到了多次提到这个问题,但都暗示它现在在 Rails 5.0.0.1 中得到了解决

【问题讨论】:

  • 确定5.0.0.1,而不是5.0.0.0吗?我刚刚阅读了this issue 和相关的拉取请求;看起来该错误已修复?不过,我会尝试按照您的描述重新创建它...
  • 如果我运行rails -v 我得到Rails 5.0.0.1,运行gem list rails -all 显示只安装了5.0.0.1
  • Gemfile 列表gem 'rails', '~> 5.0.0', '>= 5.0.0.1'

标签: ruby-on-rails ruby ruby-on-rails-5


【解决方案1】:

好的,我的理解有点小,看起来修复是在 5.0.1 而不是 5.0.0.1

https://github.com/rails/rails/issues/26694

【讨论】:

  • 可以确认更新到 5.0.1 确实解决了这个问题
  • @Aaron 确认
【解决方案2】:

请使用 Digest::MD5 达到 32 字节

require 'openssl'
require 'digest'
require 'base64'

data = "encrypt me"
secret_key = "asd3dssdf34HDas"
c = OpenSSL::Cipher.new("aes-256-cbc")
c.encrypt
c.key = Digest::MD5.hexdigest(secret_key) # this will convert key length into 32
encrypted_data = c.update(data.to_s) + c.final
encrypted_data = Base64.urlsafe_encode64(encrypted_data, padding: false) #padding: false will remove '/', '+' from encrypted data
encrypted_data.gsub! "\n",""

或者只需使用长度为 32 字节的 密钥

data = "encrypt me"
secret_key = "Aswertyuioasdfghjkqwertyuiqwerty"
c = OpenSSL::Cipher.new("aes-256-cbc")
c.encrypt
c.key = secret_key 
encrypted_data = c.update(data.to_s) + c.final

【讨论】:

    【解决方案3】:

    终于找到问题了!它来自一个错误修复...https://bugs.ruby-lang.org/issues/12561

    如果您使用密码,例如'aes-256-cfb',key_len 是 32,发现者:

    require 'openssl'
    cipher = OpenSSL::Cipher.new('aes-256-cfb')
    cipher.key_len # => 32
    

    我们错误地认为我们需要发送一个 256 个字符的 nonce,但实际上您应该发送一个 32 个字符的 nonce - 或者 使用cipher.random_key(内部使用key_len)。以前从来不是问题,因为 openssl 截断了随机数……但现在您需要发送正确的加长随机数。

    将 ruby​​ 从 2.3.4 升级到 2.4.2 时出现此错误。

    【讨论】:

      【解决方案4】:

      这个问题原来与您正在使用的密钥有关。在不更改密钥的情况下,您可以使用以下代码将密钥转换为 32 字节:

      attr_encrypted :attribute, key: ENV['MY_KEY'].bytes[0..31].pack( "c" * 32 )

      【讨论】:

        【解决方案5】:

        试试这个:

        rake db:create
        rake db:migrate
        

        那么,最重要的是:

        bundle update
        

        这对我有用。

        【讨论】:

          【解决方案6】:

          使用random_key,这样它总是合适的。

          key = cipher.random_key
          cipher.key = key
          

          参考http://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL/Cipher.html

          【讨论】:

            【解决方案7】:

            解决方案

            1. 编辑您的 Gemfile
            2. 添加以下行:gem 'rails', '~> 5.0.0', '>= 5.0.0.1'
            3. 捆绑安装
            4. 可选:我正在使用 ruby​​2-4.1 。 (rvm install ruby​​-2.4.1)

            Rational:Rails 5.0.0 之前的版本似乎存在导致此问题的错误。该错误已在最新版本的 Rails 中得到解决。如果您遵循 Rails 安装指南 (http://railsapps.github.io/installrubyonrails-mac.html),您可能会在此发布日期遇到此问题。

            此修复确实有效,并由

            验证

            【讨论】:

              【解决方案8】:

              我也遇到了这个问题,运行解决了

              bundle update
              

              确保您已安装最新版本的 rails。

              【讨论】:

                【解决方案9】:

                有同样的错误: 运行包更新应该可以解决问题

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-01-06
                  • 1970-01-01
                  • 2015-11-02
                  • 1970-01-01
                  • 2018-07-29
                  • 2019-09-30
                  • 1970-01-01
                  相关资源
                  最近更新 更多