ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
暗号化とApp
システムフレームワークでは、保存されているデータと転送中のデータが透過的な方法で暗号化されます。この機能は、単に属性を設定することで利用可能です。ただし、ユーザーのデータを保護するためにできることは他にもあります。新しいSwiftフレームワークのCryptoKitでは、単にハッシュを計算する必要がある場合でも、より高度な認証プロトコルを実装する場合でも、暗号化操作をこれまでになく簡単かつ安全に実行することができます。
リソース
関連ビデオ
WWDC19
-
ダウンロード
(音楽)
(拍手) こんにちは ようこそ 皆さん ビットコインのセッションへ (笑い声) 失礼 暗号化と アプリケーションについてです 本日は 同僚のフレデリックと私が Apple製品における 暗号化についてお話しします 私は暗号化技術チームの ヤニック・シエラです 今からご紹介するのは― 一般的なセキュリティ問題を 解決できる― すばらしいシステムのフィーチャです そしてもう1つは 暗号処理用の 新しいSwift APIです 楽しみです 皆さんには保護したい情報が あることでしょう
デベロッパとしても ユーザとしても― 個人情報の保護は 極めて重要なことです
さまざまな種類の情報があります 電話番号やEメールアドレスなどの プロフィール情報などです またアプリケーションでは― 写真や音楽などの ユーザ情報を扱い― アプリケーションの向上に 役立てます
ビジネスのアセットも扱います アプリケーションの 有料コンテンツや― モバイルバンキングの 口座情報が そうです
それらの情報を守ることは 重要であり― そのためのツールが要ります Appleでは― セキュリティとプライバシーが 中核です すべてのフィーチャに 組み込まれています 暗号化技術は その主要部分です
例えば デバイスの整合性です セキュリティ属性の 改ざんを防ぐために 暗号化技術で 稼働中のソフトウェアの 整合性を認証します 保存データの保護にも 使用しています 多くのユーザが好む 幅広いアプリケーションに 暗号化技術を使用しています メッセージやSafari iCloudなどの 個人的な瞬間を共有する アプリケーションです 10億以上のデバイスに 暗号化技術を導入しています ご想像どおり リスクも大きいです 快適なユーザ体験のために パフォーマンスは重要です エネルギーは バッテリーの持ちに欠かせません そしてセキュリティは土台です それでは 暗号化技術の 説明をしましょう
暗号化技術は― プロパティに ソリューションを与えます 例えば メッセージの 送信元を認証したり―
ユーザだけが復号できるように 内容を暗号化します
そして整合性を保護し メッセージの改ざんを 回避するのです
幅広いセキュリティ問題を 解決するため― 暗号化機能と暗号プロトコルを 組み合わせます それは難しい作業です
こういう格言があります “自分自身で暗号処理をするな” その理由は 多くの間違いが起こるからです まずプリミティブの選択を誤ると― 希望するセキュリティが得られません
正しい選択をしても 使い方を間違う可能性があります 最悪の場合 タイミング攻撃や パディングオラクル攻撃によって 秘密や鍵が 漏えいするかもしれません 暗号化技術は とても難しいのです 暗号プロトコルの欠陥が― ニュースで 絶えず報じられています
またセキュリティの脆弱性の発見に 1年かかることさえあるのです
そのような理由でリスクが高く― 正しい理解には努力を要します 安全なプロトコルを 作成するには 時間と技術 そして専門知識が必要です プロトコルの作成だけでは ありません 常に新しい攻撃を監視し― コードに適合するものを調べ 対応するのです これも容易ではありません ライブラリに 依存していることもあるからです
場合によっては プロトコルを修正し― あらゆる状況に 対処しなくてはなりません
それらのすべてが大仕事です 大きなアイデアに 時間とエネルギーを 費やすことになります
代わりにネイティブのフィーチャを 利用してください 私たちの理念は 一般的な課題の 解決策を提供することです 努力をするのは私たちであり― 皆さんはリスクを負う必要は ありません 私たちは独自のハードウェアの フィーチャにより― より良いセキュリティを得られます
では 多くの人に なじみのある 様々な例を見ていきましょう
まずはデバイス上の データの保護です
次にクレデンシャルと鍵の保護
そしてデバイスとユーザ間の データ共有
安全なネットワーク接続 最後に 証明書による 通信相手の確認です
1つ目の例を見てみましょう 多くの人が デバイスにある― データの保護を 試みたことがあるでしょう 一番のアドバイスは― Webサイトから コピー&ペーストしないこと
データ保護機能を使ってください パスコードとSecure Enclaveの ハードウェア技術を組み合わせ― 鍵を保護する機能です 暗号化されたデータは 総当たり攻撃を受けません
さらにデータ保護は― post compromise recoveryにも 有効です 前方秘匿性とも呼ばれる この機能は― デバイスの鍵が盗まれた時の 安全策です パスコードを変えると― 以後 暗号化されたデータに 古い鍵は使えません
これは重要なことです iOSセキュリティに関する ホワイトペーパーで データ保護の詳細を 確認することができます また アプリケーションに 問題が起きた時に設定できる― 異なる保護属性もあります
当初は“最初の認証まで”でした 起動後に 初めてロックを 解除するまで― データが保護されていたのです 現在はさらに― 完全なファイル保護が 可能になりました ユーザがロックを 解除した後のみ― データを 利用できるようになったのです 再びロックすると またデータが保護されます
難しいことはありません 使用するオプションは completeFileProtectionです 簡単ですね 適した箇所で使えば― 高いセキュリティレベルを 得ることができます
ファイル以外にも― 保護したい情報があるでしょう 例えば認証トークンのような クレデンシャルや― 暗号鍵などです
しかし それらを― デフォルトに 入力しないでください キーチェーンを使いましょう SecItem APIの Keychainを使えば― それらのアイテムを 1つのデバイスに保管できます または すべてのデバイス間で 同期できる― iCloud Keychainへも 保管可能です これには 2ファクタ認証が 求められます
キーチェーンは 先ほどお話しした― ファイルの保護と とても似ています その他の機能は 資料でご確認ください
鍵が暗号化される時に加え いつどのようにユーザが 認証するのかも重要です そのために LocalAuthenticationがあります これを使うことで 処理の実行に関して 制限を加えることができるのです 例えば認証方法をFace IDに 設定できます とても便利です macOSに関する朗報もあります
macOSでは 2つの認証属性がありました
ユーザの認証方法は パスワードか― Touch IDによる指紋認証です しかし これからは アプリケーションを変更せずに―
Apple Watchでの認証が 可能になります パスワードの使用や フリクションを減らすことで ユーザ体験を向上できます そのために 2つのポリシーを加えました 1つ目は― 認証方法を 指紋認証と Apple Watchに絞ること
2つ目はApple Watchのみです それらが使われるのを 楽しみにしています
キーチェーンは すべてのデバイス間で― アイテムを同期できる方法ですが データはどうでしょう? データにも解決策があります CloudKitです CloudKitのデータベースで アセットを暗号化し―
すべてのデバイスで共有できます アプリケーションへの サインインは不要です さらに すべてのユーザと それを共有できます
信頼できる機関として Appleが― iCloudの情報と データ管理を助けます
設定の例を お見せしましょう ファイルからアセットを作成し―
レコードを作成してください それをprivateCloudDatabaseに アップロードします
それだけです 定義したAPIに ユーザ間の共有も追加できます CloudKitを使って― その有用性を ぜひ実感してください
これによりデバイスの内部の データを保護し― それを他のユーザのデバイスと 共有できます では 自身のserverからのデータを 共有する方法は? どこで安全な接続を 確立できるのでしょうか 安全な接続は重要です アプリケーションからアクセスできる すべての情報の 守秘を保証するからです 情報の信頼性を保証し 改ざんを防ぐ必要があります
カスタムプロトコルの使用は お勧めしません その代わり すばらしい解決方法があります Transport Layer Securityです 使い方は とても簡単で― 2つのAPIが助けになります 1つ目は Networkフレームワークです 去年のWWDCで 知った人もいるでしょう 2つ目のURL Sessionは― App Transport Securityの 一部です
httpsのエンドポイントを使います
どちらの場合も―
優れたデフォルトを備えた TLSに依存します 強固なセキュリティを提供する デフォルトです Perfect Forward Secrecyや 最も効率的な アルゴリズムも含みます
TLSの実装では―
デフォルトでTLS 1.3を使用します TLS 1.3は前のバージョンと比べ― 多くの点が改善されました 安全性が格段に向上し 効率性も高まっています
TLS 1.3をserverで 展開してみてください アプリケーションのコードを 変える必要はありません
では Networkフレームワークと URL Sessionを使った― 2つの例をお見せします その前に1つ Secure Transportは もうお勧めしません Networkフレームワークと― URL Sessionに 切り替えてください これが それらの例です Networkフレームワークで 接続を確立するには “: .tls”を使います これで接続が追加され― 高い安全性が提供されます URL Sessionは― httpsのエンドポイントを 使うだけです
場合によっては TLSを使えないこともあります 例えばコンテンツデリバリ ネットワークで― データを保管する場合です それには 証明書の処理が必要です
証明書を―
Webサイトで見つけたパーサで 使うのは避けてください パーサは極めて脆弱で 重大な攻撃を受けます
とても危険です プラットフォームにある SecTrustが― ポリシーに対する 証明書の認証を助けてくれます 信頼ポリシーには期限や 失効の情報が含まれており―
証明書が認証されている間は 鍵が有効です
TLSなら証明書の心配も 要りません 自動的に処理されるからです
そして今回はSecTrustの 新しい機能を紹介します
2つのことを 組み合わせた機能です この機能は 明示的なアクションにより 非同期的に 証明書の認証を行えます つまり証明書の認証中に 他のことを行えるのです
また高度な処理もできます 不具合が起きた場合 デベロッパは― その原因をデバッグすることが 可能です 異なるエラーに対応するための ロジックも構築できます
この新機能により デバッグが より手軽になるでしょう
ここまで 5つの異なるケースを ご説明しました どの解決法も 簡単に行うことができ 高い安全性を提供します 安全性を得るのに必要なのは 少しの設定だけです
ハードウェアとの インテグレーションにより 高度なセキュリティを 提供できるのです
どのケースに直面したとしても―
最適なSystem frameworkの 属性を使ってください ユーザとビジネスのアセットを 可能な限り保護するためです
しかし いくつかの状況においては システムのフィーチャが 適さない場合もあります
例えば Appleのエコシステム以外は 互換性が必要です
サービスの認証や―
仕様書の実装が 必要な場合もあるでしょう
それらすべてのケースを― 解決するものがあります Apple CryptoKitです Apple CryptoKitは 新しいSwiftの暗号化用APIで 前出のフィーチャと同じ原理で 設計されています 簡単に暗号処理機能を使え― 誤用の心配はありません ここで発表できることを うれしく思います このAPIの話をするのは フレデリックです 彼を迎えましょう (拍手) ヤニック ありがとう 私は フレデリック・ジェイコブスです 暗号化技術チームで働いています 今日は Apple CryptoKitの 話をしますが― 暗号プロトコルを 気に入ってもらえると思います
お話しするのはApple CryptoKitの 4つの側面です 1つ目は CryptoKitとSwiftについて
2つ目は CryptoKitの精選した アルゴリズムについて話します
3つ目に話すのは― Secure Enclaveと 生体認証について 最後は パフォーマンスについてです 始めましょう SwiftからC crypto APIを 呼び出す時― 以前は このようなコードを 書いていたでしょう バッファを割り当て― それぞれのサイズを 探していました ノンスのような値があり 安全な値を求める必要が あったかと思います ポインタを渡す 暗号化機能の中には ネストしたコールがありました そこにはポインタと引数の 組み合わせを探すための― 引数ラベルもなかったのです
Apple CryptoKitなら― 同じ操作を 1行のコードでできます 最高ですよね (拍手) 方法を説明しましょう 暗号化したいデータを cipherに渡します 今回 使うのはAES.GCMです そして暗号化したいデータに 鍵を使います
それだけです
これまではC crypto APIを 呼び出す際に― 自分で暗号鍵を生成していました それには まず ビットとバイトを変換します 暗号鍵は一般的に ビットで表現するからです そのバイト数に応じて バッファを割り当てます
そして乱数生成器を使い 暗号理論的に安全な疑似乱数で バッファを満たすのです
もしエラーが発生すれば 処理が必要ですが― これで鍵を使う準備が整いました 鍵を使い終わったら メモリから消すために ゼロ化するのを忘れずに
CryptoKitでは鍵の生成も 1行で済みます
SymmetricKeyイニシャライザを 呼び出し 鍵に設定したいビット数を 渡すだけです
そして自動的に ゼロ化することができます
なぜなら Automatic Reference Countingにより 割り当てを取り消したバッファが ゼロ化されるのです
次はCryptoKitとSwift これは強い型付けのAPIです
値を初期化すると 渡されたデータが― その引数に対して強い値であるか 確認が行われます
Swiftのメモリ管理モデルにより CryptoKit内に割り当てられた― すべてのシークレット値を ゼロ化することができるのです
メッセージ認証コードのような 値には― Equatable conformanceを使います 等価演算子を用いて 2つのメッセージ認証コードを 一定の時間で確認できるのです
CryptoKitは プロトコルを定義できるので ハッシュ関数Hに ジェネリックコードも書けます 複数のハッシュ関数を渡すには 関数呼び出しを― 別のハッシュ関数で パラメータ化してください
CryptoKitとSwiftの話をしました 次はCryptoKitの― 精選された一連の アルゴリズムについて話します
すべて査読された 標準のアルゴリズムです
CryptoKitで サポートしているものは
ハッシュ関数 メッセージ認証コード 認証付き暗号
鍵共有
そして デジタル署名です
Common CryptoやSecKeyなどの フレームワークで― サポートしていた アルゴリズムもあります 緑に色づけしたのが― 今回 初めてサポートしている アルゴリズムです
安全性の低いモジュールもあります
MD5やSHA-1などを 提供するモジュールです 安全基準を満たさない アルゴリズムを使っていても― CryptoKitを使用できます
CryptoKitの機能を見てみましょう まずはハッシュ関数です ハッシュ関数は― 固定長のダイジェストを 生成するものです Swiftと違って CryptoKitのハッシュ関数は 衝突耐性などのプロパティを 提供します しかし 同じダイジェストに 変換する― 2つの入力を探すのは困難です
ハッシュ値の計算は 使いたいハッシュ関数に― ハッシュのメソッドを呼び出し 計算したいデータを渡すだけです この音声データの ダイジェスト値を計算するために― 今回はハッシュ関数の SHA-256を使用します
入力ストリームから ファイルを読み込む場合は― 段階的にダイジェスト値を 計算してください まずMTイニシャライザを呼び出し ハッシュ値を得る関数を 初期化します
そしてハッシュ値を得たい データを渡し Updateメソッドを 呼び出してください
またダイジェスト値を 計算したい時は finalizeメソッドを呼び出すと ダイジェスト値が得られます
次にお話しする認証付き暗号は― 長い間 要望がありました 認証と暗号の両方を 供給する機能です
暗号プロトコルにおいて 認証が欠如していると さまざまな攻撃を招きます また認証と暗号を 手動で組み合わせると― パディングオラクル攻撃を 導きかねません 認証付き暗号は 一度のAPIの呼び出しで済みます
これは ハイキングの アプリケーションで― 多くのコンテンツは無料です しかし いくつかの 有料コンテンツもあります
料金を払えば 追加コンテンツを取得できるのです コンテンツ配信ネットワークを使うと ダウンロードの速度を保てます
コンテンツを取得するには まず購入が完了したか― serverで確認することが必要です その後に serverから取得された鍵が 電話機に渡されます あとは暗号化されたデータを ダウンロードし― 鍵を使って コンテンツを復号するだけです 正しい鍵を入手していて― コンテンツ配信ネットワークでの データの改ざんがなければ― データを取得できます
コードを見てみましょう
まずはserverから取得した― 鍵のデータを初期化します
そしてsealed boxを 初期化しますが― この場合 sealed boxの内容は 関係ありません しかし ノンスと暗号化したテキストや タグを組み合わせるような― 特別な仕様の実装には sealed boxを使えます 特別なノンス値を渡す必要のある プロトコルの実装も サポートが可能です 今回はシンプルな例を お見せします
ダウンロードしたデータを Representationとして sealed boxに渡します また このboxを開けるには― cipherのopenメソッドを呼ぶだけです
そして鍵を渡します 簡単ですね
次はデジタル署名です デジタル署名は秘密鍵を使った データ認証に使います それを使うと 関連する公開鍵により データを確認できます
デジタル署名による 認証と処理の例をお見せしましょう 2ファクタ認証が必要な時や 他のユーザへの送金など― 注意を要する処理に使用可能です
そのためには― まずデバイスに 秘密鍵を生成します
そして関連する公開鍵を取得
公開鍵はサービスに 登録されています
処理を実行するには 秘密鍵を使って― トランザクションデータに デジタル署名を生成します
そしてserverに データと署名を送信 するとserverは 署名が正しいか確認します もしデジタル署名が正しければ serveが処理に取り掛かるのです
コードを見てみましょう
暗号的に強い秘密鍵を 生成するために― privateKeyイニシャライザを 呼び出します
次はserverへの 公開鍵の登録です まずは公開鍵を取得するために 秘密鍵で公開鍵を呼び出します そして公開鍵から―
取得したいRepresentationを 設定します 複数のRepresentationがあり CryptoKitでは その多くを サポートしています 今回 使うのは compactRepresentationです 秘密鍵はキーチェーンに 保管されています コードはデベロッパのサイトで 入手可能です
署名を作成するには 秘密鍵にsignatureメソッドを 呼び出します そしてトランザクションデータを渡すと 署名を返すのです
また―
それらの処理を保護するこの鍵には 高い価値があります その鍵に 最高の安全性を与えるのが― Secure Enclaveです
このハードウェアべースの key managerは 独立して追加のセキュリティを 供給します Touch IDやFace IDの一部です
Secure Enclaveを 活用するために― 署名を使ったコードを どう発展させるのかお見せします
Secure Enclaveが デバイスで使えるか確認するには SecureEnclaveにisAvailableを 呼び出します
そこからは― 前と同じコードを使用できます Secure Enclave内に― 鍵を生成し デジタル署名を作成するのです そのためにはプレフィックスを 付けるだけです 鍵を生成する privateKeyイニシャライザを呼び出し “SecureEnclave.”を付けます このように 簡単に利用できるのです
Secure Enclaveの利点は 鍵の使用を制限できることです 今回の場合 Secure Enclaveで 生成する鍵は― デバイスのロックを解除した時のみ 使える設定にしました すると その鍵は 他のデバイスで使えません さらに制限したい場合は 秘密鍵で処理をする際に― ユーザの存在を確認する 設定にもできます この設定をすると― ユーザは生体認証を求められます
またはデバイスのパスワードが 必要です
そして 構成した アクセス制限ポリシーを 鍵を生成するイニシャライザに 渡します これでポリシーの施行は完了です ユーザに 認証を求める理由の コンテキストを与えたい場合は LAContextを渡します
今回はLAContextを― 10秒間 有効になるように 設定しました これでユーザは10秒間 再認証を求められません またユーザに認証を求める理由を “ボブに10ドル送金するため”と 設定します
この認証コンテキストを使いたい場合は 鍵のイニシャライザに渡すだけです
最後はパフォーマンスの話です
CoreCryptoの頂点に構築されたのが CryptoKitです CoreCryptoは すべてのシステムフレームワークを 含むライブラリです
Accelerateフレームワークと CPUのデザインチームが アセンブリコードを調整しました 各マイクロアーキテクチャの サイクルを絞ったのです
それに加え CryptoKitは― CoreCryptoの脆弱性を 緩和するのに有効です サイドチャネル攻撃対策などに 使えます またCoreCryptoは FIPS認証取得済みなので FIPSでCryptoKitを使えます このスライドでは 暗号プロトコルと実装における― 幅広いバグのカテゴリーを お見せしました
CryptoKitで 排除できるバグもありますが CryptoKitは 低水準のCrypto APIです 破壊されたプロトコルでも 幅広く実装できます
しかし 暗号化ライブラリで対処できる 欠点は限られるため 高水準のシステムフレームワークに 頼ることをお勧めします
私たちはアプリケーションの 脆弱性を防ぐAPIにより より安全なアプリケーション開発を 支援していきます
CryptoKitの感想が楽しみです このセッションのページに CryptoKitの資料があり Xcode Playgroundでも試せます ダウンロードして しばらく遊んでみてください CryptoKitの活用法が分かります
明日はラボにいるので― 皆さんからの質問や フィードバックをお待ちしています ありがとうございました (拍手)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。