运维开发网

如何解密Ruby的`symmetric-encryption` gem用另一种语言加密的数据?

运维开发网 https://www.qedev.com 2020-08-01 21:30 出处:网络 作者:运维开发网整理
我想访问由Rails创建的数据库中的数据,以供非 Ruby代码使用.某些字段使用attr_encrypted访问器,正在使用的库是对称加密gem.如果我尝试用例如NodeJS加密库解密数据,我一直得到“错误的最终块长度”错误. 我怀疑这必须使用字符编码或填充,但我无法根据文档弄清楚. 作为一个实验,我尝试在Ruby自己的OpenSSL库中解密来自对称加密的数据,并且我得到一个“错误的解密”错误或同
我想访问由Rails创建的数据库中的数据,以供非 Ruby代码使用.某些字段使用attr_encrypted访问器,正在使用的库是对称加密gem.如果我尝试用例如NodeJS加密库解密数据,我一直得到“错误的最终块长度”错误.

我怀疑这必须使用字符编码或填充,但我无法根据文档弄清楚.

作为一个实验,我尝试在Ruby自己的OpenSSL库中解密来自对称加密的数据,并且我得到一个“错误的解密”错误或同样的问题:

SymmetricEncryption.cipher = SymmetricEncryption::Cipher.new(
  key: "1234567890ABCDEF",
  iv:  "1234567890ABCDEF",
  cipher_name: "aes-128-cbc"
)

ciphertext = SymmetricEncryption.encrypt("Hello world")

c = OpenSSL::Cipher.new("aes-128-cbc")
c.iv = c.key = "1234567890ABCDEF"
c.update(ciphertext) + c.final

这给了我一个“糟糕的解密”错误.

有趣的是,数据库中的加密数据可以由对称加密gem解密,但与SymmetricEncryption.encrypt的输出不同(并且OpenSSL也不能成功解密它).

编辑:

psql=# SELECT "encrypted_firstName" FROM people LIMIT 1;
                   encrypted_firstName                    
----------------------------------------------------------
 QEVuQwBAEAAuR5vRj/iFbaEsXKtpjubrWgyEhK5Pji2EWPDPoT4CyQ==
(1 row)

然后

irb> SymmetricEncryption.decrypt "QEVuQwBAEAAuR5vRj/iFbaEsXKtpjubrWgyEhK5Pji2EWPDPoT4CyQ=="
=> "Lurline"
irb> SymmetricEncryption.encrypt "Lurline"
=> "QEVuQwAAlRBeYptjK0Fg76jFQkjLtA=="
查看 source for the symmetric-encryption gem,默认情况下它是 adds a header到输出和 base64 encodes it,尽管这两个都是可配置的.

要直接使用Ruby的OpenSSL进行解密,您需要对其进行解码并剥离此标头,which is 6 bytes long in this simple case:

ciphertext = Base64.decode64(ciphertext)
ciphertext = ciphertext[6..-1]

c = OpenSSL::Cipher.new("aes-128-cbc")
c.decrypt
c.iv = "1234567890ABCDEF"
c.key = "1234567890ABCDEF"

result = c.update(ciphertext) + c.final

当然,您可能需要根据您在对称加密中使用的设置进行更改,例如:标题长度可能会有所不同为了解密数据库中的结果,您需要解析标头.看看source.

0

精彩评论

暂无评论...
验证码 换一张
取 消