モバイルアプリの暗号化 — 基礎、アルゴリズム、動作原理

著者: IT Sectr 公開日: 2026-04-02 読了時間: 8 分

暗号化(encryption)とは、特別な鍵なしでは読み取れない形式にデータを変換するプロセスです。モバイルアプリケーションでは、暗号化によってユーザーの個人データ、支払い情報、ビジネスロジックを傍受や漏洩から保護します。Statista(2024年)によると、モバイルアプリからのデータ漏洩件数は2年間で38%増加し、72%のケースで原因は暗号化の欠如または不適切な使用でした。最新のモバイルプラットフォームは暗号化のための組み込みAPIを提供しており、その使用は必須のセキュリティ基準です。 Statista, 2024

重要なポイント

  • 暗号化 — データを読み取り不可能な形式に変換し、復号鍵がある場合にのみ元に戻せます。
  • 対称暗号化は暗号化と復号に1つの鍵を使用します — 高速ですが、安全な鍵の転送が必要です。
  • 非対称暗号化は鍵のペア(公開鍵と秘密鍵)を使用します — より安全ですが、対称暗号より低速です。
  • AES-256 — 対称暗号化のゴールドスタンダードで、NIST推奨、AndroidとiOSで使用されています。
  • エンドツーエンド暗号化は、サーバーでさえデータにアクセスできないことを保証します — 送信者と受信者だけが読めます。

モバイルアプリケーションにおける暗号化とは?

モバイルアプリケーションの文脈における暗号化とは、デバイスに保存されたデータ(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、ChaCha20RSA、ECDH、ECIES
モバイル開発での使用ローカルデータの暗号化鍵交換、デジタル署名

実際には、モバイルアプリケーションではハイブリッド暗号化が使用されます。非対称アルゴリズム(例:ECDH)でセッション鍵を交換し、以降のすべてのデータを対称アルゴリズム(AESまたはChaCha20)で暗号化します。このアプローチは、対称暗号化の速度と非対称鍵交換のセキュリティを組み合わせたものです。この方式はTLS 1.3、Signal Protocol、Apple iMessageの基盤となっています。

主要な暗号化アルゴリズム

最新のモバイル開発では、それぞれ特定のタスク向けに設計された、いくつかの標準化された暗号化アルゴリズムが使用されています。

  • AES(Advanced Encryption Standard) — 2001年にNISTによって認定された対称ブロック暗号。128、192、または256ビットの鍵を使用します。推奨モードはGCM(Galois/Counter Mode)で、認証付き暗号化を提供します。AES-256はAndroid Keystore、iOS Keychain、およびすべての最新TLSプロトコルで使用されています。
  • ChaCha20-Poly1305 — Daniel Bernsteinによって開発された対称ストリーム暗号。AES-256と同等のセキュリティを提供しますが、ハードウェアAESアクセラレーションがないデバイス(典型的な低価格Androidスマートフォン)ではより高速に動作します。ChaCha20はTLS 1.3でAES-GCMの代替として使用され、Signal Protocolの主要暗号です。
  • RSA(Rivest-Shamir-Adleman) — 鍵の暗号化とデジタル署名に使用される非対称アルゴリズム。推奨最小鍵サイズは2048ビットです。RSAはECDHより低速なため、最新のモバイルアプリケーションでは楕円曲線暗号(ECC)に置き換えられつつあります。
  • ECDH(Elliptic Curve Diffie-Hellman) — 楕円曲線に基づく非対称鍵交換プロトコル。Perfect Forward Secrecyを提供し、TLS 1.3でデフォルトで使用されています。Curve25519(X25519)曲線がモバイルアプリケーションで最も一般的です。

暗号化がユーザーデータを保護する仕組み

暗号化は、デバイスの紛失(ディスクとアプリコンテナの暗号化)、トラフィックの傍受(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を提供します。

kotlin
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とRSAの違いは何ですか?

AESは対称アルゴリズム(1つの鍵)で高速、大量のデータの暗号化に適しています。RSAは非対称(鍵のペア)で低速、データではなく鍵の暗号化と署名に使用されます。モバイルアプリケーションでは、AESがデータを暗号化し、RSAが鍵を保護します。

アプリケーションのすべてのデータを暗号化する必要がありますか?

機密データ(アクセストークン、パスワード、個人情報、支払いデータ、医療記録)を暗号化する必要があります。公開データ(画像、コンテンツ)は暗号化しなくても問題ありませんが、アプリの保護されたコンテナに保存することをお勧めします。

モバイルデバイスでのエンドツーエンド暗号化の仕組みは?

エンドツーエンド暗号化では、データは送信前に送信者のデバイスで暗号化され、受信者のデバイスでのみ復号されます。サーバーは暗号化されたデータのみを認識します。Signal Protocolに実装されているDouble Ratchetプロトコルは、モバイルメッセンジャーで最も一般的なE2Eメカニズムです。

デバイス上のデータとネットワークの両方に同じ暗号化を使用できますか?

技術的には可能ですが、推奨されません。デバイス上のデータには、Keystoreの鍵を使用した対称暗号化(AES-GCM)を使用してください。ネットワークには、別の鍵セットとCertificate Pinningを備えたTLS 1.3を使用してください。分離により、1つの鍵が漏洩しても両方のチャネルが侵害されるのを防ぎます。

まとめ

  • 暗号化はモバイルアプリケーションの必須セキュリティ要素であり、保存時と転送中のデータを保護します。
  • AES-256 GCMは、NISTがすべてのデータタイプに対して推奨する対称暗号化標準です。
  • ハイブリッド暗号化(ECDH + AES)は、対称方式の速度と非対称方式のセキュリティを組み合わせます。
  • Android KeystoreとiOS Keychainは、暗号素材をアプリから分離するハードウェア鍵ストアです。
  • 保存データはEncryptedSharedPreferencesとEncryptedFile(Android)、またはData Protection API(iOS)を介して暗号化されます。
  • 転送中のデータはTLS 1.3、Certificate Pinning、Perfect Forward Secrecyによって保護されます。
  • 推奨: ハードウェアストレージの鍵を使用して、Jetpack Security(Android)またはCryptoKit(iOS)を介してすべての機密データを暗号化してください。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください