我有一个 Rails 应用程序,它在其中一个模型中加密(使用 attr_encrypted)2 个字段。
我的流程的另一部分,不是网络应用程序,需要使用这些数据(明文)执行一些任务。
我正在尝试从数据库中读取存储的值并对其进行解密,但不能..
我的模型如下所示:
class SecretData < ActiveRecord::Base
mysecret = "mylittlesecret"
attr_encrypted :data1, :key=>mysecret, :algorithm => "aes-256-cbc"
attr_encrypted :data2, :key=>mysecret, :algorithm => "aes-256-cbc"
...
end
DB 字段(encrypted_data1 和 encrypted_data2)充满了数据,但是当我尝试解码 base64(attr_encrypted 默认情况下会这样做)和解密(我尝试从命令行使用 openssl 并使用 Java)时,我得到“坏幻数”(openssl)或关于密钥长度的各种错误(在 Java 中)。我花了很多时间试图解密这些字符串,但就是找不到方法。
这是我拥有的所有数据:
加密 + base64 字符串(用于 data1 和 data2)是:
cyE3jDkKc99GVB8TiUlBxQ==
sqcbOnBTl6yy3wwjkl0qhA==
我可以从它们中解码 base64 并获得一些字节数组。当我尝试:
echo cyE3jDkKc99GVB8TiUlBxQ== | openssl aes-256-cbc -a -d (and type "mylittlesecret" as the password)
我得到:“坏幻数”
当我尝试以下 Java 代码时:
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.DECRYPT_MODE, key);
byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
byte[] decValue = c.doFinal(decordedValue);
String decryptedValue = new String(decValue);
我得到“java.security.InvalidKeyException: Invalid AES key length: 14 bytes”
我已经为 Java 代码尝试了许多变体,所以这个特定的可能是一个完全错误..
当我尝试使用红宝石时:
irb(main):069:0> Encryptor.decrypt(Base64.decode64("cyE3jDkKc99GVB8TiUlBxQ=="), ,key=>'mylittlesecret')
=> "data1-value"
我得到了正确的解密值(如您所见)。
我还注意到,当我尝试在 Java 中加密相同的字符串并在 Base64 中编码时,我得到一个更长的字符串(在 base64 之后)。不知道为什么,但它可能相关..
我想我也应该有一个带有加密值的 salt/iv,但我没有看到它存储在任何地方。我尝试加密相同的值两次并得到相同的输出字符串,所以它不是随机的。
有谁知道 attr_encrypted (它使用 ruby 的加密器)如何加密数据以及我应该如何在外部解密它?