Agent Skills by ALSEL
Anthropic Claudeソフトウェア開発⭐ リポ 0品質スコア 50/100

swift-security

iOS/macOSのKeychain Services(SecItemクエリ、kSecClass、OSStatusエラー)、生体認証(LAContext、Face ID、Touch ID)、CryptoKit(AES-GCM、ChaChaPoly、ECDSA、ECDH、HPKE、ML-KEM)、Secure Enclave、安全なクレデンシャル保存(OAuthトークン、APIキー)、証明書ピンニング(SecTrust、SPKI)、アプリ・拡張機能間のKeychain共有、UserDefaultsやplistからの機密情報移行、またはAppleプラットフォームにおけるOWASP MASVS/MASTGモバイルコンプライアンス対応を行う際に使用します。

description の原文を見る

Use when working with iOS/macOS Keychain Services (SecItem queries, kSecClass, OSStatus errors), biometric authentication (LAContext, Face ID, Touch ID), CryptoKit (AES-GCM, ChaChaPoly, ECDSA, ECDH, HPKE, ML-KEM), Secure Enclave, secure credential storage (OAuth tokens, API keys), certificate pinning (SecTrust, SPKI), keychain sharing across apps/extensions, migrating secrets from UserDefaults or plists, or OWASP MASVS/MASTG mobile compliance on Apple platforms.

SKILL.md 本文

Keychain & Security エキスパート スキル

Philosophy: 無党派的で、正確性を重視。このスキルは事実、検証済みパターン、Apple 公式ドキュメントのベストプラクティスを提供します。アーキテクチャ要件ではなく、iOS 13+ を最小デプロイメント対象として、iOS 17+ への最新推奨事項と iOS 26(ポスト量子化以降)への先読みガイダンスが含まれます。すべてのコードパターンは Apple ドキュメント、DTS エンジニアの投稿(Quinn "The Eskimo!")、WWDC セッション、OWASP MASTG に基づいており、記憶に頼ることはありません。

このスキルが対象とするもの: Apple プラットフォーム上での keychain 操作、biometric 認証、CryptoKit 暗号化、credential ライフサイクル管理、証明書トラスト、コンプライアンスマッピングのレビュー、改善、実装のリファレンス。

このスキルが対象としないもの: ネットワーキングガイド、サーバーサイドセキュリティリファレンス、App Transport Security マニュアル。TLS 設定、サーバー証明書管理、バックエンド認証アーキテクチャはスコープ外です。クライアント側の keychain や trust API に直接関わる場合を除きます。


目次

Decision Tree

ユーザーの意図を把握し、該当するブランチに従います。曖昧な場合は確認してください。

                        ┌─────────────────────┐
                        │  What is the task?   │
                        └─────────┬───────────┘
               ┌──────────────────┼──────────────────┐
               ▼                  ▼                  ▼
          ┌─────────┐      ┌───────────┐      ┌────────────┐
          │ REVIEW  │      │  IMPROVE  │      │ IMPLEMENT  │
          │         │      │           │      │            │
          │ Audit   │      │ Migrate / │      │ Build from │
          │ existing│      │ modernize │      │ scratch    │
          │ code    │      │ existing  │      │            │
          └────┬────┘      └─────┬─────┘      └─────┬──────┘
               │                 │                   │
               ▼                 ▼                   ▼
        Run Top-Level      Identify gap         Identify which
        Review Checklist   (legacy store?        domain(s) apply,
        (§ below) against  wrong API?            load reference
        the code.          missing auth?)        file(s), follow
        Flag each item     Load migration +      ✅ patterns.
        as ✅ / ❌ /       domain-specific       Implement with
        ⚠️ N/A.           reference files.      add-or-update,
        For each ❌,       Follow ✅ patterns,   proper error
        cite the           verify with domain    handling, and
        reference file     checklist.            correct access
        and specific                             control from
        section.                                 the start.

Branch 1 — REVIEW(既存コードの監査)

目的: Keychain/セキュリティコードの正確性、セキュリティ、コンプライアンスを体系的に評価します。

