Laravel Crypt ::解密迁移到ruby

时间:2017-05-17 14:57:27

标签: php ruby encryption

对于客户,我们正在将Laravel应用程序迁移到Ruby应用程序。我们在数据库中存储了一些我们想要在ruby世界中解密的数据。

这是用于加密数据的laravel部分:https://laravel.com/docs/5.0/encryption

现在,当将数据导入ruby时,我们需要一个可以解密数据的计数器部分。

在laravel控制台中,我能够像这样解密数据:

>>> Crypt::decrypt('eyJpdiI6ImZyek9ZTjJNSW5ZYlhSa2ZYUldVbEE9PSIsInZhbHVlIjoia20zMTRLWEpCdXM2K05DZDBHSlE5SDlcL2pYVXk5aE5RWWR3dHFQT1dGQzA9IiwibWFjIjoiZWZlNGE3NTRhMDDlNzk2MjhlYjI1Mzc1NGNiYmRjNDMwZjM1NzdiMzkyZTU4ZjA4ZDNkMGE0YjUyOTBjMDAzOCJA')
=> "123123123123"

我不是laravel专家,但在app.php文件中设置了密钥。所以我需要能够以某种方式将它传递给解密函数。

目标是使用ruby函数获取laravel密码,加密密钥并返回解密后的值。

def decrypt_laravel_crypt(value, encryption_key)
end

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您可以使用大多数标准库来反向设计Laravel的Encrypter :: decrypt方法。除非明确告知,否则Laravel会在加密数据之前对其进行序列化。这意味着在使用之前尝试反序列化解密的字符串。

require 'base64'
require 'openssl'
require 'json'
require 'php_serialize'

def lara_decrypt(encryptedString, appKey)
   data = JSON.parse(Base64::decode64(encryptedString))

   decipher = OpenSSL::Cipher.new('aes-256-cbc')
   decipher.decrypt
   decipher.key = Base64::decode64(appKey)
   decipher.iv = Base64::decode64(data['iv'])
   decrypted = decipher.update(Base64::decode64(data['value'])) + decipher.final
   begin
      PHP.unserialize(decrypted)
   rescue
      decrypted
   end
end

同样,当您设置应用密钥时,请务必从其开头删除base64:(如果它在那里)。