sql >> データベース >  >> RDS >> SQLite

AndroidでSQLCipherを使用する

    SQLCipherを既存の暗号化されていないデータベースとシームレスに統合して、アプリが正常に機能するようにするにはどうすればよいですか?

    あなたはそうしない。特に、UIを調整してユーザーにパスフレーズを要求し、必要に応じてそのパスフレーズを要求できるようにする必要があります(たとえば、ユーザーがランチャーアイコンを介したアプリ)。

    これについての短いチュートリアルが欲しいです

    まず、それはStackOverflowの仕組みではありません。

    第二に、Android用のSQLCipherの適切なカバレッジには多くの 単一のStackOverflowの回答に収まる以上のもの。たとえば、私の本にはこの主題に関する18ページの章があります。この回答は、Androidに関する質問の大部分よりもすでに長くなっています。この質問を締めくくるのが広すぎると、人々を非難するつもりはありません。

    データベースが暗号化されていないかどうかを確認するにはどうすればよいですか

    ""を使用してAndroidクラス用のSQLCipherを使用して開いてみてください パスフレーズとして。正常に開くと、データベースは暗号化されていません。それが失敗した場合、データベースが破損しているか暗号化されており、適切なパスフレーズがないと、違いがわかりません。

    どうすれば暗号化できますか?

    基本的なアプローチは次のとおりです。

    • 暗号化されていないデータベースを開きます

    • ATTACHを使用する 空のファイルを添付して新しい暗号化データベースとして機能させ、目的のパスフレーズを指定し、添付されたデータベースにencryptedという名前を付けるSQLステートメント データベースセッション内

    • SELECT sqlcipher_export('encrypted')を実行します 開いている(暗号化されていない)データベースで、暗号化されていないデータベースから暗号化されたデータベースにデータをエクスポートします(後の手順で処理されるデータベーススキーマバージョンを除く)

    • getVersion()を呼び出します 開いている(暗号化されていない)データベースで、その値を少し保持します

    • 暗号化されていないデータベースを閉じます

    • パスフレーズを使用して、暗号化されたデータベースを開きます

    • setVersion()を呼び出します 暗号化されたデータベースで、getVersion()からキャッシュした値を提供します 暗号化されていないデータベースの

    • 暗号化されたデータベースを閉じます

    • 必要に応じて、暗号化されていないデータベースを削除し、暗号化されたデータベースの名前を、現在削除されている暗号化されていないデータベースの名前に変更して、変換が適切に行われたように見せます。

    このユーティリティメソッドは、上記のアプローチを実装します。

      public static void encrypt(Context ctxt, String dbName,
                                 String passphrase) throws IOException {
        File originalFile=ctxt.getDatabasePath(dbName);
    
        if (originalFile.exists()) {
          File newFile=
              File.createTempFile("sqlcipherutils", "tmp",
                                  ctxt.getCacheDir());
          SQLiteDatabase db=
              SQLiteDatabase.openDatabase(originalFile.getAbsolutePath(),
                                          "", null,
                                          SQLiteDatabase.OPEN_READWRITE);
    
          db.rawExecSQL(String.format("ATTACH DATABASE '%s' AS encrypted KEY '%s';",
                                      newFile.getAbsolutePath(), passphrase));
          db.rawExecSQL("SELECT sqlcipher_export('encrypted')");
          db.rawExecSQL("DETACH DATABASE encrypted;");
    
          int version=db.getVersion();
    
          db.close();
    
          db=
              SQLiteDatabase.openDatabase(newFile.getAbsolutePath(),
                                          passphrase, null,
                                          SQLiteDatabase.OPEN_READWRITE);
          db.setVersion(version);
          db.close();
    
          originalFile.delete();
          newFile.renameTo(originalFile);
        }
      }
    

    完全に開示するために、私はしばらくこれを試していません。そのため、いくつかの調整が必要になる場合があります。

    これは1回だけ行う必要がありますか?

    ここでは誰もあなたのアプリについてあまり知らないので、あなただけがそれに答えることができます。

    既存の暗号化されていないデータベースを暗号化するとき、SQLCipherは新しいデータベースを作成しますか?

    はい。

    はいの場合、この新しいものをどのように管理する必要がありますか?

    ここでは誰もあなたのアプリについてあまり知らないので、あなただけがそれに答えることができます。

    そして、暗号化されていない私の古いデータベースはどうですか?それはまだそこにとどまりますか?

    はい。ただし、使い終わったら削除してもかまいません。




    1. OracleForms10gでのカスタムログイン画面の作成

    2. PostgreSQLでのDegrees()関数のしくみ

    3. master..spt_valuesを使用して列を分割する理由(および方法)

    4. MySQLで日、月、年を返す