Xoomタブレットで簡単なAndroidアプリを作成しました。これは、SQLCipherデータベースに文字列のメモを保存するだけです。
ユーザーは、SQLCipherlibによってデータベースに使用されるパスフレーズを入力するように求められます。これは今のところうまく機能し、非常にスムーズです。
今、私は認証の目的で小さなPBKDF2アルゴリズムも実装しました(実際、将来的に他のファイルを暗号化したいのですが、データベースに保存することはできません)。しかし今のところ、私は自分のpbkdf2アルゴリズムが正しいかどうかをチェックするようになりました。私はjavax.cryptoとjava.securityライブラリのみを使用しました。
次のようなコードスニペット:
int derivedKeyLength = 128;
int iterations = 500;
KeySpec spec = new PBEKeySpec(passphrase.toCharArray(), salt, iterations, derivedKeyLength);
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] derivedKey = f.generateSecret(spec).getEncoded();
ソルトは、SecureRandomで生成された16バイトの乱数です。
そこで、キーとソルトをハードコーディングし、認証のために派生キーを比較しました(テストケースのみ!)
私の問題は、Xoomでは、反復が500のみに設定されているにもかかわらず、派生関数が完了するまで約5秒続くことです。
AFAIK SQLCipherは、デフォルトで4000の反復回数を使用しており、キーが間違っているか正しい場合、即座に応答します。(反復を4000に設定した場合、少なくとも15秒かかります)
問題は、それを非効率的に実装したのか、それともSQLCipherのパフォーマンスが非常に優れているため(ネイティブNDK関数など)なのかということです。
よろしくお願いしますps:申し訳ありませんが、私の英語はまだそれほど素晴らしいものではありません!
編集:
申し訳ありませんが、私は十分に明確ではありませんでした:-)
PBKDF2は遅い(具体的には、ブルートフォース攻撃を遅くするための反復量)と想定されていることを私は知っています。それがまさに私が求めている理由です!反復回数を5000と言うように設定したかった(これは受け入れられず、15秒以上)
私が言ったように、SQLCipherは特定のパスワードからキーを導出するためにPBKDF2(反復= 4k、私は500を使用しています)も使用しているので、私はただ疑問に思っています。結局のところ、AESを使用した暗号化について話しているのではなく、キーを取得する際の違いについてのみ話しているのです。
もちろん、SQLCipherが自作のキー派生関数よりもはるかに高速であることは正当なようですが、SCLCipherのPBKDF2は実際に瞬時に動作するため、これほど大きな違いになるとは思いませんでした。
ご挨拶!