BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Swift CryptoでApple CryptoKit APIがサーバサイドSwiftでも利用可能に

Swift CryptoでApple CryptoKit APIがサーバサイドSwiftでも利用可能に

原文(投稿日:2020/02/07)へのリンク

Swift Cryptoは、すべてのサポート対象プラットフォーム上で共通の暗号化処理APIを提供することを目的とした、Swiftの新しいオープンソースライブラリだ。macOS上ではAppleのCryptoKitフレームワークを、それ以外のプラットフォームではBoringSSLを使用している。

Swift Cryptoは、Apple CryptoKitの素晴らしいAPIを広くSwiftコミュニティに提供する、Swiftの新しいパッケージです。これによってSwift開発者は、アプリケーションをデプロイするプラットフォームに関係なく、暗号処理の共通セットとして、これらのAPIにアクセスできるようになります。

正確性とともにSwift Cryptoの大きな目標となっているのが、つかいやすさと、暗号化関数を使う場合に陥りやすい落とし穴の回避である。例えばこれは、AES GCM(PDF)を使用してデータを暗号化する方法を示したものだ。

func encrypt(input: [UInt8]) throws -> Data {
    let key = SymmetricKey(size: .bits256)
    let sealedBox = try AES.GCM.seal(input, using: key)
    return sealedBox.combined!
}

この構文は、CryptoKitにほぼ準じている。AppleのエンジニアであるCory Benfield氏が言うように、このコードは極めて簡単であるだけでなく、使い捨て乱数(random nonce)や暗号文認証(ciphertext authentication)の正しい使用を保障するという意味もある。同一ナンスの使用は攻撃者による容易な暗号文偽造を可能にするため、これはAES GCMでは非常に重要なものだ。Benfield氏によると、他の暗号化ライブラリで、不正利用に対してこれと同じレベルのセーフガードを提供しているものは存在しない。

正しい方法で簡単に使用可能である、という目標の直接的な帰結として、Swift Cryptoでは、多数の暗号化プリミティブのサポートを目標とはしていない。開発者にとってそれは、適切なプリミティブの選択を難しくするという意味でしかないからだ。さらに、ライブラリに対して何らかの追加を決定する場合には、それと同等で、より安全な、あるいはより広く使用されているプリミティブがすでに存在するかどうか、という点が重要な基準になる。

Swift Cryptoのもうひとつの大きな目標は、サポート対象の全プラットフォームで同じ結果が得られるという保障をすることだ。これは簡単ではない。前述のようにSwift Cryptoでは、ホストプラットフォームによって2つの異なる暗号化プリミティブの実装を基盤として使用しているからだ。この目的のためにSwift Cryptoは、テストスイートを公開して、BoringSSLベースの実装でもCryptoKitベースの実装と同じ結果を得られることを保障している。Benfield氏によると、これは非常に多くの労力を要するもので、いくつかのアルゴリズについては完全に新しい実装が必要になるが、今後も継続していく予定である、ということだ。

Swift CryptoはCryptoKit APIに準拠しているが、部分的な実装のみである点には注意が必要だ。具体的には、AppleのSecure Enclaveのように、Appleのプラットフォームでのみ使用可能な特殊なハードウェアが必要なプリミティブは含まれていない。

Swift Cryptoの使用にはSwift 5.1が必要で、Swift Package Managerを使ってインストールすることができる。

この記事に星をつける

おすすめ度
スタイル

BT