在Rails中加密,在Laravel中解密

时间:2018-05-17 07:50:55

标签: php ruby laravel encryption

我对Encrypt Decrypt in RailsLaravel 5

有疑问

案例: 我想在Rails中加密一些数据,有时在Laravel中会解密数据。我已经阅读了Laravel如何使用HMAC sha256, SAE-256-CBC加密流并在Rails中执行流程。 但不幸的是,Laravel无法解密

这是我的代码:

@cipher = OpenSSL::Cipher.new('aes-256-cbc')
@key = ENV['LARAVEL_APP_KEY']

...

@cipher.encrypt
@cipher.key = Base64.decode64(@key)
iv = @cipher.random_iv
@cipher.iv = iv
encrypted = @cipher.update(PHP.serialize(string)) + @cipher.final

iv = base64_encode(iv)
encrypted = base64_encode(encrypted)
mac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), iv + encrypted, Base64.decode64(@key))

hash = { iv: iv, value: encrypted, mac: mac }
base64_encode(hash.to_json)
  • APP_KEY在Rails和Laravel
  • 之间已经相同
  • 预期结果:Rails Encrypt 1000,Laravel也将获得1000
  • 真实结果:Rails Encrypt 1000,Laravel获取加密(例如:eyfasffksffadsfreqw)

请帮忙!非常感谢!

1 个答案:

答案 0 :(得分:0)

我知道这是一个老问题,但仍在回答,因为它可能会像我一样帮助将来的读者,这是工作功能,我只修复了代码中的小问题,例如OpenSSL :: HMAC中的序列错误.hexdigest并更改了不添加'/ n'的base64编码函数,例如Base64.encode64(您的代码帮助我更快地进行了归档)。

def encrypt(value, key)
    @cipher = OpenSSL::Cipher.new('aes-256-cbc')
    @cipher.encrypt
    @cipher.key = @key
    iv = @cipher.random_iv
    @cipher.iv = iv
    encrypted = @cipher.update(PHP.serialize(value)) + @cipher.final

    iv = Base64.strict_encode64(iv)
    encrypted = Base64.strict_encode64(encrypted)
    mac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), @key, iv + encrypted)

    hash = { iv: iv, value: encrypted, mac: mac }
    return Base64.strict_encode64(hash.to_json)
end

请注意,这里我使用的是未经编码的密钥,因此我没有对密钥进行解码,所以这取决于您的实现。