リソースの暗号化
PreEmptive Protection™ DashO™ for Android & Java のリソースの暗号化は、アプリケーションやライブラリにパッケージ化されるリソースを暗号化し、コピーや変更をより困難にします。 DashO はビルド時に、リソースを AES(対称暗号化アルゴリズム)で暗号化し、実行中のアプリケーションでそれらを解読するコードを挿入します。 現在、Asset(assets フォルダーに配置されたファイル) と Raw(res/raw フォルダーに配置されたファイル)の両方のリソースの暗号化をサポートしています。
DashO GUI のリソースの暗号化ページで、リソースの暗号化の有効/無効の切り替えや設定が行えます。
メモ:この機能は、Android モードでのみ使用できます。
動作方法
現在、Android 用 DashO Gradle プラグインとの Gradle 統合と Android モードを使用する Android でリソースの暗号化がサポートされています。 DashO Gradle プラグイン(Java 用)を使用した APK の後処理および Gradle 統合はサポートされていません。
Gradle ビルドは、リソースの暗号化が有効になっている場合、選択したリソースを暗号化する encryptResources
タスクを自動的に追加します。
この手順では、DashO が有効になっている各ビルド バリアントのリソースを暗号化します。
各ビルド バリアントで、DashO はそのビルド バリアントの一部であるリソースのみを暗号化します。
元のリソース ファイルは、暗号化プロセスによって変更されません。
DashO がアプリケーションまたはライブラリ コードを保護すると、実行中のアプリケーションによってアクセスされたときにリソースを復号化する追加コードが挿入されます。
この手順の過程では、秘密鍵を含む Wrapper$Secrets
というクラスも追加されます。
秘密鍵が簡単に見つからないようにするためには、R8 を有効にし、このクラスの文字列暗号化を有効にすることが非常に重要です。
Android 用の DashO Gradle プラグインは、リソースの暗号化と実行時の復号化に使用される秘密鍵を生成します。 ログ ファイルまたはプロセス リストで誤った情報開示を避けるために、このキーは環境変数で DashO に渡されます。
API と 動作
現在、InputStream
を介してアクセスされる Asset(assets フォルダーに配置されたファイル) と Raw(res/raw フォルダーに配置されたファイル)のリソースの暗号化をサポートしています。
サポートは、暗号化されたリソースにアクセスする InputStream
を、データを復号化する InputStream
実装でラップすることにより提供されます。
DashO は、次のメソッド呼び出しによって生成されたストリームを復号化するコードを自動的に挿入します。
AssetManager.open(String)
AssetManager.open(String, int)
Resources.openRawResource(int)
Resources.openRawResource(int, TypedValue)
Android Gradle プラグインが DashO への入力として含めるライブラリには、これらのメソッドへの呼び出しが含まれています。
これには、android
または androidx
パッケージの下にクラスを持つ可能性のある互換性ライブラリが含まれますが、android.jar
には何も含まれません。
リソースの読み取りを上記のメソッドに委任するこれらのライブラリの API はすべて、リソース暗号化によってサポートされます。
debug
が有効になっている DashO ビルド出力を確認し、リソースの暗号化によってラップされているメソッド呼び出しを正確に確認します。
これら以外の方法でリソースにアクセスする場合は、暗号化から除外する必要があります。 暗号化されていないリソースが復号化コードでラップされた呼び出しによってアクセスされた場合、データは変更されずに渡されます。
暗号化されたリソースが、復号化コードでラップされていない呼び出しによってアクセスされた場合、undefined が返されます。 独自の整合性チェックを持つデータ形式の場合、アプリケーションは形式の例外をスローする可能性があります。 その他の形式の場合、暗号化されたファイルを解釈すると、未定義の動作が発生する場合があります。
構成
リソースの暗号化は、Asset と Raw の両方のリソースを保護します。 これら 2 種類のリソースの保護は、個別に有効化/無効化することができます。 DashO GUI では、Asset(assets フォルダーに配置されたファイル) と Raw(res/raw フォルダーに配置されたファイル)のリソースの対象選択規則および対象除外規則を構成するためのインターフェイスを提供します。 選択されたクラスに DashO が変更を加えることを防ぐグローバルな処理の対象除外以外に、復号化コードが差し込まれる場所を制御する規定ありません。
リソースを含むライブラリ サブプロジェクトがある場合、libraryAssetDirs
および libraryResourceDirs
プロパティを構成してそれらのリソースを暗号化できます。
ライブラリ(AAR)プロジェクトもサポートされますが、それらのプロジェクトが DashO によるリソースの暗号化を使用するアプリケーションで再び保護されると、問題が発生する可能性があります。
ライブラリ プロジェクトをビルドする場合、復号化クラスは、R8 によって名前変更されるように構成される必要があります。
ライブラリをアプリケーションに含めるときに、DashO による追加処理からそのライブラリを除外するには、excludeFromProtection
機能を使用する必要があります。
アプリケーションは、暗号化されたリソースを AAR から直接アクセスすることはできません。 ライブラリがアプリケーションにリソースを提供する場合、それらのリソースは暗号化の対象から除外するか、ライブラリが提供する API を介してアクセスする必要があります。
リソースの暗号化の有無にかかわらず、アプリケーションまたはライブラリのパフォーマンスをテストしてください。 復号化は、プロセッサに依存するアクティビティです。 リソースの暗号化が有効になっている場合、実行時のパフォーマンスが多少低下することが予想されます。 必要であれば、重要度の低いファイルをリソースの暗号化の対象から除外することで、パフォーマンス コストを軽減できます。
当社のテストでは、暗号化されたリソースを処理しているときには、イメージを読み込むテストアプリケーションの実行が約 30% 遅くなりました。
テストアプリケーションでは、永続的なストレージから複数の .png
形式の画像を読み取り、BitmapFactory.decodeStream()
でデコードしました。
サイズが約 2MB の画像を 18 個読み込むときにかかった時間は次のとおりです。
- 1.1秒:リソースの暗号化なし
- 1.4秒:リソースの暗号化あり
このテストは、Android 10 の Pixel XL で行いました。