モデルの1つで2つのフィールドを(attr_encryptedで)暗号化するRailsアプリケーションがあります。
Webアプリケーションではない私のプロセスの別の部分は、このデータ(プレーンテキスト)を使用していくつかのタスクを実行する必要があります。
DBから保存された値を読み取って復号化しようとしていますが、できません。
私のモデルは次のようになります。
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:無効なAESキーの長さ:14バイト」が表示さ
れます。Javaコードのさまざまなバリエーションを試したので、この特定のバリエーションは完全な間違いである可能性があります。
私がルビーで試してみると:
irb(main):069:0> Encryptor.decrypt(Base64.decode64("cyE3jDkKc99GVB8TiUlBxQ=="), ,key=>'mylittlesecret')
=> "data1-value"
正しい値が復号化されます(ご覧のとおり)。
また、Javaで同じ文字列を暗号化し、Base64でエンコードしようとすると、より長い文字列(base64の後)が得られることにも気づきました。理由はわかりませんが、おそらく関連しています。
暗号化された値を持つsalt/ivも必要だと思いましたが、どこにも保存されていません。同じ値を2回暗号化しようとしましたが、同じ出力文字列を取得したため、ランダムではありません。
attr_encrypted(rubyのEncryptorを使用)がデータを暗号化する方法と、データを外部で復号化する方法を知っている人はいますか?