8

私はAndroid 用の SQLCipher を使用しており、ユーザー提供のパスワードが有効かどうかをテストする正しい方法を決定しようとしています。

SQLiteOpenHelper.getReadableDatabase(password)私の最初の傾向は、の SQLCipher 実装を使用して、指定されたパスワードでデータベースを開こうとすることでしSQLiteExceptionた。

これは機能しますが、問題は、Android API が基礎となる C 呼び出しを実際にラップするため、多くの作業を行うことです。具体的には、Android API を使用してデータベースを開くと、データベースが開かれ、ネイティブが実行されます。 C レベルのsqlite3_key方法 (提供されたパスワードを使用) は、提供されたパスワードが正しいかどうかに関係なく、データベースにロケールを設定しようとします。

この時点で、Android ライブラリはロケールを設定しようとし、基になるデータベースは "encrypted or not a database" をスローしますSQLiteException。これはキャッチされて再スローされます。しかし、そうなる前に、無関係なエラーがログに書き込まれます。これは、基本的に、ロケールを設定できず、データベースが閉じられていることを示しています (スタック トレースが含まれています)。これは Android ライブラリによって具体的に記述されているため、これを抑制することはできず、ログに醜いエラーが残ります。これは、実際には元の問題とは関係ありません。これは、単純に間違ったパスワードを渡したというものでした。

Android ライブラリは C レベルの呼び出しを公開していないため、SQLCipher API のドキュメントで説明されているキーのテストに関するメソッドをそのまま使用することはできません。データベースを直接開くためのアクセス権がないためです。

私は を使用することに傾倒してSQLiteDatabaseHookいますが、私が知る限りSQLiteOpenHelper、フックをセットアップする方法を提供していないように見える を使用することはできません。

入力パスフレーズが SQLCipher Android API を介して SQLCipher データベースを適切に復号化するかどうかをテストするより良い方法を他の誰かが知っていますか? メソッドを呼び出して、例外がスローされているかどうかを確認することを完全に期待しています-操作がデータベースで無関係な処理(ロケールの設定など)を試行して実行し、完全に抑制できないエラーをログに書き込むことは望ましくありません。

4

3 に答える 3

2

私はそれをテストするより良い方法を持っていません。追加のコードを提供したいだけなので、他の人がこれを調べると、役に立つコード スニペットが見つかるかもしれません。少なくともこの質問を見つけたとき、チェックアップの方法をいくつかのコードで見たいと思っていました:)

私がAndroidで行う方法は次のとおりです。

    // Simply get an instance of SQLiteOpenHelper.
    dbHelperObj = myDatabase.getInstance(this, str_username, version);

    // Now we try to open the database with the password from the user.
    try {
        dbObj = dbHelperObj.getReadableDatabase(str_password);

    // The only possible error now must be a wrong password.
    } catch (Exception e) {
        dbHelperObj.close();

        // Do stuff to tell the user he provided a wrong password.
    }
于 2014-08-22T11:40:41.703 に答える