如何解密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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |