【Swift】CryptoKitフレームワークの使い方!データの暗号化・複合化

この記事からわかること
- SwiftのCryptoKitフレームワークの使い方
- データを暗号化・複合化する方法
- セキュリティ対策
- AES.GCM.SealedBox型とは?
- SymmetricKeyを永続化する方法
index
[open]
\ アプリをリリースしました /
環境
- Xcode:15.0.1
- iOS:17.1
- Swift:5.9
- macOS:Sonoma 14.1
暗号化や複合化、ハッシュ化の種類や仕組み自体についてはCryptoSwift
の記事でまとめてありますのでそちらを参考にしてください。CryptoSwift
はCryptoKit
と同じような機能を提供するライブラリです。
CryptoKitフレームワークとは?
CryptoKit
はAppleが提供する暗号化および暗号関連の操作を実行するためのフレームワークです。
暗号化する
CryptoKit
で「共通鍵暗号方式」のAES-GCM方式で暗号化し、Base64エンコードされた文字列として返す処理を実装してみます。
「鍵(SymmetricKey)」の生成
暗号化・復号化を行うためには必要な鍵はSymmetricKey
型で用意します。SymmetricKey
は共通鍵暗号方式で使用される鍵を表すSwiftの構造体です。
引数size
に指定するのは鍵のビットサイズです。鍵のサイズは大きいほどセキュリティが高まりますが、処理が重くなるので注意が必要です。
ここで生成する鍵は生成するごとに別の値になってしまうのでアプリ内で使用する場合は生成した鍵をローカルに保存して永続化しておく必要があります。永続化しておかないと暗号化したものを2度と複合化できなくなってしまうので注意してください。
暗号化:AES.GCM.sealメソッド
実際に暗号化を行なっているのはAES.GCM.seal
メソッドです。seal
メソッドは、与えられたデータと暗号化キーを使用してデータを暗号化し、結果としてAES.GCM.SealedBox
構造体を返します。
AES.GCM.SealedBox
型は暗号化されたデータとそれに関連する認証タグを含むデータオブジェクトです。combined
プロパティから暗号化されたデータとその認証タグを含む単一のバイト配列を取得できます。
暗号化された値を文字列に変換する
バイト配列を取得できたら扱いやすいように文字列に変換していきます。そのためにはData型に変換した後、Base64でエンコードして、String型まで変換していきます。
公式リファレンス:base64EncodedDataメソッド
Base64とは?
Base64とはバイナリデータをテキスト形式に変換するためのエンコーディング手法の1つです。A-Z
、a-z
、0-9
、+/
の64種類で文字を表します。
(※正確には=
がパディング(余った部分を詰める用)として使用されるので65種類)
例えばHello World
を先ほどの共通鍵と初期化ベクトルで暗号化してBase64の文字列に変換すると以下の様になります。
複合化する
CryptoKit
で「共通鍵暗号方式」のAES-GCM方式で暗号化されたデータを複合化するには暗号化で実装した流れとは逆のことを行っていきます。また使用する鍵とは同じものを使用してください。
鍵を永続化する
SymmetricKey
は永続化しておかないと暗号化・複合化をできなくなってしまうので永続化された鍵がない場合のみ鍵を新規で生成するような実装にする必要があります。本当はKeyChainなどに保存するのが正しいですがUserDefaults
で簡単に実装する場合は以下のようになります。
実装サンプル
SwiftUIで使用する場合の全体コードを載せておきます。
Androidで暗号化・複合化を実装する
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。