API de chiffrement de bout en bout

Utilisez l'API de chiffrement de bout en bout pour chiffrer les médias envoyés par un serveur de médias depuis votre application.

Important : Dans OpenTok.js 2.27.0+, le chiffrement de bout en bout ne fonctionnera pas lors de la connexion à des clients utilisant une version antérieure d'OpenTok.js. Lorsque vous mettez à jour votre application pour utiliser OpenTok.js 2.27.0+, assurez-vous que tous les clients utilisent OpenTok.js 2.27.0+ si l'application utilise le chiffrement de bout en bout.

Vue d'ensemble

Le chiffrement de bout en bout (ou E2EE) permet aux développeurs d'applications de chiffrer les médias en sessions acheminées de client à client. Pour les sessions relayées, les médias sont déjà cryptés de client à client, par le biais des protocoles WebRTC. Cette fonctionnalité ajoute une couche de chiffrement en chiffrant la charge utile du média au niveau du client, de sorte qu'elle reste chiffrée via le routeur de médias qui achemine le média vers d'autres clients (dans les sessions acheminées). Vous activez le chiffrement de bout en bout lorsque vous créez une session.

Le chiffrement de bout en bout est pris en charge dans les applications web sur les navigateurs basés sur Chromium (Chrome, Opera, Samsung Internet, Edge et Android WebView) et sur WebKit, par exemple Safari sur macOS/iOS, Chrome sur iOS et WebView sur iOS. Le chiffrement de bout en bout n'est pas pris en charge dans les applications web sur Firefox.

La prise en charge des navigateurs basés sur WebKit n'est disponible qu'à partir de la version OpenTok.js 2.30.0.

Le chiffrement de bout en bout est pris en charge dans chacun des SDK clients natifs (pour Android, iOS, Windows, Linux et macOS).

Vous définissez le secret de chiffrement dans une application web utilisant OpenTok.js. Vous devez définir les secrets de chiffrement dans le client web lorsque vous initialisez une session, et vous pouvez modifier les secrets de chiffrement à la volée une fois que la session est connectée. Le secret de chiffrement est une chaîne non vide. Tous les utilisateurs doivent utiliser le même secret pour recevoir des médias intelligibles. Le secret de cryptage est une clé permettant de générer une clé cryptographique utilisée pour crypter et décrypter les médias. Plus précisément, le secret de cryptage génère une clé de cryptage AES-256 à l'aide d'un algorithme AES-CTR avec une clé de 256 bits.

Veuillez noter que le Routeur média n'a pas accès aux supports non chiffrés lors de l'utilisation du chiffrement de bout en bout.

Ainsi, les fonctions qui nécessitent un décodage des médias - telles que l'archivage, la diffusion en direct, le compositeur d'expérience, le connecteur audio et l'interconnexion SIP - ne sont pas prises en charge dans les sessions cryptées de bout en bout. .

Cryptage de bout en bout par codec sur l'ensemble des points d'extrémité

Codec/End-point Chrome Android Chrome iOS Chrome Firefox Safari Edge iOS SDK Android SDK Windows SDK macOS SDK Linux SDK
VP8
H.264
VP9

Ajout d'un chiffrement de bout en bout pour votre Account

Le cryptage de bout en bout est disponible en tant que fonction complémentaire. Vous pouvez l'activer sur votre Page du compte vidéo.

Activation du chiffrement à l'aide de l'API REST

Vous activez le chiffrement de bout en bout lorsque vous créez une session à l'aide de l'API REST. Définissez l'option e2ee à la propriété true.

Voir création d'une session.

Remarque : Avant d'activer le chiffrement de bout en bout pour une session, vous devez l'activer pour votre Account vidéo.

L'exemple Node.js suivant crée une session avec chiffrement de bout en bout :

const Vonage = require('@vonage/server-sdk');

const vonage = new Vonage({
    applicationId: APP_ID,
    privateKey: PRIVATE_KEY_PATH
});

try {
    const session = await vonage.video.createSession({
         mediaMode: "routed",
         e2ee: true, // This will enable end-to-end encryption
    });
} catch(error) {
    console.error("Error creating session: ", error);
}

Mise en œuvre

Setting the encryption secret

End-to-end encrypted sessions are created using server APIs (see Enabling encryption using the REST API). To have a React Native client join an end-to-end encrypted session, set the encryptionSecret prop of the OTSession component:

<OTSession
  applicationId="api-key"
  sessionId="session-id"
  token="token"
  encryptionSecret="initial-encryption-secret"
>
  <OTPublisher />
  <OTSubscriber />
</OTSession>

A valid secret is a string between 8 and 256 characters.

You can change the secret by setting the encryptionSecret prop to a property of the React state and changing its value:

<OTSession
  applicationId="api-key"
  sessionId="session-id"
  token="token"
  encryptionSecret={this.state.encryptionSecret}>
>
  <OTPublisher />
  <OTSubscriber />
</OTSession>

Events and errors

Events and errors are essential to managing the behavior of user-driven encryption behavior. End-to-end encryption uses the shared secret model: everyone in the session is expected to use the same secret to encrypt their media and decrypt everyone else's.

The OTSubscriber error() event handler callback is invoked when the subscriber is unable to decode a stream's media due to a mismatched (or unset) encryption secret:

<OTSubscriber
eventHandlers={{
    error: event => {
    // Show UI notification.
    },
}}
>

The OTSession error() event handler callback is invoked if the client tries to connect to an end-to-end encrypted session that was initialized with an invalid encryption secret (or without specifying an encryption secret). A valid secret is a string between 8 and 256 characters. For the best user experience, the application should catch an invalid user supplied secret before setting the OTSession encryptionSecret prop. In the following example, a session is initialized with an empty (and thus invalid) secret, which causes an error when attempting to connect:

<OTSession
  applicationId="api-key"
  sessionId="session-id"
  token="token"
  encryptionSecret=""
  eventHanders={{
    error: event => {
      // An error event is dispatched if you set an invalid encryption secret
    }
  }}
>
  <OTPublisher />
  <OTSubscriber />
</OTSession>