暗号化(encryption)とは、特別な鍵なしでは読み取れない形式にデータを変換するプロセスです。モバイルアプリケーションでは、暗号化によってユーザーの個人データ、支払い情報、ビジネスロジックを傍受や漏洩から保護します。Statista(2024年)によると、モバイルアプリからのデータ漏洩件数は2年間で38%増加し、72%のケースで原因は暗号化の欠如または不適切な使用でした。最新のモバイルプラットフォームは暗号化のための組み込みAPIを提供しており、その使用は必須のセキュリティ基準です。 Statista, 2024
重要なポイント
モバイルアプリケーションの文脈における暗号化とは、デバイスに保存されたデータ(data at rest)とネットワークで送信されるデータ(data in transit)を保護するための暗号アルゴリズムの適用です。デバイスレベルでは、ローカルストレージ(ファイル、データベース、SharedPreferences、キャッシュ)が暗号化されます。ネットワークレベルでは、アプリとサーバー間のトラフィックがTLS/HTTPSプロトコルを介して暗号化されます。最終的な目標は、デバイスへの物理的アクセスやトラフィックの傍受があったとしても、攻撃者が暗号鍵なしでは保護されたデータを読み取れないようにすることです。
モバイルデバイスはデータ損失に対して特に脆弱です。スマートフォンは簡単に紛失、盗難、またはマルウェアに感染する可能性があります。Ponemon Institute(2023年)によると、データ漏洩の被害に遭った企業の42%が、その原因をモバイルデバイスに起因するとしています。暗号化がない場合、攻撃者はUSBを介してデバイスに接続し、SQLiteデータベースを抽出して保存されたすべてのデータを読み取ることができます。暗号化はこの問題を解決します。データベースが抽出されても、その内容は暗号化されたままです。さらに、米国とEUには個人データの暗号化を義務付け、違反に対して年間売上高の最大4%の罰金を科す法律(GDPR、CCPA)があります。暗号化の使用は、ユーザーデータを扱うモバイルアプリケーションにとって技術的な必要性であるだけでなく、法的な必要性でもあります。
すべての暗号化アルゴリズムは、対称型(暗号化と復号に1つの鍵を使用)と非対称型(公開鍵と秘密鍵のペアを使用)の2つの主要なタイプに分類されます。タイプの選択は使用シナリオによって異なります。ローカルデータの暗号化には、その速度から対称アルゴリズムがよく使用され、鍵交換と認証には非対称アルゴリズムが使用されます。
| 特性 | 対称暗号 | 非対称暗号 |
|---|---|---|
| 鍵の数 | 1(秘密鍵) | 2(公開鍵+秘密鍵) |
| 速度 | 高速(1~10 GB/s) | 低速(1~10 MB/s) |
| 鍵の配布 | 問題あり — 鍵を転送する必要がある | 簡単 — 公開鍵を公開する |
| 例 | AES、ChaCha20 | RSA、ECDH、ECIES |
| モバイル開発での使用 | ローカルデータの暗号化 | 鍵交換、デジタル署名 |
実際には、モバイルアプリケーションではハイブリッド暗号化が使用されます。非対称アルゴリズム(例:ECDH)でセッション鍵を交換し、以降のすべてのデータを対称アルゴリズム(AESまたはChaCha20)で暗号化します。このアプローチは、対称暗号化の速度と非対称鍵交換のセキュリティを組み合わせたものです。この方式はTLS 1.3、Signal Protocol、Apple iMessageの基盤となっています。
最新のモバイル開発では、それぞれ特定のタスク向けに設計された、いくつかの標準化された暗号化アルゴリズムが使用されています。
暗号化は、デバイスの紛失(ディスクとアプリコンテナの暗号化)、トラフィックの傍受(TLS/HTTPSネットワークプロトコル)、サーバーからの漏洩(エンドツーエンド暗号化)の3つの主要なシナリオでデータを保護します。各シナリオには独自のアプローチとツールが必要です。
保存データ — デバイス上のデータ — はAndroid KeystoreとiOS Keychainを介して暗号化されます。Android 7.0以降ではファイルベース暗号化(File-Based Encryption)が使用され、アプリはAndroidX SecurityライブラリのEncryptedSharedPreferencesとEncryptedFileを介してデータを追加で暗号化できます。iOSでは、すべてのアプリがデフォルトでData Protection APIと連携し、デバイスのパスコードに紐づく鍵でファイルシステムレベルでファイルを暗号化します。転送中のデータには、必須のCertificate Pinningを伴うTLS 1.2/1.3が使用されます。
エンドツーエンド暗号化(E2E)は、メッセージが送信者のデバイスで暗号化され、受信者のデバイスでのみ復号される、最高レベルのデータ保護です。保存と転送を行うサーバーはコンテンツにアクセスできず、暗号化されたブロブのみを処理します。モバイルアプリケーションで最もよく知られているE2E実装はSignal Protocolで、初期鍵交換にX3DH(Extended Triple Diffie-Hellman)と組み合わせてDouble Ratchet Algorithmを使用します。Signal ProtocolはPerfect Forward Secrecyと将来秘匿性を提供します。1つの鍵が侵害されても、以前や以降のメッセージは明らかになりません。カーネギーメロン大学(2023年)の研究によると、メッセージングアプリのE2E暗号化は、TLSのみの暗号化と比較して、通信漏洩のリスクを99.7%削減します。GDPRおよびHIPAAの要件に従い、Health & FitnessおよびFinanceカテゴリのアプリケーションではE2Eが必須です。独自のプロジェクトでE2Eを実装するには、Signal Protocolライブラリ(Java/Swift)またはOlm(Matrixプロトコル)ベースのライブラリを使用することをお勧めします。E2Eソリューションを選択する際は、プラットフォームの互換性を評価してください。Signal Protocolは非同期送信とクライアント側の鍵保存を必要とし、マルチデバイスシナリオを複雑にします — そのような場合、Matrix Protocolとそのルームモデルがより適切な選択となる可能性があります。
AndroidでJetpack Security(AndroidX Security)を使用したデータの暗号化と復号の例を見てみましょう。このライブラリは、ファイル暗号化用のEncryptedFileと設定用のEncryptedSharedPreferencesを提供します。
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val encryptedFile = EncryptedFile.Builder(
context,
File(context.filesDir, "secret.dat"),
masterKey,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()
encryptedFile.openFileOutput(applicationContext).use { outputStream ->
outputStream.write("Sensitive user data".toByteArray(Charsets.UTF_8))
}
MasterKeyはAES256-GCMを使用して作成されます — 最も安全な対称暗号化モードです。鍵はメインプロセスから分離されたAndroid Keystoreに保存されます。アプリが侵害されても、攻撃者は鍵を抽出できません。EncryptedFileは、HKDFを使用した鍵導出と4KBのページサイズを持つAES-256-GCMスキームを使用し、速度とセキュリティのバランスが取れています。データを読み取るには、同じパラメータでopenFileInputを使用します。ライブラリが読み取り時に自動的にデータを復号します。
iOSでは、AES.GCMまたはChaChaPolyを使用してCryptoKit(Swift)を介して同様の機能が提供されます。鍵はKeychain Servicesを介してSecure Enclaveに保存されます。原理は同じです。鍵は安全なハードウェアストレージを離れることはなく、データはディスクに書き込まれる前に暗号化されます。このアーキテクチャは、機密データを扱うアプリケーション向けのOWASP MASVS(Mobile Application Security Verification Standard)レベルL2の推奨事項に準拠しています。実際のプロジェクトでは、トークン用のEncryptedSharedPreferencesとユーザーデータ用のEncryptedFileの組み合わせで、ローカル暗号化の100%のシナリオをカバーできます。さらに、サーバーから受信した鍵(例:ECDHセッション鍵)を扱うには、purpose = KeyProperties.PURPOSE_ENCRYPTパラメータを持つAndroid KeyStoreが使用され、鍵が許可された暗号操作にのみ使用され、ハードウェアストレージからRAMに平文でエクスポートされることがないことを保証します。
よくある質問
GCMモードのAES-256で、鍵をハードウェアストレージ(Android Keystore / iOS Keychain)に保存するのがゴールドスタンダードです。ネットワークトラフィックにはCurve25519楕円曲線を使用したTLS 1.3です。ChaCha20-Poly1305は、ハードウェアAESがないデバイスでの代替として使用されます。
AESは対称アルゴリズム(1つの鍵)で高速、大量のデータの暗号化に適しています。RSAは非対称(鍵のペア)で低速、データではなく鍵の暗号化と署名に使用されます。モバイルアプリケーションでは、AESがデータを暗号化し、RSAが鍵を保護します。
機密データ(アクセストークン、パスワード、個人情報、支払いデータ、医療記録)を暗号化する必要があります。公開データ(画像、コンテンツ)は暗号化しなくても問題ありませんが、アプリの保護されたコンテナに保存することをお勧めします。
エンドツーエンド暗号化では、データは送信前に送信者のデバイスで暗号化され、受信者のデバイスでのみ復号されます。サーバーは暗号化されたデータのみを認識します。Signal Protocolに実装されているDouble Ratchetプロトコルは、モバイルメッセンジャーで最も一般的なE2Eメカニズムです。
技術的には可能ですが、推奨されません。デバイス上のデータには、Keystoreの鍵を使用した対称暗号化(AES-GCM)を使用してください。ネットワークには、別の鍵セットとCertificate Pinningを備えたTLS 1.3を使用してください。分離により、1つの鍵が漏洩しても両方のチャネルが侵害されるのを防ぎます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。