手順:

  1. Top-Level Review Checklist(以下)を実行 してレビュー対象コードに対して各項目を ✅ / ❌ / ⚠️ N/A でスコアリングします。
  2. **各 ❌ 失敗について、**引用されたリファレンスファイルをロードして、特定のアンチパターンまたは正しいパターンを探します。
  3. アンチパターンをクロスチェックcommon-anti-patterns.md の 10 項目すべてに対してコードをスキャンします。特に注意してください:UserDefaults でのシークレット(#1)、ハードコードされたキー(#2)、LAContext.evaluatePolicy() のみの認証ゲート(#3)、無視された OSStatus(#4)。
  4. コンプライアンス確認 — プロジェクトが OWASP MASVS またはエンタープライズ監査対応が必要な場合、compliance-owasp-mapping.md カテゴリ M1、M3、M9、M10 に調査結果をマッピングします。
  5. レポート形式: 各検出事項について:何が問題か → どのリファレンスファイルがカバーするか → ✅ 正しいパターン → 重要度(CRITICAL / HIGH / MEDIUM)を記載します。

レビューの主要リファレンスファイル:

  • 最初に:common-anti-patterns.md(バックボーン — 最も危険な 10 パターンをカバー)
  • 次にコードが何をするかに基づくドメイン固有ファイル
  • 最後に:compliance-owasp-mapping.md(コンプライアンスが関連する場合)

Branch 2 — IMPROVE(マイグレーション/モダナイゼーション)

目的: 不安全な保存、非推奨 API、または従来のパターンから現在のベストプラクティスへコードをアップグレードします。

手順:

  1. マイグレーションの種類を特定します:

    • 不安全な保存 → Keychain:migration-legacy-stores.md + credential-storage-patterns.md をロード
    • 従来の Security framework → CryptoKit:cryptokit-symmetric.md または cryptokit-public-key.md + migration-legacy-stores.md をロード
    • RSA → 楕円曲線:cryptokit-public-key.md(RSA マイグレーションセクション)をロード
    • GenericPassword → InternetPassword(AutoFill):keychain-item-classes.md(マイグレーションセクション)をロード
    • LAContext のみ → Keychain バインド biometrics:biometric-authentication.md をロード
    • ファイルベース keychain → データ保護 keychain(macOS):keychain-fundamentals.md(TN3137 セクション)をロード
    • シングルアプリ → 共有 keychain(拡張機能):keychain-sharing.md をロード
    • Leaf pinning → SPKI/CA pinning:certificate-trust.md をロード
  2. 関連リファレンスファイルのマイグレーションパターンに従います。 すべてのマイグレーションセクションに含まれます:マイグレーション前の検証、アトミックマイグレーションステップ、レガシーデータの安全な削除、マイグレーション後の検証。

  3. マイグレーション完了後、リファレンスファイルのドメイン固有チェックリストを実行します。

  4. testing-security-code.md のガイダンスを使用してリグレッションがないことを確認します。


Branch 3 — IMPLEMENT(ゼロから構築)

目的: 新しい keychain/セキュリティ機能を最初から正しく構築します。

手順:

  1. タスクが関わるドメイン(複数可)を特定します。 下記の Domain Selection Guide を使用します。
  2. 関連リファレンスファイル(複数可)をロードします。 ✅ コードパターンに従います — コアセキュリティロジックについてそこから逸脱しません。
  3. 以下の Core Guidelines をすべての実装に適用します。
  4. 実装完了と見なす前に、ドメイン固有チェックリストを実行します。
  5. testing-security-code.md に従ってテストを追加します — ユニットテスト用プロトコルベースの抽象化、デバイス上のインテグレーションテスト用の実際の keychain。

Domain Selection Guide:

タスクが関わる場合…これらのリファレンスファイルをロード
パスワードまたはトークンの保存/読み取りkeychain-fundamentals.md + credential-storage-patterns.md
使用する kSecClass の選択keychain-item-classes.md
アイテムがアクセス可能なときを設定keychain-access-control.md
Face ID / Touch ID ゲーティングbiometric-authentication.md + keychain-access-control.md
ハードウェアバックキーsecure-enclave.md
データの暗号化/ハッシングcryptokit-symmetric.md
署名/キー交換/HPKEcryptokit-public-key.md
OAuth トークン/API キー/ログアウトcredential-storage-patterns.md
アプリと拡張機能間での共有keychain-sharing.md
TLS pinning/クライアント証明書certificate-trust.md
UserDefaults/plist シークレットの置換migration-legacy-stores.md
セキュリティコードのテスト作成testing-security-code.md
エンタープライズ監査/OWASP コンプライアンスcompliance-owasp-mapping.md

Core Guidelines

これら 7 つのルールは譲歩の余地がありません。すべての keychain/セキュリティ実装がこれらを満たす必要があります。

1. OSStatus を決して無視しない。 すべての SecItem* 呼び出しは OSStatus を返します。少なくとも以下をカバーする詳細な switch を使用します:errSecSuccesserrSecDuplicateItem(-25299)、errSecItemNotFound(-25300)、errSecInteractionNotAllowed(-25308)。戻り値を黙って破棄することは、ほとんどの keychain バグの根本原因です。→ keychain-fundamentals.md

2. LAContext.evaluatePolicy() をスタンドアロン認証ゲートとして決して使用しない。 これは Bool を返しますが、Frida による実行時パッチが容易です。Biometric 認証は keychain にバインドされている必要があります:SecAccessControl.biometryCurrentSet を持つシークレットを保存し、SecItemCopyMatching 中に Face ID/Touch ID の keychain プロンプトを許可します。keychain はセキュアエンクレーブで認証を処理します。パッチするための Bool がありません。→ biometric-authentication.md

3. UserDefaultsInfo.plist.xcconfig、または NSCoding アーカイブにシークレットを決して保存しない。 これらは暗号化されていないバックアップから読み取り可能なプレーンテキストアーティファクトを生成します。Keychain が credentials の唯一の Apple 公式ストアです。→ credential-storage-patterns.mdcommon-anti-patterns.md

4. @MainActorSecItem* を決して呼び出さない。 すべての keychain 呼び出しは securityd への IPC ラウンドトリップで、呼び出しスレッドをブロックします。すべての keychain アクセスに専用の actor(iOS 17+)または serial DispatchQueue(iOS 13–16)を使用します。→ keychain-fundamentals.md

5. 常に kSecAttrAccessible を明示的に設定する。 システムデフォルト(kSecAttrAccessibleWhenUnlocked)はすべてのバックグラウンド操作を破壊し、脅威モデルと一致しない可能性があります。アクセスパターンを満たす最も制限的なクラスを選択します。バックグラウンドタスク用:kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly。最高感度用:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly。→ keychain-access-control.md

6. 常に add-or-update パターンを使用する。 SecItemAdd の後、errSecDuplicateItemSecItemUpdate。delete-then-add は決して使用しない(レース窓を作成し、永続参照を破壊します)。errSecDuplicateItem ケースを処理しないで SecItemAdd を呼び出さない。→ keychain-fundamentals.md

7. 常に macOS でデータ保護 keychain をターゲットにする。 macOS ターゲットの SecItem* 呼び出しごとに kSecUseDataProtectionKeychain: true を設定します。これなしでは、クエリは従来のファイルベース keychain にサイレントにルーティングされます。これは異なる動作、サポートされていない属性の無視、biometric 保護またはセキュアエンクレーブキーの使用ができません。Mac Catalyst と iOS-on-Mac はこれを自動的に行います。→ keychain-fundamentals.md


クイックリファレンステーブル

Accessibility Constants — Selection Guide

定数いつ復号化可能バックアップ継続デバイスマイグレーション継続バックグラウンド安全使用場面
WhenPasscodeSetThisDeviceOnlyロック解除 + パスコード設定最高レベルのセキュリティシークレット;パスコード削除時に削除
WhenUnlockedThisDeviceOnlyロック解除バックグラウンド不要のデバイスバウンドシークレット
WhenUnlockedロック解除同期可能なシークレット(システムデフォルト — 暗黙的使用を避ける)
AfterFirstUnlockThisDeviceOnly最初のロック解除 → 再起動バックグラウンドタスク、プッシュハンドラー、デバイスバウンド
AfterFirstUnlock最初のロック解除 → 再起動復元を継続するバックグラウンドタスク

非推奨(決して使用しない): kSecAttrAccessibleAlwayskSecAttrAccessibleAlwaysThisDeviceOnly — iOS 12 で非推奨。

経験則: バックグラウンドアクセス必要(プッシュハンドラー、バックグラウンドリフレッシュ)? AfterFirstUnlockThisDeviceOnly から開始。フォアグラウンド限定? WhenUnlockedThisDeviceOnly から開始。高価値シークレットには WhenPasscodeSetThisDeviceOnly に厳格化。iCloud 同期またはバックアップマイグレーション必要な場合のみ非ThisDeviceOnly バリアントを使用。

CryptoKit Algorithm Selection

必要なものアルゴリズム最小 iOS注記
データをハッシュSHA256 / SHA384 / SHA51213SHA3_256/SHA3_512 は iOS 26+ で利用可能
データを認証(MAC)HMAC<SHA256>13常に定時間比較で検証(組み込み)
データを暗号化(認証済み)AES.GCM13256 ビットキー、96 ビットノンス、128 ビットタグ。同じキーでノンスを再利用しない
データを暗号化(モバイル最適化)ChaChaPoly13AES-NI なしのデバイスでより良い(古い Apple Watch)
データに署名P256.Signing / Curve25519.Signing13相互運用に P256 を使用、パフォーマンスに Curve25519 を使用
キー合意P256.KeyAgreement / Curve25519.KeyAgreement13常に HKDF で対称キーを導出 — ロー共有シークレットを決して使用しない
ハイブリッド公開鍵暗号HPKE17手動 ECDH+HKDF+AES-GCM チェーンを置換
ハードウェアバック署名SecureEnclave.P256.Signing13P256 のみ;キーはハードウェアを離れません
ポスト量子キー交換MLKEM76826形式検証(ML-KEM FIPS 203)
ポスト量子署名MLDSA6526形式検証(ML-DSA FIPS 204)
パスワード → キー導出PBKDF2(CommonCrypto 経由)13≥ 600,000 イテレーション SHA-256(OWASP 2024)
キー → キー導出HKDF<SHA256>13Extract-then-expand;常にドメイン分離の info パラメータを使用

Anti-Pattern Detection — Quick Scan

コードレビュー時、これらのパターンを検索します。一致はすべて検出事項です。 = ユーザーコードで検出するインセキュアなパターン署名。 = 参照ファイルで応用する是正パターン。

検索対象アンチパターン重要度リファレンス
UserDefaults.standard.set + token/key/secret/passwordプレーンテキスト credentials 保存CRITICALcommon-anti-patterns.md #1
ソース内でハードコードされた base64/hex 文字列(≥16 文字)ハードコードされた暗号キーCRITICALcommon-anti-patterns.md #2
近くに SecItemCopyMatching がない evaluatePolicyLAContext のみ biometric ゲートCRITICALcommon-anti-patterns.md #3
戻り値/OSStatus をチェックしない SecItemAdd無視されたエラーコードHIGHcommon-anti-patterns.md #4
add ディクショナリに kSecAttrAccessible がない暗黙的な accessibility クラスHIGHcommon-anti-patterns.md #5
同じキーでループ内の AES.GCM.Nonce()潜在的なノンス再利用CRITICALcommon-anti-patterns.md #6
HKDF なしの sharedSecret.withUnsafeBytesロー共有シークレット as キーHIGHcommon-anti-patterns.md #7
kSecAttrAccessibleAlways非推奨 accessibilityHIGHkeychain-access-control.md
#if !targetEnvironment(simulator) なしの SecureEnclave.isAvailableシミュレータ偽陰性トラップMEDIUMsecure-enclave.md
kSecAttrSynchronizable: true + ThisDeviceOnly矛盾した制約MEDIUMkeychain-item-classes.md
SecTrustEvaluate(同期、非推奨)レガシートラスト評価MEDIUMcertificate-trust.md
kSecClassGenericPassword + kSecAttrServerWeb credentials の間違ったクラスMEDIUMkeychain-item-classes.md

Top-Level Review Checklist

14 ドメインすべてにわたる高速スイープにこのチェックリストを使用します。各項目は 1 つ以上のリファレンスファイルにマップされ、詳細調査のためのものです。ドメイン固有の詳細チェックについては、各リファレンスファイルの下部にある Summary Checklist を使用します。

  • 1. Secrets は Keychain にあり、UserDefaults/plist/ソースにはないUserDefaultsInfo.plist.xcconfig、ハードコードされた文字列、または NSCoding アーカイブに credentials、トークン、または暗号化キーがない。OWASP M9(Insecure Data Storage)直接違反。→ common-anti-patterns.md #1–2、credential-storage-patterns.mdmigration-legacy-stores.mdcompliance-owasp-mapping.md

  • 2. すべての OSStatus がチェックされている — すべての SecItem* 呼び出しが詳細な switch または同等のもので戻りコードを処理。無視された戻り値なし。errSecInteractionNotAllowed は非破壊的に処理(後で再試行、削除しない)。→ keychain-fundamentals.mdcommon-anti-patterns.md #4

  • 3. Biometric 認証は keychain にバインドされている — Biometrics を使用する場合、認証は LAContext.evaluatePolicy() のみではなく SecAccessControl + keychain アクセスで実施。→ biometric-authentication.mdcommon-anti-patterns.md #3

  • 4. Accessibility クラスは明示的かつ正確 — すべての keychain アイテムは、アクセスパターン(バックグラウンド vs フォアグラウンド、デバイスバウンド vs 同期可能)に一致する明示的な kSecAttrAccessible 値を持つ。非推奨の Always 定数なし。→ keychain-access-control.md

  • 5. @MainActor での SecItem* 呼び出しなし — すべての keychain 操作は専用 actor またはバックグラウンドキューで実行。UI コード、viewDidLoad、または application(_:didFinishLaunchingWithOptions:) での同期 keychain アクセスなし。→ keychain-fundamentals.md

  • 6. 各アイテムタイプに対する正しい kSecClass — Web credentials は AutoFill 用に InternetPassword(GenericPassword ではなく)を使用。暗号化キーは適切な kSecAttrKeyType を持つ kSecClassKey を使用。アプリシークレットは kSecAttrService + kSecAttrAccount を持つ GenericPassword を使用。→ keychain-item-classes.md

  • 7. CryptoKit は正しく使用 — ノンスは同じキーで再利用されない。ECDH 共有シークレットは常に対称キーとして使用する前に HKDF で導出。SymmetricKey マテリアルは Keychain に保存、メモリやファイルに保存されない。Crypto 操作はプロトコルベースのユニットテストでカバー。→ cryptokit-symmetric.mdcryptokit-public-key.mdtesting-security-code.md

  • 8. Secure Enclave 制約は尊重 — SE キーは P256 のみ(古典的)、決してインポートされない(常にオンデバイスで生成)、デバイスバウンド(バックアップ/同期なし)。利用可能性チェックはシミュレータと keychain-access-groups 要件の問題から保護。→ secure-enclave.md

  • 9. 共有とアクセスグループは正しく設定kSecAttrAccessGroup は完全な TEAMID.group.identifier 形式を使用。要件はアプリと拡張機能間で一致。偶発的なクロスアプリデータ公開なし。→ keychain-sharing.md

  • 10. 証明書トラスト評価は最新SecTrustEvaluateAsyncWithError を使用(非推奨の同期 SecTrustEvaluate ではなく)。Pinning 戦略は SPKI ハッシュまたは NSPinnedDomains を使用(annual ローテーション破損の leaf 証明書 pinning ではなく)。→ certificate-trust.md

  • 11. macOS ターゲットはデータ保護 keychain — すべての macOS SecItem* 呼び出しは kSecUseDataProtectionKeychain: true を含む(Mac Catalyst / iOS-on-Mac を除く、自動)。→ keychain-fundamentals.md


References Index

#ファイルワンライン説明リスク
1keychain-fundamentals.mdSecItem* CRUD、クエリディクショナリ、OSStatus 処理、actor ベースのラッパー、macOS TN3137 ルーティングCRITICAL
2keychain-item-classes.md5 つの kSecClass タイプ、複合主キー、GenericPassword vs InternetPassword、ApplicationTag vs ApplicationLabelHIGH
3keychain-access-control.md7 つの accessibility 定数、SecAccessControl フラグ、データ保護層、NSFileProtection サイドバーCRITICAL
4biometric-authentication.mdKeychain バインド biometrics、LAContext バイパス脆弱性、登録変更検出、フォールバックチェーンCRITICAL
5secure-enclave.mdハードウェアバック P256 キー、CryptoKit SecureEnclave モジュール、永続性、シミュレータトラップ、iOS 26 ポスト量子HIGH
6cryptokit-symmetric.mdSHA-2/3 ハッシング、HMAC、AES-GCM/ChaChaPoly 暗号化、SymmetricKey 管理、ノンス処理、HKDF/PBKDF2HIGH
7cryptokit-public-key.mdECDSA 署名、ECDH キー合意、HPKE(iOS 17+)、ML-KEM/ML-DSA ポスト量子(iOS 26+)、曲線選択HIGH
8credential-storage-patterns.mdOAuth2/OIDC トークンライフサイクル、API キー保存、リフレッシュトークン回転、ランタイムシークレット、ログアウトクリーンアップCRITICAL
9keychain-sharing.mdアクセスグループ、Team ID プレフィックス、アプリ拡張機能、Keychain Sharing vs App Groups 要件、iCloud 同期MEDIUM
10certificate-trust.mdSecTrust 評価、SPKI/CA/leaf pinning、NSPinnedDomains、クライアント証明書(mTLS)、信頼ポリシーHIGH
11migration-legacy-stores.mdUserDefaults/plist/NSCoding → Keychain マイグレーション、安全な削除、初回起動クリーンアップ、バージョン管理マイグレーションMEDIUM
12common-anti-patterns.mdトップ 10 AI 生成セキュリティミスと ❌/✅ コードペア、検出ヒューリスティック、OWASP マッピングCRITICAL
13testing-security-code.mdプロトコルベースモッキング、シミュレータ vs デバイス差異、CI/CD keychain、Swift Testing、ミューテーションテストMEDIUM
14compliance-owasp-mapping.mdOWASP Mobile Top 10(2024)、MASVS v2.1.0、MASTG テスト ID、M1/M3/M9/M10 マッピング、監査準備MEDIUM

Authoritative Sources

これらは、すべてのリファレンスファイルの基礎となる主要なソースです。疑わしい場合は、二次ソースより優先します。

  • Apple Keychain Services Documentation — 正規 API リファレンス
  • Apple Platform Security Guide(毎年更新) — アーキテクチャと暗号化設計
  • TN3137: "On Mac Keychain APIs and Implementations" — macOS データ保護 vs ファイルベース keychain
  • Quinn "The Eskimo!" DTS Posts — "SecItem: Fundamentals" と "SecItem: Pitfalls and Best Practices"(2025 年まで更新)
  • WWDC 2019 Session 709 — "Cryptography and Your Apps"(CryptoKit 導入)
  • WWDC 2025 Session 314 — "Get ahead with quantum-secure cryptography"(ML-KEM、ML-DSA)
  • OWASP Mobile Top 10(2024) + MASVS v2.1.0 + MASTG v2 — コンプライアンスフレームワーク
  • CISA/FBI "Product Security Bad Practices" v2.0(2025 年 1 月) — ハードコード credentials を国家セキュリティリスクに分類

Agent Behavioral Rules

以下のセクションは、このスキルを使用するときに AI エージェントがどのように動作するかを管理します。スコープ内か、スコープ外か、トーンキャリブレーション、よくある間違いを避ける方法、リファレンスファイルを選択する方法、出力形式要件。

Scope Boundaries — Inclusions

このスキルは、iOS、macOS、tvOS、watchOS、visionOS 全体の client-side Apple プラットフォームセキュリティ の権威です:

  • Keychain ServicesSecItemAddSecItemCopyMatchingSecItemUpdateSecItemDelete、クエリディクショナリ構築、OSStatus 処理、actor/スレッド分離、macOS 上のデータ保護 keychain(TN3137)
  • Keychain アイテムクラスkSecClassGenericPasswordkSecClassInternetPasswordkSecClassKeykSecClassCertificatekSecClassIdentity、複合主キー、AutoFill 統合
  • アクセス制御 — 7 つの kSecAttrAccessible 定数、SecAccessControlCreateWithFlags、データ保護層、NSFileProtection 対応
  • Biometric 認証LAContext + keychain バインディング、boolean ゲート脆弱性、登録変更検出、フォールバックチェーン、evaluatedPolicyDomainState
  • Secure Enclave — CryptoKit SecureEnclave.P256 モジュール、ハードウェア制約(P256 のみ、インポートなし、エクスポートなし、対称なし)、keychain 経由の永続性、シミュレータトラップ、iOS 26 ポスト量子(ML-KEM、ML-DSA)
  • CryptoKit symmetric — SHA-2/SHA-3 ハッシング、HMAC、AES-GCM、ChaChaPoly、SymmetricKey ライフサイクル、ノンス処理、HKDF、PBKDF2
  • CryptoKit public-key — ECDSA 署名(P256/Curve25519)、ECDH キー合意、HPKE(iOS 17+)、ML-KEM/ML-DSA(iOS 26+)、曲線選択
  • Credential 保存パターン — OAuth2/OIDC トークンライフサイクル、API キー保存、リフレッシュトークン回転、ランタイムシークレット取得、ログアウトクリーンアップ
  • Keychain 共有 — アクセスグループ、Team ID プレフィックス、keychain-access-groups vs com.apple.security.application-groups 要件、拡張機能、iCloud Keychain 同期
  • 証明書信頼SecTrust 評価、SPKI/CA/leaf pinning、NSPinnedDomains、クライアント証明書(mTLS)、信頼ポリシー
  • マイグレーション — UserDefaults/plist/NSCoding → Keychain マイグレーション、安全なレガシー削除、初回起動クリーンアップ、バージョン管理マイグレーション
  • テスト — プロトコルベースモッキング、シミュレータ vs デバイス差異、CI/CD keychain 作成、Swift Testing パターン
  • コンプライアンス — OWASP Mobile Top 10(2024)、MASVS v2.1.0、MASTG v2 テスト ID、CISA/FBI Bad Practices

スコープ内のエッジケース: mTLS pinning 用のクライアント側証明書ロード(certificate-trust.md)。Keychain 内の Passkey/AutoFill credential 保存(keychain-item-classes.mdcredential-storage-patterns.md)。@AppStorage を不安全な保存としてフラグ — Keychain にリダイレクト(common-anti-patterns.md)。

Scope Boundaries — Exclusions

以下のトピックについては、このスキルを使用して回答 しない ください。スコープ外である理由を簡潔に説明し、検索先を提案します。

トピック除外される理由リダイレクト先
App Transport Security(ATS)サーバー側 TLS ポリシー、client keychain ではないApple の ATS ドキュメント、Info.plist NSAppTransportSecurity リファレンス
CloudKit 暗号化サーバー管理キー階層、client CryptoKit ではないCloudKit ドキュメント、CKRecord.encryptedValues
ネットワークセキュリティ/URLSession TLS 設定トランスポート層、保存層ではないApple URL Loading System ドキュメント;このスキルは mTLS のクライアント証明書ロードのみカバー
サーバー側認証アーキテクチャバックエンド JWT issuance、OAuth プロバイダ設定OWASP ASVS(Application Security Verification Standard)
WebAuthn/passkeys サーバー側Relying party 実装Apple "Supporting passkeys" ドキュメント;このスキルは Keychain に credentials を保存するクライアント側 ASAuthorizationController のみカバー
コード署名/プロビジョニングプロファイルビルド/配布、ランタイムセキュリティではないApple コード署名ドキュメント
Jailbreak 検出ランタイム整合性、暗号保存ではないOWASP MASTG MSTG-RESILIENCE カテゴリ
SwiftUI @AppStorageUserDefaults ラッパー — シークレット不安全のみ除外common-anti-patterns.md #1 でフラグ;深い覆範なし
クロスプラットフォーム暗号(OpenSSL、LibSodium)サードパーティライブラリ、Apple フレームワークではない各ライブラリドキュメント

Tone Rules

このスキルは 非党派的で正確性中心 です。トーンは重要度に基づいてキャリブレートされます。

デフォルトトーン — 勧告的。 以下の場合は「検討してください」「提案」「1 つのアプローチは」「一般的なパターンは」を使用:アーキテクチャの選択(ラッパークラスデザイン、actor vs DispatchQueue)、複数の有効なオプションが存在する場合のアルゴリズム選択(P256 vs Curve25519、AES-GCM vs ChaChaPoly)、脅威モデルが不明な場合のアクセシビリティクラス選択、テスト戦略、コード組織。

昇格したトーン — 指令的。 「常に」「決して」「必須」を使用するのは のみ 上記の 7 つの Core Guidelines と common-anti-patterns.md の 10 アンチパターンです。これらはセキュリティ不変、スタイル設定ではありません。詳細な指令リスト:

  1. OSStatus を決して無視しない — 常に SecItem* 呼び出しから戻りコードをチェック。→ keychain-fundamentals.md
  2. LAContext.evaluatePolicy() をスタンドアロン認証ゲートとして決して使用しない — 常に biometrics を keychain アイテムにバインド。→ biometric-authentication.md
  3. UserDefaultsInfo.plist.xcconfig、または NSCoding アーカイブにシークレットを決して保存しない。→ credential-storage-patterns.mdcommon-anti-patterns.md
  4. @MainActorSecItem* を決して呼び出さない — 常にバックグラウンド actor またはキューを使用。→ keychain-fundamentals.md
  5. すべての SecItemAdd で常に kSecAttrAccessible を明示的に設定。→ keychain-access-control.md
  6. 常に add-or-update パターン(SecItemAdderrSecDuplicateItemSecItemUpdate)を使用。→ keychain-fundamentals.md
  7. macOS ターゲットで常に kSecUseDataProtectionKeychain: true を設定。→ keychain-fundamentals.md
  8. 同じ AES-GCM キーでノンスを決して再利用しない。→ cryptokit-symmetric.mdcommon-anti-patterns.md
  9. ロー ECDH 共有シークレットを対称キーとして決して使用しない — 常に HKDF で導出。→ cryptokit-public-key.mdcommon-anti-patterns.md
  10. セキュリティ目的で決して Insecure.MD5 または Insecure.SHA1 を使用しない。→ cryptokit-symmetric.mdcommon-anti-patterns.md

パターンがこのリストにない場合は、勧告的トーンを使用します。リファレンスファイルがサポートするもの以上に警告をエスカレートしないでください。

トーン(拒否時)。 クエリがスコープ外の場合、直接的ですが軽蔑的ではありません。「このスキルは client-side keychain と CryptoKit をカバーします。ATS 設定については、Apple の NSAppTransportSecurity ドキュメントが正しいリファレンスです。」境界を述べ、代替案を提案し、続行。


Common Mistakes

最終出力前に、すべての 10 をスキャンします。各項目は正しいパターンを含むリファレンスファイルにリンク。 各エントリは意図的にペア: 不正確な生成動作と 代わりに使用する是正パターン。

ミステイク #1 — LAContext.evaluatePolicy() をスタンドアロン biometric ゲートとして生成。 AI は boolean コールバックパターンを生成します。evaluatePolicysuccess: Bool を返し、アプリがその boolean でアクセスをゲート。boolean はフック可能なユーザー空間メモリに存在 — Frida/objection は 1 コマンドでバイパス。✅ 正しいパターン: SecAccessControl.biometryCurrentSet を持つシークレットの背後に保存、SecItemCopyMatching 経由で取得。→ biometric-authentication.md

ミステイク #2 — シミュレータガードなしで SecureEnclave.isAvailable を提案。 AI は #if !targetEnvironment(simulator) なしで if SecureEnclave.isAvailable { ... } を生成。シミュレータで、isAvailablefalse を返し、すべてのシミュレータテストでサイレントにフォールバックパスを実行。✅ 正しいパターン: #if targetEnvironment(simulator) を使用してコンパイル時にクリアエラーをスロー/リターン、デバイスビルドのみで SecureEnclave.isAvailable をチェック。→ secure-enclave.md

ミステイク #3 — Secure Enclave へのキーのインポート。 AI は SecureEnclave.P256.Signing.PrivateKey(rawRepresentation: someData) を生成。SE キーはハードウェアの内部で生成される必要があります — SE タイプに init(rawRepresentation:) がありません。init(dataRepresentation:) は前に作成された SE キーからの不透明な暗号化ブロブのみを受け入れます。✅ 正しいパターン: SE 内で生成、不透明な dataRepresentation を keychain に永続化、init(dataRepresentation:) で復元。→ secure-enclave.md

ミステイク #4 — SecureEnclave.AES または SE を対称暗号化に使用。 AI は存在しない SE 対称 API への参照を生成。SE の内部 AES エンジンは開発者 API として公開されていません。iOS 26 前は SE は P256 署名とキー合意のみサポート。iOS 26 は ML-KEM と ML-DSA を追加、対称プリミティブではありません。✅ 正しいパターン: SE を署名/キー合意に使用;ECDH + HKDF 経由で SymmetricKey を導出して暗号化。→ secure-enclave.mdcryptokit-symmetric.md

ミステイク #5 — SecItemAddkSecAttrAccessible を省略。 AI は accessibility 属性なしで add ディクショナリをビルド。システムはデフォルトで kSecAttrAccessibleWhenUnlocked を適用。これはバックグラウンド操作を破壊し、セキュリティポリシーをコードレビューで見えなくします。✅ 正しいパターン: 常に kSecAttrAccessible を明示的に設定。→ keychain-access-control.md

ミステイク #6 — errSecDuplicateItem を処理しないで SecItemAdd を使用。 AI は errSecSuccess のみをチェック、または delete-then-add を使用。duplicate 処理なしで、2 番目の保存はサイレントに失敗。delete-then-add はレース窓を作成し、永続参照を破壊。✅ 正しいパターン: add-or-update パターン。→ keychain-fundamentals.md

ミステイク #7 — AES-GCM 暗号化に明示的なノンスを指定。 AI は手動でノンスを作成し、AES.GCM.seal に渡す。手動ノンス管理はリユースを招きます — 単一リユースは両方のプレーンテキストの XOR を明かします。CryptoKit はパラメータを省略するとき暗号的にランダムなノンスを自動生成。✅ 正しいパターン: nonce: パラメータなしで AES.GCM.seal(plaintext, using: key) を呼び出し。→ cryptokit-symmetric.mdcommon-anti-patterns.md #6

ミステイク #8 — ロー ECDH 共有シークレットを対称キーとして使用。 AI は sharedSecretFromKeyAgreement の出力を取得し、withUnsafeBytes で直接使用。ロー共有シークレットは非均一分布があります。CryptoKit の SharedSecret は意図的に withUnsafeBytes がない — このコードは unsafe ワークアラウンド必要、これは誤用の明確な信号。✅ 正しいパターン: 常に sharedSecret.hkdfDerivedSymmetricKey(...) で導出。→ cryptokit-public-key.mdcommon-anti-patterns.md #7

ミステイク #9 — SHA-3 が iOS 18 で追加されたと主張。 AI は swift-crypto open-source パッケージ(iOS 13+ に SHA-3 をバックポート、独自 XKCP 実装経由)を CryptoKit フレームワークと混同。SHA-3 ファミリータイプ(SHA3_256SHA3_384SHA3_512)は iOS 26 / macOS 26 で CryptoKit に追加(apple/swift-crypto PR #397、タグ [WWDC25])。swift-crypto パッケージは iOS 13+ で SHA-3 を独自実装で提供しますが、import CryptoKit は iOS 26 が必要。✅ 正しいバージョンタグ: CryptoKit の SHA-3 → iOS 26+。swift-crypto パッケージの SHA-3(import Crypto) → iOS 13+。ML-KEM/ML-DSA → iOS 26+。→ cryptokit-symmetric.md

ミステイク #10 — 初回起動 keychain クリーンアップの欠落。 AI は keychain クリーンアップなしで標準 @main struct MyApp: App を生成。Keychain アイテムはアプリアンインストール後も存続。再インストールされたアプリは stale トークン、期限切れキー、孤立した credentials を継承。✅ 正しいパターン: UserDefaults フラグをチェック、初回起動時にすべての 5 つの kSecClass タイプで SecItemDelete。→ common-anti-patterns.md #9、migration-legacy-stores.md


Reference File Loading Rules

クエリに答えるのに必要な 最小セット をロード。14 すべてをロードしない — ~7,000+ 行の合計でフォーカスを薄める。

クエリタイプこれらのファイルをロード理由
"keychain コードをレビュー"common-anti-patterns.md → その後コードが何をするかに基づくドメイン固有ファイルAnti-patterns ファイルはレビューバックボーン
"この biometric 認証は安全か?"biometric-authentication.md + common-anti-patterns.md(#3)Boolean ゲートは #1 biometric リスク
"トークン/パスワードを保存"keychain-fundamentals.md + credential-storage-patterns.mdCRUD + ライフサイクル
"データを暗号化/ハッシュ"cryptokit-symmetric.md対称操作
"データに署名/キー交換"cryptokit-public-key.md非対称操作
"Secure Enclave を使用"secure-enclave.md + [keychain-fundamentals.md

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
dpearson2699
リポジトリ
dpearson2699/swift-ios-skills
ライセンス
MIT
最終更新
不明

Source: https://github.com/dpearson2699/swift-ios-skills / ライセンス: MIT

関連スキル

汎用ソフトウェア開発⭐ リポ 39,967

doubt-driven-development

重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 1,175

apprun-skills

TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。

by yysun
OpenAIソフトウェア開発⭐ リポ 797

desloppify

コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。

by Git-on-my-level
汎用ソフトウェア開発⭐ リポ 39,967

debugging-and-error-recovery

テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

test-driven-development

テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

incremental-implementation

変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。

by addyosmani
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: dpearson2699 · dpearson2699/swift-ios-skills · ライセンス: MIT