Table of Contents
iOSでデータの暗号化を理解する
iOSは、機密データを保護するために複数のレイヤーで暗号化を実行します。 ハードウェアレベルで、Secure Enclaveは暗号化キーと暗号化操作を管理します。 オペレーティングシステムレベルでは、 ]データ保護は、デバイスのパスコードに暗号化キーを結びつけるファイルレベルの暗号化を使用します。 アプリ固有のデータについては、開発者は、暗号化キット、CommonCrypto、およびセキュリティフレームワークを使用して、個々のレコード、ファイル、またはネットワークのペイロードを暗号化することができます。
暗号化は、アルゴリズムとキーを使用して、平文を暗号テキストに変換します。正しいキーなしで、データは未読のままです。Appleの]]iOSデータ保護APIは、自動的に残りのファイルを暗号化しますが、開発者は、コアデータ、UserDefaults、またはカスタムキャッシュなど、保護されたファイルシステム外に保存されたデータに対する明示的な暗号化が必要です。
重要なテイクアウト: [] は、iOS の暗号化がデフォルトで有効になっている場合でも、デバイス[に居住するたびに、機密データを暗号化します。これにより、同じサンドボックスで実行されている物理的デバイスアクセス、フォレンジック抽出、または悪意のあるアプリに対する保護が保証されます。
iOS 暗号化フレームワークと API の
Appleは複数の暗号ライブラリを提供しています。 適切なものを選ぶことは、デプロイメントターゲットと必要な制御レベルによって異なります。
CryptoKit - モダンスイフトAPI
iOS 13で導入されたCryptoKitは、対称および非対称暗号化、ハッシュ、およびキー契約のSwiftネイティブインターフェースを提供しています。認証された暗号化のために]AES-GCMを使用します。これは、機密性と完全性の両方を保護するものです。以下は、典型的な暗号化と復号パターンです。
import CryptoKit
func encryptSensitiveData(_ plaintext: String, using key: SymmetricKey) throws -> Data {
let inputData = Data(plaintext.utf8)
let sealedBox = try AES.GCM.seal(inputData, using: key)
return sealedBox.combined
}
func decryptSensitiveData(_ encryptedData: Data, using key: SymmetricKey) throws -> String {
let sealedBox = try AES.GCM.SealedBox(combined: encryptedData)
let decryptedData = try AES.GCM.open(sealedBox, using: key)
return String(decoding: decryptedData, as: UTF8.self)
}
常にキーホルダーのを、UserDefaultsやプレーンファイルではなく保存します。 ]]を]で使用して、デバイスとユーザーの存在にキーを結びます。
CommonCrypto - C ベースの柔軟性
古いiOSバージョンをサポートするアプリや、カスタムブロック暗号モード(HMAC で CBC など)を必要とするアプリでは、CommonCrypto は低レベルの C 機能を提供します。 AES、DES、3DES、各種ハッシュアルゴリズムをサポートしています。 AES-CBC 暗号化の例:
#include <CommonCrypto/CommonCryptor.h>
- (NSData *)aes256Encrypt:(NSData *)plaintext withKey:(NSData *)key iv:(NSData *)iv {
size_t outLength;
NSMutableData *ciphertext = [NSMutableData dataWithLength:plaintext.length + kCCBlockSizeAES128];
CCCryptorStatus status = CCCrypt(kCCEncrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding,
key.bytes, key.length, iv.bytes,
plaintext.bytes, plaintext.length,
ciphertext.mutableBytes, ciphertext.length,
&outLength);
if (status == kCCSuccess) {
ciphertext.length = outLength;
return ciphertext;
}
return nil;
}
CommonCrypto は、初期化ベクトル(IV)と認証タグの手動管理が必要です。認証された暗号化のために、AES-CBC を別の HMAC と組み合わせたり、AES-GCM を CryptoKit 経由で切り替えたりすることができます。
セキュリティフレームワークとキーホルダー
セキュリティフレームワークはキー、証明書、パスワードの安全なストレージにキーチェーンサービスを提供します。 [を使用して、キーを厳格なアクセス制御(例えば、バイオメトリックを介してユーザーの存在が必要です)に保存します。 セキュア・アンクレーブは、ECC操作用の秘密鍵を生成し、保存することができます。キーがハードウェアを離れることは決してありません。
異なるデータ型のための暗号化の実装
すべてのデータが同じ暗号化戦略を必要としません。データがどの方法やどこで使用されているかを判断します。
ユーザーのデフォルトとコアデータを暗号化する
UserDefaults と Core Data ストアは暗号化されていない限り、SQLite ファイルがプレーンです。Core Data では、保存先の []]NSFileProtectionType 属性を有効にします。細かい粒度のために、保存する前に、個々の属性またはオブジェクト全体を暗号化します。
- コアデータ[transformable]]の属性を、読み書き時に暗号化/復号化するカスタム値トランスで使用します。
- 管理されたオブジェクト全体を JSON としてシリアライズし、暗号化し、バイナリ属性に ciphertext を保存します。
- UserDefaults では、生の機密文字列を保存しません。各値を暗号化し、暗号化されたデータを保存しません。
UserDefault で暗号化されたデータを格納する例:
let key = SymmetricKey(size: .bits256)
let data = "user_ssn".data(using: .utf8)!
let sealedBox = try AES.GCM.seal(data, using: key)
UserDefaults.standard.set(sealedBox.combined, forKey: "encrypted_ssn")
UserDefaults.standard.synchronize()
ファイル保護でファイルを暗号化する
iOS はファイルレベルの保護クラス: , , [] を提供しています。 ファイルの作成や移動時にこれらの属性を設定します。
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("data.bin")
try FileManager.default.setAttributes([.protectionKey: FileProtectionType.complete], ofItemAtPath: fileURL.path)
デバイスがロック解除された場合でも、データが保護されなければならない場合は、明示的な暗号化でファイル保護を結合します。例えば、キーチェーンに保存されたキーでファイルを暗号化し、認証後にのみアクセス可能です。
ネットワークデータを暗号化(トランスポート層セキュリティ)
App Transport Security(ATS)は、デフォルトでHTTPSを強制します。カスタムTCP接続の場合は、TLSでを使うか、または、人中攻撃を防ぐためにSSLピン留めを実行します。TLSが侵害されている場合でも、追加の防御力が強化された場合には、アプリケーションレイヤーでペイロードを暗号化します。
主要経営ベストプラクティス
暗号化は、キー管理としてのみ強力です。セキュリティを維持するには、以下のガイドラインに従ってください。
- [ 暗号化されたランダム番号ジェネレータ]を使用してキーを生成します。 ]または]を使用してください。
- ]キーチェーンにのみキーを保存します。適切なアクセシビリティ属性:[]]]は、バックアップを防ぎ、デバイスへのキーを結びます。
- ] 鍵を取得する前に、生体認証またはパスコード認証[を使用します。 ]] は、ユーザ認証を強制します。
- [スケジュールまたはセキュリティイベント[]の後にキーを回転させる - データを新しいキーで再暗号化し、古いキーを安全に削除します。
- ソースコードや設定ファイルで、ハードコードキーを行わない。必要に応じて、ユーザパスワードから派手なキーが遅いキーの派手関数(PBKDF2またはscrypt)を使っている。
- ]非対称キー生成のためのセキュア・アンクルーブをレバレッジ - プライベート・キーは、エクステンションを防止するエクスポートできません。
機密性の高いデータを扱うアプリでは、ネットワークサービスで「」のハードウェアセキュリティモジュール(HSM)」を利用していますが、レイテンシーを導入し、インターネット接続が必要です。
主回転と再暗号化
キーが妥協されるか、定義された期間(例えば、90日ごとに)後にキーを回転させるとき。これにより、古いキーですべてのデータを復号化し、新しいキーを生成し、再暗号化を解除します。大きなデータセットの場合、バージョン管理されたキースキームを実行します。
- 各暗号化されたレコードと一緒にキー識別子(UIDなど)を保存します。
- キーチェーン(残りで暗号化)で、識別子のマッピングを実際のキーに保ちます。
- 回転中は、すべてのデータをすぐに再暗号化することなく、新しいエントリを追加します。アクセス時に怠惰を再暗号化します。
コンプライアンス・規制に関する検討
機密データの多くの規制は、暗号化を義務付けています。 GDPR]] は、適切な技術的対策を必要とし、暗号化は、認識された擬似化技術です。 [ HIPAA[] 残りの部分と輸送におけるePHIの操作性暗号化。 ] PCI DSSは、カード所有者データの暗号化が必要です。 iOSでは、Appleのデータ保護規則とほとんどの暗号化が、ほとんどの暗号化の手順で、ほとんどの暗号化を暗号化します。 ほとんどの手順は、ほとんどの暗号化、ほとんどの手順で、ほとんどの手順を実行します。
最新推奨事項については、Appleの公式ドキュメントを参照してください。 の クリプトキット開発者ガイド, []の の Keychain サービス], ]]の ユーザプライバシー保護 []]]. 業界ガイダンスについては、] [OWASP Mobile Security Testing Guide[]] および [[FLT: [[FLT:]]]]]]]] [[[[FLT: [[FLT: [[FLT: [[FLT:]]]]]]]]]]]]]]]]]]] [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
試験と検証
暗号化を実行した後、正しく動作することを確認します。
- 既知のプレーンテキストを暗号化して復号化し、出力をアサートするユニットテストを書きます。
- エッジのケースをテスト: 空のデータ、非常に大きなペイロード、および破損した暗号文。
- ジェイルブレイクデバイスを使用してセキュリティテストを実行して、攻撃シナリオをシミュレートします。認証なしでキーがアクセスできない状態であることを検証します。
- 静的解析ツールを使用して、ハードコードされたキーや弱いアルゴリズムがないかを確認します。
- ログをレビューする - プレーンテキストの機密データや暗号化キーを記録しません。
コンテンツ
機密iOSデータのストレージのためのデータ暗号化を実装することは、多層プロセスです。 iOSファイル保護、アプリケーションレイヤー暗号化とCryptoまたはCommonCryptoを組み合わせることにより、KeychainとSecure Enclaveによる厳格なキー管理により、開発者はデータ露出のリスクを大幅に削減することができます。 GDPRやHIPAAなどの規制に準拠するには、文書化された監査可能な暗号化慣行が必要です。 定期的なテストと鍵の回転により、長期にわたるセキュリティが確保されます。 堅牢な暗号化アーキテクチャに投資することは、ユーザーデータを保護するだけでなく、信頼性と規制要件を満たしています。