Important Notes
- No OpenTok.js 2.27.0 ou superior, a criptografia de ponta a ponta não funcionará ao se conectar a clientes que utilizam uma versão anterior do OpenTok.js. Ao atualizar seu aplicativo para usar o OpenTok.js 2.27.0 ou superior, certifique-se de que todos os clientes estejam usando o OpenTok.js 2.27.0 ou superior, caso o aplicativo utilize criptografia de ponta a ponta.
- O suporte à criptografia de ponta a ponta em navegadores baseados no WebKit, como o Safari no macOS/iOS e o Chrome no iOS, só está disponível a partir da versão 2.30.0 do OpenTok.js.
Note about Content Security Policies (CSP)
Se o script-src Se essa diretiva estiver definida, certifique-se de que 'wasm-unsafe-eval' for especificado. Caso contrário, o WebAssembly, necessário para a criptografia de ponta a ponta, será impedido de ser carregado e executado na página.
Initializing a session with a secret
As sessões com criptografia de ponta a ponta são criadas por meio de APIs do servidor (consulte “Ativando a criptografia usando o API REST). Para que um cliente web participe de uma sessão criptografada de ponta a ponta, especifique um segredo de criptografia ao chamar o OT.initSession() método:
const session = OT.initSession('api-key', 'session-id', {
encryptionSecret: 'initialEncryptionSecret',
});
Um segredo válido é uma sequência de caracteres com comprimento entre 8 e 256 caracteres. O segredo pode ser alterado posteriormente com o Session.setEncryptionSecret() método (consulte Alteração do segredo, abaixo).
Checking whether the browser supports end-to-end encryption
Use o OT.hasEndToEndEncryptionSupport() método para verificar se o navegador do cliente suporta criptografia de ponta a ponta:
if (OT.hasEndToEndEncryptionSupport()) {
// Proceed with connecting to the session
}
else {
// Notify the user that they cannot join the session
}
Atualmente, a criptografia de ponta a ponta não é compatível com o Firefox.
Changing the secret
Você pode alterar o segredo usando o Session.setEncryptionSecret() método após a conexão da sessão:
await session.setEncryptionSecret('newEncryptionSecret');
Events and errors
Eventos e erros são essenciais para gerenciar o comportamento da criptografia orientada pelo usuário. A criptografia de ponta a ponta utiliza o modelo de segredo compartilhado: espera-se que todos os participantes da sessão utilizem o mesmo segredo para criptografar seus dados e descriptografar os dados dos demais participantes.
Um objeto Subscriber despacha um encryptionSecretMismatch situação em que o assinante não consegue decodificar a mídia de um stream. É importante informar ao usuário que a mídia não está sendo recebida devido a uma incompatibilidade de criptografia e não por causa de uma falha na conexão ou de um problema de áudio/vídeo:
subscriber.on('encryptionSecretMismatch', () => {
// Activate a UI element communicating that there's been an encryption secret mismatch.
});
Além disso, é importante informar aos usuários que a criptografia foi ativada com sucesso. Um objeto `Subscriber` dispara um evento `encryptionSecretMatch` quando o assinante consegue decodificar a mídia do fluxo após uma incompatibilidade anterior.
Além disso, é importante informar aos usuários que a criptografia foi ativada com sucesso. Um objeto `Subscriber` dispara um evento `encryptionSecretMatch` quando o assinante consegue decodificar a mídia do fluxo após uma incompatibilidade anterior.
subscriber.on('encryptionSecretMatch', () => {
// Activate a UI element communicating that the media is being properly decrypted.
});
O Session.connect() A função de retorno é chamada com um erro se o cliente tentar se conectar a uma sessão criptografada de ponta a ponta que tenha sido inicializada com um segredo de criptografia inválido. Um segredo válido é uma sequência de caracteres com comprimento entre 8 e 256 caracteres. Para garantir a melhor experiência do usuário, o aplicativo deve detectar um segredo inválido fornecido pelo usuário antes de chamar a OT.initSession() método. No exemplo a seguir, uma sessão é inicializada com um segredo vazio (e, portanto, inválido), o que gera um erro ao tentar se conectar:
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.
*/
}
});
O Session.connect() A função de retorno é chamada com um erro se um usuário tentar se conectar a uma sessão criptografada de ponta a ponta em um navegador que não ofereça suporte à criptografia de ponta a ponta.
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.
*/
}
});
Se um usuário tentar publicar em uma sessão criptografada de ponta a ponta sem ter especificado um segredo de criptografia, o Session.publish() A função de retorno é chamada com um erro. Para garantir a melhor experiência do usuário, o aplicativo deve validar o segredo fornecido pelo usuário antes de chamar a 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.
*/
}
});
Se um usuário tentar se inscrever em uma sessão criptografada de ponta a ponta sem ter especificado um segredo de criptografia, o Session.subscribe() A função de retorno é chamada com um erro. Para garantir a melhor experiência do usuário, o aplicativo deve validar o segredo fornecido pelo usuário antes de chamar a 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.
*/
}
});