エンド・ツー・エンドの暗号化

このトピックでは、Vonage VideoのiOS用Swift Client SDKにおけるエンドツーエンド暗号化の使用方法について詳しく説明しています:

エンドツーエンド暗号化の概要については、以下を参照してください。 本題.

暗号化シークレットの設定

エンドツーエンド暗号化されたセッションは、サーバーAPIを使用して作成されます(参照: REST APIを使用して暗号化を有効にする).

クライアントがパブリッシュまたはサブスクライブする前に Session.setEncryptionSecret() メソッドを使用する:

var error: OTError?
session.setEncryptionSecret("encryption-secret", error: &error)
if (error)
{
    // Notify the user.
}

有効な秘密は8文字以上256文字以下の文字列である。シークレットを変更するには Session.setEncryptionSecret() メソッドをもう一度。

無効なシークレットを設定すると InvalidEncryptionSecret エラー。

イベントとエラー

イベントとエラーは、ユーザー主導の暗号化の動作を管理するために不可欠である。エンドツーエンドの暗号化は、共有秘密モデルを使用します。セッション内の全員が、自分のメディアを暗号化し、他の全員のメディアを復号化するために、同じ秘密を使用することが期待されています。

クライアントがエンドツーエンドで暗号化されたセッションに接続しようとし、接続前に暗号化シークレットを設定しなかった場合、次のコードが設定されたエラーが発生する。 EncryptionSecretMissing:

var error: OTError?
session.connect(withToken: token, error: &error)
if (error && (error.code ==EncryptionSecretMissing))
{
    // Notify the user of the error connecting.
}

暗号化シークレットを指定せずにエンドツーエンドで暗号化されたセッションを公開しようとした場合、次のように呼び出す。 [OTSession publish:error:] メソッドの結果は、エラーコードが EncryptionSecretMissing.最高のユーザーエクスペリエンスのために、アプリケーションは公開前にユーザーが提供した秘密を検証すべきである:

var error: OTError?
session.publish(publisher, error: &error)
if (error && (error.code == EncryptionSecretMissing))
{
    // The application should communicate that the secret was not set.
}

不正確な暗号化シークレットのために、加入者がストリームのメディアをデコードできない場合は [OTSubscriberKitDelegate subscriber:didFailWithError:] メッセージが送信される。 ErrorCode.EncryptionSecretMismatch.メディアを受信できないのは、暗号化の不一致によるものであり、接続障害やオーディオ/ビデオの問題ではないことをユーザーに伝えることが重要です:

// Implementation of [OTSubscriberKitDelegate subscriber:didFailWithError:]:
func subscriber(_ subscriber: OTSubscriberKit, didFailWithError error: OTError) {
	if (error.code == EncryptionSecretMismatch) {
    // Activate a UI element communicating that there's been an encryption secret mismatch.
	}
}

var error: OTError?
session.subscribe(subscriber!, error: &error)
// ...

サブスクライバーがパケットを復号化する際に内部エラーが発生した場合 [OTSubscriberKitDelegate subscriber:didFailWithError:] メッセージが送信される。 OTSubscriberDecryptionInternalError.