Cifrado de extremo a extremo

Notas importantes:

  • En OpenTok.js 2.27.0+, el cifrado de extremo a extremo no funcionará cuando se conecte a clientes que utilicen una versión anterior de OpenTok.js. Cuando actualices tu aplicación para utilizar OpenTok.js 2.27.0+, asegúrate de que todos los clientes utilizan OpenTok.js 2.27.0+ si la aplicación utiliza cifrado de extremo a extremo.
  • El cifrado de extremo a extremo compatible con los navegadores basados en WebKit, como Safari en macOS/iOS y Chrome en iOS, solo está disponible a partir de la versión 2.30.0 de OpenTok.js.

Este tema incluye información detallada sobre el uso del cifrado de extremo a extremo en el Client SDK de OpenTok.js Vonage Video:

Para obtener una visión general del cifrado de extremo a extremo, consulta este tema.

Nota sobre las políticas de seguridad de contenidos (CSP)

Si el script-src asegúrese de que 'wasm-unsafe-eval' está especificado. De lo contrario, WebAssembly, necesario para el cifrado de extremo a extremo, no podrá cargarse ni ejecutarse en la página.

Inicialización de una sesión con una clave secreta

Las sesiones cifradas de extremo a extremo se crean mediante las API del servidor (véase Activación del cifrado mediante la API REST). Para que un cliente web se una a una sesión cifrada de extremo a extremo, especifique un secreto de cifrado al llamar a la función OT.initSession() método:

const session = OT.initSession(
  'api-key',
  'session-id',
  {
    encryptionSecret: 'initialEncryptionSecret'
  }
});

Una clave válida es una cadena de entre 8 y 256 caracteres. La clave se puede cambiar posteriormente con el Session.setEncryptionSecret() (véase Cambiar la contraseña, más abajo).

Comprobar si el navegador es compatible con el cifrado de extremo a extremo

Utiliza el OT.hasEndToEndEncryptionSupport() Método para comprobar si el navegador del cliente admite el cifrado de extremo a extremo:

if (OT.hasEndToEndEncryptionSupport()) {
  // Proceed with connecting to the session
}
else {
  // Notify the user that they cannot join the session
}

Cambiar la contraseña

Puede cambiar el secreto utilizando la opción Session.setEncryptionSecret() después de que la sesión se haya conectado:

await session.setEncryptionSecret('newEncryptionSecret');

Sucesos y errores

Los eventos y errores son esenciales para gestionar el comportamiento del cifrado dirigido por el usuario. El cifrado de extremo a extremo utiliza el modelo de secreto compartido: se espera que todos los participantes en la sesión utilicen el mismo secreto para cifrar sus medios y descifrar los de los demás.

Un objeto «Subscriber» envía un encryptionSecretMismatch situación en la que el suscriptor no puede descodificar el contenido multimedia de una transmisión. Es importante comunicar al usuario que no se está recibiendo el contenido multimedia debido a una incompatibilidad de cifrado y no a un fallo de conexión o a un error de audio o vídeo:

subscriber.on('encryptionSecretMismatch', () => {
  // Activate a UI element communicating that there's been an encryption secret mismatch.
});

Además, es importante informar a los usuarios de que el cifrado se ha activado correctamente. Un objeto «Subscriber» envía un encryptionSecretMatch situación en la que el suscriptor es capaz de descodificar el contenido multimedia de la transmisión tras una incompatibilidad previa.

subscriber.on('encryptionSecretMatch', () => {
  // Activate a UI element communicating that the media is being properly decrypted.
});

El Session.connect() La función de devolución de llamada se activa con un error si el cliente intenta conectarse a una sesión cifrada de extremo a extremo que se haya inicializado con un secreto de cifrado no válido. Un secreto válido es una cadena de entre 8 y 256 caracteres. Para garantizar la mejor experiencia de usuario, la aplicación debe detectar un secreto no válido facilitado por el usuario antes de llamar a laOT.initSession() método. En el siguiente ejemplo, se inicializa una sesión con un secreto vacío (y por tanto inválido), lo que provoca un error al intentar conectarse:

const session = OT.initSession(
 'api-key',
 'e2ee-session-id',
 {
   encryptionSecret: '',
 }
)

session.connect('token', (error) => {
  if (error && error.name === 'OT_INVALID_ENCRYPTION_SECRET') {
    /*
    The application should communicate that the secret was invalid.
    */
  }
});

El Session.connect() La función de devolución de llamada se activa con un error si un usuario intenta conectarse a una sesión cifrada de extremo a extremo en un navegador que no admite el cifrado de extremo a extremo.

const session = OT.initSession(
 'api-key',
 'e2ee-session-id',
 {
   encryptionSecret: 'validEncryptionSecret',
 }
)

session.connect('token', (error) => {
  if (error && error.name === 'OT_UNSUPPORTED_BROWSER') {
    /*
    The error will have the message 'Tried to connect an e2ee session but the browser does not support e2ee'
    The application should communicate that the browser does not support encryption.
    */
  }
});

Si un usuario intenta publicar en una sesión cifrada de extremo a extremo sin haber especificado un secreto de cifrado, el Session.publish() La función de devolución de llamada se invoca con un error. Para garantizar la mejor experiencia de usuario, la aplicación debería validar el secreto facilitado por el usuario antes de llamar a la session.publish() método:

session.publish(publisher, (error) => {
  if (error && error.name === 'OT_STREAM_CREATE_FAILED') {
    /*
    The error will have the message 'Tried to publish to an e2ee session but encryption secret was not set'
    The application should communicate that the secret was not set.
    */
  }
});

Si un usuario intenta suscribirse en una sesión cifrada de extremo a extremo sin haber especificado un secreto de cifrado, el Session.subscribe() La función de devolución de llamada se invoca con un error. Para garantizar la mejor experiencia de usuario, la aplicación debería validar el secreto facilitado por el usuario antes de llamar a la Session.subscribe() método:

subscriber = session.subscribe(stream, target, opts, (error) => {
  if (error && error.name === 'OT_UNABLE_TO_SUBSCRIBE') {
    /*
    The error will have the message 'Tried to subscribe to an e2ee stream but encryption secret was not set'
    The application should communicate that the secret was not set.
    */
  }
});