rails加密/解密
我需要在我的rails应用程序中进行加密和解密。 我试图使用ezcrypto,但每当我解密时,我都会收到此错误。
OpenSSL::Cipher::CipherError in ProfilesController#show wrong final block length
需要更改什么才能阻止此错误。 我尝试使用这样的另一个openssl实现(从我的模型中调用的方法)
def encrypt_attr(unencrypted) c = OpenSSL::Cipher.new("aes-256-cbc") c.encrypt c.key = Digest::SHA1.hexdigest('pass') e = c.update(unencrypted) e << c.final return e end def decrypt_attr(encrypted_attr) if encrypted_attr != "" c = OpenSSL::Cipher::Cipher.new("aes-256-cbc") c.decrypt c.key = Digest::SHA1.hexdigest('pass') d = c.update(encrypted_attr) d << c.final return d end end
它会在解密时抛出完全相同的错误。 我应该如何进行加密和解密,而不是出现这个openssl错误。
require 'openssl' require 'base64' class AesEncryptDecrypt KEY = "EncryptDecryptGurudathBN" ALGORITHM = 'AES-128-ECB' def self.encryption(msg) begin cipher = OpenSSL::Cipher.new(ALGORITHM) cipher.encrypt() cipher.key = KEY crypt = cipher.update(msg) + cipher.final() crypt_string = (Base64.encode64(crypt)) return crypt_string rescue Exception => exc puts ("Message for the encryption log file for message #{msg} = #{exc.message}") end end def self.decryption(msg) begin cipher = OpenSSL::Cipher.new(ALGORITHM) cipher.decrypt() cipher.key = KEY tempkey = Base64.decode64(msg) crypt = cipher.update(tempkey) crypt << cipher.final() return crypt rescue Exception => exc puts ("Message for the decryption log file for message #{msg} = #{exc.message}") end end end
加密
irb(main):007:0> AesEncryptDecrypt.encryption('gurudath') => "rUPKObydUJd9cY9agm3Glw==\n"
解密
irb(main):008:0> AesEncryptDecrypt.decryption('rUPKObydUJd9cY9agm3Glw==') => "gurudath"
我知道Ruby的openssl
包的文档很少。 但是,如果您想使用密码块链接 ,下面是一段简短的代码片段,概述了如何使用AES-256-CBC
密码:
require 'openssl' # your data raw = 'the data to be encrypted goes here' pwd = 'secret' salt = OpenSSL::Random.random_bytes(8) # prepare cipher for encryption e = OpenSSL::Cipher.new('AES-256-CBC') e.encrypt # next, generate a PKCS5-based string for your key + initialization vector key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pwd, salt, 2000, e.key_len+e.iv_len) key = key_iv[0, e.key_len] iv = key_iv[e.key_len, e.iv_len] # now set the key and iv for the encrypting cipher e.key = key e.iv = iv # encrypt the data! encrypted = '' << e.update(raw) << e.final p encrypted # and now we prepare to decrypt d = OpenSSL::Cipher.new('AES-256-CBC') d.decrypt # now set the key and iv for the decrypting cipher # this assumes that the password, salt, and iv are known, # so then you would be able to generate the key as per above d.key = key d.iv = iv # decrypt the data! decrypted = '' << d.update(encrypted) << d.final p decrypted
这个片段几乎是从openssl
上的Ruby标准库文档的日文(原始?)版本中逐字记录下来的 。 但是,它确实为您和您的应用程序设计提出了一些问题:
- 您需要保存
salt
值。 这与密码一起使用以生成密钥(您不需要保存密钥)。 - 您需要保存
iv
初始化向量。 这用于启动密码块链中的第一个块。 无需加密此值,但应为您加密的每条消息生成此值。
祝好运!
我和你有同样的问题,这就是我解决它的方法:
- 您的数据库列必须是:t.column:data,:binary,:limit => 10.megabyte。
- 使用确切的代码作为此博客文章 。
- 选择AES-256-ECB
- 将ivs保留为零
- 选择一个长按键