加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 01:37:06 所属栏目:百科 来源:网络整理
导读:我想访问由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的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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读