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

2026-04-10 07:273阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计468个文字,预计阅读时间需要2分钟。

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

我想访问由Rails创建的数据库中的数据,不使用Ruby代码。某些字段使用attr_encrypted插件进行加密,目前正在使用的库是对称加密gem。如果我想尝试使用NodeJS加密库解密数据,我会直接得到错误的最终结果。

我想访问由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的`symmetric-encryption` gem加密的数据?

要直接使用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.

本文共计468个文字,预计阅读时间需要2分钟。

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

我想访问由Rails创建的数据库中的数据,不使用Ruby代码。某些字段使用attr_encrypted插件进行加密,目前正在使用的库是对称加密gem。如果我想尝试使用NodeJS加密库解密数据,我会直接得到错误的最终结果。

我想访问由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的`symmetric-encryption` gem加密的数据?

要直接使用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.