我想访问由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.