0

過去 1 年間、アプリで次のコードを使用しており、このコードを使用して 200k の記録があります。

options = { :algorithm => 'aes-256-cbc', :value => "changethis", :key => "secretkey" }
cipher = OpenSSL::Cipher::Cipher.new(options[:algorithm])
cipher.send(:encrypt)    
cipher.pkcs5_keyivgen(options[:key])
result = cipher.update(options[:value])
result << cipher.final
# => "x\xED\x14s\xFD\x0E\x97\xC5\x996[M\x1E\x94\xDEI"

正しく行うために、 (業務上)pkcs5_keyivgenパーツをリファクタリングする必要があります。たとえば、

options = { :algorithm => 'aes-256-cbc', :value => "changethis", :key => "secretkey" }
cipher = OpenSSL::Cipher::Cipher.new(options[:algorithm])
cipher.send(:encrypt)
cipher.key = '' # ??? 1) How does pkcs5_keyivgen in above code generate key, or does it just use my options[:key]
cipher.iv = '' # ??? 2) How does pkcs5_keyivgen in above code generate iv
result = cipher.update(options[:value])
result << cipher.final

pkcs5_keyivgenと をどのように設定するかを理解する必要がkeyありivます。ここでアイデア?ruby-1.9.3-p286 と encryptor-1.1.3 を使用しています。

この質問この質問を見ましたが、問題を解決するのに役立ちませんでした。

4

1 に答える 1

4

この問題を解決しようとしていましたが、簡単な解決策がないか、解決策が見えないだけだと思います)。Pkcs5_keyivgen()非推奨であり、AES 256 の非標準パス キー派生を実装します。

このドキュメントとこのソースコードから

Pkcs5_keyivgen (pass, SALT = nil, num = 2048, digest = "MD5") -> nil 

ソルトとパスからキーと IV を生成します。あなたの場合、塩はありません。生成方法はv1.5 PKCS #5(deprecated)で定義されています

「パスワードベースのキー派生関数」を探しています。PBKDF1

Pkcs5_keyivgen()EVP_BytesToKey()Openssl から関数を呼び出し、非標準的な方法EVP_BytesToKey()でより大きなキー サイズのキー バイトを生成します。

したがって、MD5 はサイズEVP_MAX_MD_SIZE (16 + 20)// 16 のハッシュを MD5 に対して生成します

ただし、 AESkey(32) + IV(16) sizes > EVP_MAX_MD_SIZEであるため、AES 256 ではランダムなキーと IV を生成するために複数のハッシュが必要になります。ここにCのアルゴリズムのソースコードがあります

そして、ここに素晴らしい疑似コードの説明がありますEVP_BytesToKey()

本当に PBKDF1 を再実装したい場合は、ここもPBKDF1 の RTC2898 標準です が、暗号を自分で実装するのは良い考えではないと思います

于 2013-07-27T03:26:48.650 に答える