Escolar Documentos
Profissional Documentos
Cultura Documentos
Até agora, todas as APIs que você viu foram executadas em servidores nos confins
seguros de um datacenter ou sala de servidores. É fácil subestimar a segurança fí-
sica do hardware da API, porque o datacenter é um ambiente seguro com acesso
restrito e fechaduras decentes nas portas. Freqüentemente, apenas funcionários
especialmente controlados têm permissão para entrar na sala do servidor para se
aproximar do hardware. Tradicionalmente, até mesmo os clientes de uma API po-
deriam ser considerados razoavelmente seguros porque eram PCs instalados em
um ambiente de escritório. Isso mudou rapidamente quando os primeiros laptops
e depois os smartphones levaram os clientes de API para fora do escritóriomeio
Ambiente. A internet das coisas (IoT) amplia ainda mais a gama de ambientes, es-
pecialmente em ambientes industriais ou agrícolas, onde os dispositivos podem
ser implantados em ambientes remotos com pouca proteção física ou monitora-
mento. Esses dispositivos IoT conversam com APIs em serviços de mensagens
para transmitir dados do sensor para a nuvem e fornecem APIs próprias para per-
mitir que ações físicas sejam realizadas, como ajustar máquinas em uma estação
de tratamento de água ou desligar as luzes em sua casa ou escritório. Neste capí-
tulo, você verá como proteger as comunicações dos dispositivos IoT ao conversar
entre si e com APIs na nuvem. No capítulo 13, discutiremos como proteger APIs
fornecidas pelos próprios dispositivos.
DEFINIÇÃO A internet das coisas (IoT) é a tendência dos dispositivos serem co-
nectados à internet para facilitar o gerenciamento e a comunicação. IoT do consu-
midorrefere-se a dispositivos pessoais em casa conectados à internet, como uma
geladeira que automaticamente pede mais cerveja quando você está acabando. As
técnicas de IoT também são aplicadas na indústria sob o nomeIoT industrial(IIoT).
Figura 12.1 Mensagens de dispositivos IoT geralmente são traduzidas de um pro-
tocolo para outro. O dispositivo original pode usar redes sem fio de baixa potên-
cia, como Bluetooth Low-Energy (BLE), para se comunicar com um gateway local
que retransmite mensagens usando protocolos de aplicativos, como MQTT ou
HTTP.
TLS é projetado para proteger o tráfego enviado por TCP (Transmission Control
Protocol), que é um protocolo orientado a fluxo confiável. A maioria dos protoco-
los de aplicativos de uso comum, como HTTP, LDAP ou SMTP (e-mail), todos usam
TCP e, portanto, podem usar TLS para proteger a conexão. Mas uma implementa-
ção de TCP tem algumas desvantagens quando usada em dispositivos IoT restritos,
como os seguintes:
Uma implementação TCP é complexa e requer muito código para ser imple-
mentada corretamente. Este código ocupa um espaço precioso no dispositivo,
reduzindo a quantidade de código disponível para implementar outras funções.
Os recursos de confiabilidade do TCP exigem que o dispositivo de envio arma-
zene mensagens em buffer até que sejam confirmadas pelo receptor, o que au-
menta os requisitos de armazenamento. Muitos sensores IoT produzem fluxos
contínuos de dados em tempo real, para os quais não faz sentido retransmitir
mensagens perdidas porque dados mais recentes já as terão substituído.
Um cabeçalho TCP padrão tem pelo menos 16 bytes de comprimento, o que
pode adicionar bastante sobrecarga às mensagens curtas.
O TCP não pode usar recursos como entrega multicastque permitem que uma
única mensagem seja enviada para vários dispositivos ao mesmo tempo. Multi-
cast pode ser muito mais eficiente do que enviar mensagens para cada disposi-
tivo individualmente.
Os dispositivos IoT geralmente se colocam no modo de suspensão para preser-
var a energia da bateria quando não estão em uso. Isso faz com que as cone-
xões TCP sejam encerradas e requer que um handshake TCP caro seja execu-
tado para restabelecer a conexão quando o dispositivo for ativado. Como alter-
nativa, o dispositivo pode enviar periodicamente mensagens de manutenção de
atividade para manter a conexão aberta, ao custo de maior uso de bateria e lar-
gura de banda.
Muitos protocolos usados na IoT, em vez disso, optam por construir sobre o proto-
colo de datagrama do usuário de nível inferior(UDP), que é muito mais simples
que o TCP, mas fornece apenas entrega de mensagens sem conexão e não confiá-
vel. Por exemplo, o Protocolo de Aplicação Restrita(CoAP), fornece uma alterna-
tiva ao HTTP para dispositivos restritos e é baseado em UDP. Para proteger esses
protocolos, foi desenvolvida uma variação do TLS conhecida como Datagram TLS
(DTLS). 1
Versões DTLS recentes correspondem a versões TLS; por exemplo, DTLS 1.2 cor-
responde a TLS 1.2 e oferece suporte a conjuntos de cifras e extensões semelhan-
tes. No momento em que escrevo, o DTLS 1.3 está sendo finalizado, o que corres-
ponde ao recém-padronizado TLS 1.3.
QUIC
Um meio-termo entre TCP e UDP é fornecido porO protocolo QUIC do Google (co-
nexões UDP rápidas com a Internet; https://en.wikipedia.org/wiki/QUIC ), que for-
mará a base da próxima versão do HTTP: HTTP/3. Camadas QUIC em cima de UDP,
mas fornece muitos dos mesmos recursos de controle de congestionamento e con-
fiabilidade que o TCP. Um recurso importante do QUIC é que ele integra o TLS 1.3
diretamente no protocolo de transporte, reduzindo a sobrecarga do handshake
TLS e garantindo que os recursos do protocolo de baixo nível também se benefi-
ciem das proteções de segurança. O Google já implantou o QUIC em produção e
cerca de 7% do tráfego da Internet agora usa o protocolo.
NOTA Os exemplos de código neste capítulo continuam a usar Java para consis-
tência. Embora Java seja uma escolha popular em dispositivos e gateways IoT
mais capazes, a programação de dispositivos restritos é mais frequentemente rea-
lizada em C ou outra linguagem com suporte a dispositivos de baixo nível. O con-
selho sobre configuração segura de DTLS e outros protocolos neste capítulo é apli-
cável a todos os idiomas e bibliotecas DTLS. Pule para a seção 12.1.2 se você não
estiver usando Java.
IMPLEMENTANDO UM CLIENTE DTLS
Uma matriz de KeyManager objetos, que são usados ao executar autenticação
de certificado de cliente (abordado no capítulo 11). Como este exemplo não usa
certificados de cliente, você pode deixar nulo.
A matriz de TrustManager objetos obtidos do TrustManagerFactory .
Um opcional SecureRandom objeto a ser usado ao gerar material de chave alea-
tório e outros dados durante o handshake TLS. Você pode deixar isso null na
maioria dos casos para permitir que o Java escolha um padrão sensato.
pacote com.manning.apisecurityinaction;
importar javax.net.ssl.*;
importar java.io.FileInputStream;
importar java.nio.file.*;
importar java.security.KeyStore;
importar org.slf4j.*;
importar estático java.nio.charset.StandardCharsets.UTF_8;
sslContext.init(nulo, trustManagerFactory.getTrustManagers(), ❹
nulo); ❹
return sslContext;
}
}
NOTA Você não precisa digitar neste exemplo (e os outros SSLEngine exemplos),
porque forneci uma classe wrapper que oculta parte dessa complexidade e de-
monstra o uso correto do SSLEngine . Veja http://mng.bz/Mo27 . Você usará essa
classe no exemplo de cliente e servidor em breve.
Em seguida, você deve alocar buffers para enviar e receber pacotes de rede e para
manter os dados do aplicativo. o SSLSession associado a um mecanismo tem mé-
todos que fornecem dicas para o tamanho correto desses buffers, que você pode
consultar para garantir a alocação de espaço suficiente, conforme mostrado no
código de exemplo a seguir (novamente, você não precisa digitar isso):
var sessão = mecanismo.getSession(); ❶
var receiveBuffer = ❷
ByteBuffer.allocate(session.getPacketBufferSize()); ❷
var sendBuffer = ❷
ByteBuffer.allocate(session.getPacketBufferSize()); ❷
var applicationData = ❷
ByteBuffer.allocate(session.getApplicationBufferSize()); ❷
Esses tamanhos de buffer iniciais são dicas e o mecanismo informará se eles pre-
cisam ser redimensionados, como você verá em breve. Os dados são movidos en-
tre os buffers usando as duas chamadas de método a seguir, também ilustradas
na figura 12.2:
NEED_UNWRAP indica que o mecanismo está esperando para receber uma nova
mensagem do servidor. O código do seu aplicativo deve chamar o
receive() métodoem seu UDP DatagramChannel para receber um pacote do
servidor e, em seguida, chamar o SSLEngine.unwrap() métodopassando os
dados que recebeu.
NEED_UNWRAP_AGAIN indica que há entrada restante que ainda precisa ser
processada. Você deve chamar imediatamente o unwrap() métodonovamente
com um buffer de entrada vazio para processar a mensagem. Isso pode aconte-
cer se vários registros DTLS chegarem em um único pacote UDP.
NEED_WRAP indica que o mecanismo precisa enviar uma mensagem ao servi-
dor. A aplicação deve chamar o wrap() métodocom um buffer de saída que
será preenchido com a nova mensagem DTLS, que seu aplicativo deve enviar
para o servidor.
NEED_TASK indica que o mecanismo precisa executar algum processamento
(potencialmente caro), como executar operações criptográficas. Você pode cha-
mar o getDelegatedTask() métodono mecanismo para obter um ou mais
Runnable objetos para executar. O método retorna nulo quando não há mais
tarefas a serem executadas. Você pode executá-los imediatamente ou pode exe-
cutá-los usando um pool de threads em segundo plano se não quiser bloquear
seu thread principal enquanto eles são concluídos.
FINISHED indica que o aperto de mão acabou de terminar,
enquanto NOT_HANDSHAKING indica que nenhum handshake está em anda-
mento (já terminou ou não foi iniciado). o FINISHED estadoé gerado apenas
uma vez pela última chamada para wrap() ou unwrap () e, em seguida, o me-
canismo produzirá um NOT_HANDSHAKING status.
Figura 12.3 A máquina de estado de handshake SSLEngine envolve quatro estados
principais. Nos estados NEED_UNWRAP e NEED_UNWRAP_AGAIN , você deve usar a
unwrap() chamada para fornecer os dados de rede recebidos. O NEED_WRAP es-
tado indica que novos pacotes DTLS devem ser recuperados com a wrap() cha-
mada e então enviados para a outra parte. O NEED_TASK estado é usado quando o
mecanismo precisa executar funções criptográficas caras.
engine.beginHandshake(); ❶
❹ No estado NEED_UNWRAP, você deve aguardar um pacote de rede, caso ainda não
tenha sido recebido.
OBSERVAÇÃO Você não poderá usar esse cliente até escrever o servidor para
acompanhá-lo na próxima seção.
Linha de corda;
while ((line = in.readLine()) != null) { ❹
logger.info("Enviando pacote ao servidor: {}", linha); ❹
canal.send(line.getBytes(UTF_8)); ❹
}
while (!sslEngine.isInboundDone()) { ❸
channel.receive(recvBuf); ❸
sslEngine.unwrap(recvBuf.flip(), appData); ❸
recvBuf.compact(); ❸
}
sslEngine.closeInbound(); ❹
canal.close(); ❹
}
❹ Indique que o lado de entrada também está pronto e feche o canal UDP.
importar java.io.FileInputStream;
importar java.nio.ByteBuffer;
importar java.security.KeyStore;
importar javax.net.ssl.*;
importar org.slf4j.*;
Neste exemplo, o servidor estará rodando em localhost, então use mkcert para
gerar um par de chaves e um certificado assinado, se ainda não tiver um, execu-
tando 2
na pasta raiz do projeto. Você pode então implementar o servidor DTLS conforme
mostrado na Listagem 12.6. Assim como no exemplo do cliente, você pode usar a
DtlsDatagramChannel classepara simplificar o aperto de mão. Nos bastidores,
ocorrerá o mesmo processo de aperto de mão, mas a ordem
de wrap () e unwrap () as operações serão diferentes devido aos diferentes pa-
péis desempenhados no aperto de mão. Abra o arquivo DtlsServer.java que você
criou anteriormente e adicione o main método mostrado na listagem.
enquanto (verdadeiro) {
canal.receber(buffer); ❸
buffer.flip();
var data = UTF_8.decode(buffer).toString(); ❹
logger.info("Recebido: {}", dados); ❹
buffer.compact();
}
}
}
Isso produzirá muitas linhas de saída à medida que compila e executa o código.
Você verá a seguinte linha de saída assim que o servidor for inicializado e estiver
ouvindo pacotes UDP dos clientes:
[com.manning.apisecurityinaction.DtlsServer.main()] INFO
➥ com.manning.apisecurityinaction.DtlsServer - Escutando na porta
➥ 54321
DICA Se você quiser ver os detalhes das mensagens do protocolo DTLS sendo en-
viadas entre o cliente e o servidor, adicione o argumento -
Djavax.net.debug=all à linha de comando do Maven. Isso produzirá um regis-
tro detalhado das mensagens de handshake.
Devido à natureza não confiável dos protocolos baseados em UDP, o DTLS exige
que os números de sequência de registro sejam explicitamente adicionados a to-
dos os pacotes para que os pacotes retransmitidos ou reordenados possam ser de-
tectados e manipulados. Combinado com o fato de que o DTLS é mais tolerante
com pacotes duplicados, isso torna mais provável a reutilização acidental de bugs
nonce em aplicativos DTLS usando AES GCM. Portanto, você deve preferir conjun-
tos de cifras alternativos ao usar DTLS, como os discutidos nesta seção. Na seção
12.3.3, você aprenderá sobre algoritmos de criptografia autenticados que podem
ser usados em seu aplicativo e que são mais robustos contra a reutilização de
nonce.
A Figura 12.4 mostra uma visão geral dos componentes de software e algoritmos
necessários para dar suporte a um conjunto de conjuntos de cifras TLS comu-
mente usados para conexões da Web. O TLS suporta uma variedade de algoritmos
de troca de chaves usados durante o handshake inicial, cada um dos quais precisa
de diferentes primitivas criptográficas para serem implementadas. Alguns deles
também exigem a implementação de assinaturas digitais, novamente com várias
opções de algoritmos. Alguns algoritmos de assinatura suportam diferentes parâ-
metros de grupo, como curvas elípticas usadas para assinaturas ECDSA, que re-
querem código adicional. Após a conclusão do handshake, há várias opções de
modos de cifra e algoritmos MAC para proteger os dados do aplicativo. A própria
autenticação de certificado X.509 requer código adicional. Isso pode adicionar
uma quantidade significativa de código para incluir em um dispositivo restrito.
Figura 12.4 Uma seção transversal de algoritmos e componentes que devem ser
implementados para oferecer suporte a conexões da Web TLS comuns. Algoritmos
de troca de chaves e assinatura são usados durante o handshake inicial e, em se-
guida, modos de cifra e MACs são usados para proteger os dados do aplicativo as-
sim que uma sessão é estabelecida. Os certificados X.509 exigem muito código
complexo para análise, validação e verificação de certificados revogados.
Por esses motivos, outros conjuntos de cifras costumam ser populares em aplicati-
vos de IoT. Como uma alternativa para encaminhar conjuntos de cifras secretas,
existem conjuntos de cifras mais antigos baseados em criptografia RSA ou acordo
de chave Diffie-Hellman estático (ou a variante de curva elíptica, ECDH). Infeliz-
mente, ambas as famílias de algoritmos têm deficiências de segurança significati-
vas, não diretamente relacionadas à falta de sigilo de encaminhamento. A troca
de chaves RSA usa um modo antigo de criptografia (conhecido como PKCS#1 ver-
são 1.5) que é muito difícil de implementar com segurança e resultou em muitas
vulnerabilidades nas implementações de TLS. O acordo de chave ECDH estático
tem seus próprios pontos fracos de segurança em potencial, como ataques de
curva inválidosque pode revelar a chave privada de longo prazo do servidor; ra-
ramente é implementado. Por esses motivos, você deve preferir encaminhar con-
juntos de cifras secretas sempre que possível, pois eles fornecem melhor proteção
contra vulnerabilidades criptográficas comuns. O TLS 1.3 removeu completa-
mente esses modos mais antigos devido à sua insegurança.
DEFINIÇÃO Um ataque de curva inválidaé um ataque a chaves criptográficas
de curva elíptica. Um invasor envia à vítima uma chave pública em uma curva
elíptica diferente (mas relacionada) à chave privada da vítima. Se a biblioteca TLS
da vítima não validar a chave pública recebida com cuidado, o resultado pode va-
zar informações sobre a chave privada. Embora conjuntos de cifras ECDH efême-
ros (aqueles com ECDHE no nome) também sejam vulneráveis a ataques de curva
inválida, eles são muito mais difíceis de explorar porque cada chave privada é
usada apenas uma vez.
Mesmo se você usar um conjunto de cifras mais antigo, é necessária uma imple-
mentação de DTLS para incluir suporte a assinaturas para validar os certificados
apresentados pelo servidor (e opcionalmente pelo cliente) durante o handshake.
Uma extensão para TLS e DTLS permite que os certificados sejam substituídos por
chaves públicas brutas( https://tools.ietf.org/html/rfc7250 ). Isso permite que a
análise complexa do certificado e o código de validação sejam eliminados, junta-
mente com o suporte para muitos algoritmos de assinatura, resultando em uma
grande redução no tamanho do código. A desvantagem é que as chaves devem ser
distribuídas manualmente para todos os dispositivos, mas isso pode ser uma
abordagem viável em alguns ambientes. Outra alternativa é usar chaves pré-com-
partilhadas, sobre o qual você aprenderá mais na seção 12.2.
DEFINIÇÃO Chaves públicas brutaspode ser usado para eliminar o código com-
plexo necessário para analisar e verificar certificados X.509 e verificar assinatu-
ras nesses certificados. Uma chave pública bruta deve ser distribuída manual-
mente aos dispositivos em um canal seguro (por exemplo, durante a fabricação).
Ambas as opções têm menos pontos fracos em comparação com os modos AES-
GCM ou AES-CBC mais antigos quando implementados em dispositivos restritos. 5
Se seus dispositivos tiverem suporte de hardware para AES, por exemplo, em um
chip de elemento seguro dedicado, o CCM pode ser uma opção atraente. Na maio-
ria dos outros casos, ChaCha20-Poly1305 pode ser mais fácil de implementar com
segurança. Java tem suporte para conjuntos de cifras ChaCha20-Poly1305 desde
Java 12. Se você tiver o Java 12 instalado, poderá forçar o uso de ChaCha20-
Poly1305 especificando um SSLParameters objeto e passando-o para o
setSSLParameters() métodono SSLEngine . A Listagem 12.7 mostra como con-
figurar os parâmetros para permitir apenas conjuntos de cifras baseados em
ChaCha20-Poly1305. Se você tiver o Java 12, abra o arquivo DtlsClient.java e in-
clua o novo método na classe. Caso contrário, pule este exemplo.
Depois de adicionar o novo método, você pode atualizar a chamada para o Dtls-
DatagramChannel constructor no mesmo arquivo para passar os parâmetros
customizados:
Se você fizer essa alteração e executar novamente o cliente, verá que a conexão
agora usa ChaCha20-Poly1305, desde que o cliente e o servidor estejam usando
Java 12 ou posterior.
AES-CCM ainda não é compatível com Java, embora haja trabalho em andamento
para adicionar suporte. A biblioteca Bouncy Castle (
https://www.bouncycastle.org/java.html ) oferece suporte a conjuntos de cifras
CCM com DTLS, mas apenas por meio de uma API diferente e não do padrão SS-
LEngine API. Há um exemplo usando a API Bouncy Castle DTLS com CCM na se-
ção 12.2.1.
Os conjuntos de cifras CCM vêm em duas variações:
Portanto, você deve preferir usar as variantes com uma marca de autenticação de
128 bits, a menos que tenha outras medidas para evitar a falsificação de mensa-
gens, como proteções de rede fortes, e saiba que precisa reduzir as despesas ge-
rais da rede. Você deve aplicar um limite de taxa estrito aos endpoints da API
onde há risco de ataques de força bruta contra marcas de autenticação; consulte o
capítulo 3 para obter detalhes sobre comoApliquetaxa de limitação.
questionário
1. Qual status de handshake do SSLEngine indica que uma mensagem precisa ser
enviada pela rede?
1. NEED_TASK
2. NEED_WRAP
3. NEED_UNWRAP
4. NEED_UNWRAP_AGAIN
2. Qual dos seguintes é um risco aumentado ao usar conjuntos de cifras AES-GCM
para aplicativos IoT em comparação com outros modos?
1. Um ataque inovador ao AES
2. Reutilização de nonce levando a uma perda de segurança
3. Textos cifrados excessivamente grandes causando fragmentação de pacotes
4. A descriptografia é muito cara para dispositivos restritos
No TLS 1.2 e DTLS 1.2, um PSK pode ser usado especificando conjuntos de cifras
PSK dedicados, como TLS_PSK_WITH_AES_128_CCM . No TLS 1.3 e no próximo
DTLS 1.3, o uso de um PSK é negociado usando uma extensão que o cliente envia
na mensagem inicial ClientHello. Depois que um conjunto de cifras PSK é selecio-
nado, o servidor e o cliente derivam chaves de sessão do PSK e valores aleatórios
com os quais cada um contribui durante o handshake, garantindo que chaves ex-
clusivas ainda sejam usadas para cada sessão. A chave de sessão é usada para cal-
cular uma tag HMAC sobre todas as mensagens de handshake, fornecendo auten-
ticação da sessão: somente alguém com acesso ao PSK poderia derivar a mesma
chave HMAC e calcular a tag de autenticação correta.
Figura 12.5 O uso de conjuntos de cifras de chave pré-compartilhada (PSK) per-
mite que as implementações removam muito código complexo de uma implemen-
tação TLS. Os algoritmos de assinatura não são mais necessários e podem ser re-
movidos, assim como a maioria dos algoritmos de troca de chaves. A complexa ló-
gica de análise e validação do certificado X.509 também pode ser excluída, dei-
xando apenas as primitivas básicas de criptografia simétrica.
CUIDADO Embora chaves de sessão exclusivas sejam geradas para cada sessão,
os conjuntos básicos de cifras PSK carecem de sigilo de encaminhamento: um in-
vasor que comprometa o PSK pode derivar facilmente as chaves de sessão para
cada sessão anterior se capturar as mensagens de handshake. A Seção 12.2.4 dis-
cute conjuntos de cifras PSK com sigilo de encaminhamento.
AVISO Embora o TLS permita que o PSK tenha qualquer tamanho, você deve
usar apenas um PSK criptograficamente forte, como um valor de 128 bits de um
gerador de números aleatórios seguro. Os conjuntos de cifras PSK não são ade-
quados para uso com senhas porque um invasor pode executar um dicionário off-
line ou um ataque de força bruta depois de ver um aperto de mão PSK.
pacote com.manning.apisecurityinaction;
DICA Embora a API Bouncy Castle seja simples ao usar PSKs, acho que é compli-
cada e difícil de depurar se você quiser usar autenticação de certificado e prefiro
o SSLEngine API.
while (true) { ❺
var len = dtls.receive(buffer, 0, buffer.length, 60000); ❺
if (len == -1) quebra; ❺
var data = new String(buffer, 0, len, UTF_8); ❺
System.out.println("Recebido: " + dados); ❺
} ❺
}
DICA Uma solução escalável seria o servidor gerar PSKs distintos para cada cli-
ente a partir de uma chave mestra usando HKDF, conforme discutido no capítulo
11.
@Sobrepor
public byte[] getPSK(byte[] identidade) { ❷
return psk; ❷
} ❷
};
}
pacote com.manning.apisecurityinaction;
public class PskClient {
public static void main(String[] args) lança exceção {
var psk = PskServer.loadPsk(args[0].toCharArray()); ❶
var pskId = Crypto.hash(psk); ❶
mvn executável:java \
-Dexec.mainClass=com.manning.apisecurityinaction.PskClient \
-Dexec.args=alterar
OBSERVAÇÃO Como nos exemplos anteriores, este código de amostra não faz
nenhuma tentativa de manipular pacotes perdidos após a conclusão do
handshake.
EUmencionou na seção 12.1.3 que os conjuntos de cifra PSK brutos carecem de si-
gilo de encaminhamento: se o PSK estiver comprometido, todo o tráfego captu-
rado anteriormente pode ser facilmente descriptografado. Se a confidencialidade
dos dados for importante para o seu aplicativo e seus dispositivos puderem supor-
tar uma quantidade limitada de criptografia de chave pública, você pode optar
por conjuntos de cifras PSK combinados com um contrato de chave Diffie-Hell-
man efêmero para garantir o sigilo futuro. Nesses conjuntos de cifras, a autentica-
ção do cliente e do servidor ainda é garantida pelo PSK, mas ambas as partes ge-
ram pares de chaves público-privadas aleatórios e trocam as chaves públicas du-
rante o handshake, conforme mostrado na figura 12.6. A saída de um acordo de
chave Diffie-Hellman entre a chave privada efêmera de cada lado e a chave pú-
blica efêmera da outra parte é então misturada na derivação das chaves de ses-
são. A mágica de Diffie-Hellman garante que as chaves de sessão não possam ser
recuperadas por um invasor que observe as mensagens de handshake, mesmo
que posteriormente recuperem o PSK. As chaves privadas efêmeras são apagadas
da memória assim que o handshake é concluído.
Embora para a maioria dos aplicativos IoT TLS ou DTLS deva ser perfeitamente
adequado para suas necessidades, você pode se sentir tentado a projetar seu pró-
prio protocolo criptográfico que seja um ajuste personalizado para seu aplicativo.
Isso é quase sempre um erro, porque mesmo criptógrafos experientes cometeram
erros graves ao projetar protocolos. Apesar desse conselho amplamente repetido,
muitos protocolos de segurança IoT personalizados foram desenvolvidos e novos
continuam a ser feitos. Se você acha que deve desenvolver um protocolo persona-
lizado para seu aplicativo e não pode usar TLS ou DTLS, a estrutura de protocolo
Noise ( https://noiseprotocol.org) pode ser usado como ponto de partida. Ruído
descreve como construir um protocolo seguro a partir de alguns blocos de cons-
trução básicos e descreve uma variedade de handshakes que atingem diferentes
objetivos de segurança. Mais importante ainda, o Noise é projetado e revisado por
especialistas e tem sido usado em aplicativos do mundo real, como o protocolo
WireGuard VPN ( https://www.wireguard.com ).
Figura 12.6 Conjuntos de cifras PSK com sigilo de encaminhamento usam pares de
chaves efêmeras além do PSK. O cliente e o servidor trocam chaves públicas efê-
meras em mensagens de troca de chaves durante o handshake TLS. Um acordo de
chave Diffie-Hellman é então realizado entre a chave privada efêmera de cada
lado e a chave pública efêmera recebida, que produz um valor secreto idêntico
que é então misturado no processo de derivação de chave TLS.
Todos os conjuntos de cifras CCM também vêm em uma variante CCM_8 que usa
uma marca de autenticação curta de 64 bits. Conforme discutido anteriormente,
essas variantes devem ser usadas apenas se você precisar salvar cada byte de uso
da rede e tiver certeza de que possui medidas alternativas para garantir a autenti-
cidade do tráfego de rede. O AES-GCM também é compatível com conjuntos de ci-
fras PSK, mas eu não o recomendaria em ambientes restritos devido ao maior
risco denoncereuso.
questionário
TLSe DTLS fornecem excelente segurança quando um cliente API pode falar dire-
tamente com o servidor. No entanto, conforme mencionado na introdução da se-
ção 12.1, em um aplicativo IoT típico, as mensagens podem trafegar por vários
protocolos diferentes. Por exemplo, dados de sensores produzidos por dispositi-
vos podem ser enviados por redes sem fio de baixa potência para um gateway lo-
cal, que os coloca em uma fila de mensagens MQTT para transmissão a outro ser-
viço, que agrega os dados e executa uma solicitação HTTP POST para uma nuvem
API REST para análise e armazenamento. Embora cada salto nessa jornada possa
ser protegido usando TLS, as mensagens estão disponíveis sem criptografia en-
quanto são processadas nos nós intermediários. Isso torna esses nós intermediá-
rios um alvo atraente para invasores porque, uma vez comprometidos, eles po-
dem visualizar e manipular todos os dados que passam por esse dispositivo.
12.3.1 COSE
Se Se você deseja garantir a segurança de ponta a ponta das solicitações para uma
API REST regular baseada em JSON, pode ficar tentado a consultar os padrões
JOSE (JSON Object Signing and Encryption) discutidos no capítulo 6. Para aplicati-
vos de IoT, JSON geralmente é substituídas por codificações binárias mais eficien-
tes que fazem melhor uso da memória restrita e da largura de banda da rede e
que possuem implementações de software compactas. Por exemplo, dados numé-
ricos, como leituras de sensores, geralmente são codificados como strings deci-
mais em JSON, com apenas 10 valores possíveis para cada byte, o que é um des-
perdício em comparação com uma codificação binária compactada dos mesmos
dados.
Várias alternativas binárias ao JSON se tornaram populares nos últimos anos para
superar esses problemas. Uma escolha popular é a representação de objetos biná-
rios concisos(CBOR), que fornece um formato binário compacto que segue aproxi-
madamente o mesmo modelo do JSON, fornecendo suporte para objetos que con-
sistem em campos de valor-chave, matrizes, texto e strings binárias e números in-
teiros e de ponto flutuante. Como o JSON, o CBOR pode ser analisado e processado
sem um esquema. Além do CBOR, os padrões CBOR Object Signing and Encryption
(COSE; https://tools.ietf.org/html/rfc8152 ) fornecem recursos criptográficos seme-
lhantes aos do JOSE para JSON.
Embora o COSE seja vagamente baseado no JOSE, ele divergiu bastante, tanto nos
algoritmos suportados quanto na forma como as mensagens são formatadas. Por
exemplo, no MAC simétrico JOSE, algoritmos como HMAC fazem parte do JWS
(JSON Web Signatures) e tratados como equivalentes aos algoritmos de assinatura
de chave pública. No COSE, os MACs são tratados mais como algoritmos de cripto-
grafia autenticados, permitindo que o mesmo acordo de chave e algoritmos de
agrupamento de chave sejam usados para transmitir uma chave MAC por
mensagem.
Para demonstrar o uso de COSE para criptografar mensagens, você pode usar a
implementação de referência Java do grupo de trabalho COSE. Abra o arquivo
pom.xml em seu editor e adicione as seguintes linhas à seção de dependências: 7
<dependência>
<groupId>com.augustcellars.cose</groupId>
<artifactId>cose-java</artifactId>
<version>1.1.0</version>
</dependência>
Security.addProvider(new BouncyCastleProvider()); ❶
var keyMaterial = PskServer.loadPsk("changeit".toCharArray()); ❷
message.encrypt(); ❼
System.out.println(Base64url.encode(message.EncodeToBytes())); ❼
Campo Propósito
ParteV
outro
Os campos de contexto do HKDF podem ser comunicados explicitamente como
parte da mensagem ou podem ser acordados pelas partes com antecedência e in-
cluídos no cálculo do KDF sem serem incluídos na mensagem. Se um nonce alea-
tório for usado, isso obviamente precisa ser incluído na mensagem; caso contrá-
rio, a outra parte não conseguirá adivinhar. Como os campos estão incluídos no
processo de derivação da chave, não há necessidade de autenticá-los separada-
mente como parte da mensagem: qualquer tentativa de adulterá-los fará com que
uma chave incorreta seja derivada. Por esse motivo, você pode colocá-los em um
UNPROTECTED cabeçalhoque não é protegido por um MAC.
Embora o HKDF seja projetado para uso com MACs baseados em hash, o COSE
também define uma variante dele que pode usar um MAC baseado em AES no
modo CBC, conhecido como HKDF-AES-MAC (essa possibilidade foi explicitamente
discutida no Apêndice D do original Proposta HKDF, consulte
https://eprint.iacr.org/2010/264.pdf ). Isso elimina a necessidade de uma imple-
mentação de função hash, economizando algum tamanho de código em dispositi-
vos restritos. Isso pode ser particularmente importante em dispositivos de baixo
consumo de energia porque alguns chips de elemento seguro fornecem suporte
de hardware para AES (e até mesmo criptografia de chave pública), mas não têm
suporte para SHA-256 ou outras funções de hash, exigindo que os dispositivos vol-
tem a ser mais lentos e menos eficientes implementações de software.
NOTA Você se lembrará do capítulo 11 que o HKDF consiste em duas funções:
uma função de extraçãoque deriva uma chave mestra de algum material de chave
de entrada e uma função de expansão que deriva uma ou mais novas chaves da
chave mestra. Quando usado com uma função de hash, o HKDF do COSE executa
ambas as funções. Quando utilizado com AES realiza apenas a fase de expansão;
isso é bom porque a chave de entrada já é uniformemente aleatória, conforme ex-
plicado no capítulo 11. 8
Embora O COSE é, em muitos aspectos, melhor projetado do que o JOSE e está co-
meçando a ser amplamente adotado em padrões como o FIDO 2 para chaves de
segurança de hardware ( https://fidoalliance .org/fido2/ ), ele ainda sofre do
mesmo problema de tentar fazer muito. Ele oferece suporte a uma ampla varie-
dade de algoritmos criptográficos, com diferentes objetivos e qualidades de segu-
rança. No momento em que escrevo, contei 61 variantes de algoritmo registradas
no registro de algoritmos COSE ( http://mng.bz/awDz ), a grande maioria das quais
está marcada como recomendada. Esse desejo de cobrir todas as bases pode tor-
nar difícil para os desenvolvedores saber quais algoritmos escolher e, embora
muitos deles sejam bons algoritmos, eles podem levar a problemas de segurança
quando mal utilizados, como os problemas de reutilização acidental de nonce que
você aprendeu no últimas seções.
SHA-3 e STROBE
❸ Criptografe os dados.
A caixa secreta do NaCl é relativamente adequada para aplicações IoT por vários
motivos:
Ele usa um nonce de 192 bits por mensagem, o que minimiza o risco de reutili-
zação acidental de nonce ao usar valores gerados aleatoriamente. Este é o ta-
manho máximo do nonce, portanto, você pode usar um valor mais curto se pre-
cisar economizar espaço e preenchê-lo com zeros antes de descriptografar. Re-
duzir o tamanho aumenta o risco de reutilização acidental de nonce, portanto,
evite reduzi-lo para muito menos que 128 bits.
ocifra XSalsa20 eO Poly1305 MAC usado pelo NaCl pode ser implementado de
forma compacta em software em uma ampla gama de dispositivos. Eles são
particularmente adequados para arquiteturas de 32 bits, mas também existem
implementações rápidas para microcontroladores de 8 bits. Portanto, eles são
uma boa escolha em plataformas sem suporte AES de hardware.
A marca de autenticação de 128 bits usada pelo Poly1305 é uma boa compensa-
ção entre segurança e expansão de mensagem. Embora existam algoritmos
MAC mais fortes, a tag de autenticação só precisa permanecer segura durante o
tempo de vida da mensagem (até que ela expire, por exemplo), enquanto o con-
teúdo da mensagem pode precisar permanecer em segredo por muito mais
tempo.
Embora NaCl e COSE podem ser usados de forma a minimizar o risco de reutiliza-
ção de nonce, eles apenas o fazem na suposição de que um dispositivo tenha
acesso a alguma fonte confiável de dados aleatórios. Esse nem sempre é o caso de
dispositivos restritos, que geralmente não têm acesso a boas fontes de entropia ou
mesmo a relógios confiáveis que poderiam ser usados para nonces determinísti-
cos. A pressão para reduzir o tamanho das mensagens também pode resultar em
desenvolvedores usando nonces muito pequenos para serem gerados aleatoria-
mente com segurança. Um invasor também pode influenciar as condições para
tornar a reutilização de nonce mais provável, como adulterar o relógio ou explo-
rar pontos fracos nos protocolos de rede, como ocorreu nos ataques KRACKcontra
WPA2 ( https://www.krackattacks .com ). No pior caso, onde um nonce é reutili-
zado para muitas mensagens, os algoritmos em NaCl e COSE falham catastrofica-
mente, permitindo que um invasor recupere muitas informações sobre os dados
criptografados e, em alguns casos, adultere esses dados ou construa falsificações.
Figura 12.8 O modo SIV usa a marca de autenticação MAC como o IV para cripto-
grafia. Isso garante que o IV só se repita se a mensagem for idêntica, eliminando
problemas de reutilização nonce que podem causar falhas de segurança catastró-
ficas. O SIV-AES é particularmente adequado para ambientes IoT porque precisa
apenas de um circuito de criptografia AES para realizar todas as operações (até
mesmo a descriptografia).
CUIDADO Nem todos os MACs são PRFs, portanto, você deve seguir as imple-
mentações padrão do modo SIV em vez de inventar o seu próprio.
AVISO Como a marca de autenticação só pode ser validada após a mensagem ter
sido descriptografada, você deve ter cuidado para não processar nenhum dado
descriptografado antes que essa etapa crucial de autenticação seja concluída.
No SIV-AES, o MAC é AES-CMAC, que é uma versão melhorada do AES-CBC-MAC
usado no COSE. A criptografia é realizada usando AES no modo CTR. Isso significa
que o SIV-AES tem a mesma propriedade interessante do AES-CCM: requer apenas
um circuito de criptografia AES para todas as operações (até mesmo a descripto-
grafia), portanto, pode ser implementado de forma compacta.
Embora o modo SIV proteja contra uso indevido acidental ou deliberado de non-
ces, ele não protege contra todos os ataques possíveis em um ambiente IoT.
Quando um invasor pode ter acesso físico direto aos dispositivos, especialmente
onde há proteção ou vigilância física limitada, você também pode precisar consi-
derar outros ataques. Um chip de elemento seguropode fornecer alguma proteção
contra adulteração e tentativas de ler as chaves diretamente da memória, mas as
chaves e outros segredos também podem vazar por muitos canais laterais. Um ca-
nal lateral ocorre quando informações sobre um segredo podem ser deduzidas
pela medição de aspectos físicos de cálculos usando esse segredo, como o
seguinte:
A proteção contra ataques de canal lateral e de falha está muito além do escopo
deste livro. Bibliotecas e dispositivos criptográficos documentarão se foram proje-
tados para resistir a esses ataques. Os produtos podem ser certificados de acordo
com padrões como FIPS 140-2 ou Commons Criteria, que fornecem alguma garan-
tia de que o dispositivo resistirá a alguns ataques físicos, mas você precisa ler as
letras miúdas para determinar exatamente quais ameaças foram testadas.
Até agora, o modo que descrevi sempre produzirá o mesmo nonce e o mesmo
texto cifrado sempre que a mesma mensagem de texto simples for criptografada.
Se você se lembra do capítulo 6, esse esquema de criptografia não é seguro por-
que um invasor pode saber facilmente se a mesma mensagem foi enviada várias
vezes. Por exemplo, se você tiver um sensor enviando pacotes de dados contendo
leituras do sensor em uma pequena faixa de valores, um observador poderá des-
cobrir quais são as leituras criptografadas do sensor depois de ver o suficiente de-
las. É por isso que os modos normais de criptografia adicionam um único nonce
ou IV aleatório em cada mensagem: para garantir que diferentes textos cifrados
sejam produzidos mesmo que a mesma mensagem seja criptografada. O modo SIV
resolve esse problema permitindo que você inclua um IV aleatório nos dados as-
sociados que acompanham a mensagem. Como esses dados associados também
estão incluídos no cálculo do MAC, ele garante que o SIV calculado será diferente,
mesmo que a mensagem seja a mesma. Para tornar isso um pouco mais fácil, o
modo SIV permite que mais de um bloco de dados associado seja fornecido à cifra
- até 126 blocos no SIV-AES.
<dependência>
<groupId>org.cryptomator</groupId>
<artifactId>modo siv</artifactId>
<version>1.3.2</version>
</dependência>
O modo SIV requer duas chaves separadas: uma para o MAC e outra para cripto-
grafia e descriptografia. A especificação que define o SIV-AES (
https://tools.ietf.org/html/rfc5297 ) descreve como uma única chave com o dobro
do tamanho normal pode ser dividida em duas, com a primeira metade se tor-
nando a chave MAC e a segunda metade da chave de criptografia. Isso é demons-
trado na Listagem 12.16 dividindo a chave PSK de 256 bits existente em duas cha-
ves de 128 bits. Você também pode derivar as duas chaves de uma única chave
mestra usando HKDF, como aprendeu no capítulo 11. A biblioteca usada na lista-
gem fornece encrypt () e decrypt() métodosque usam a chave de criptogra-
fia, a chave MAC, o texto simples (ou texto cifrado para descriptografia) e qual-
quer número de blocos de dados associados. Neste exemplo, você passará um ca-
beçalho e um IV aleatório. A especificação SIV recomenda que qualquer IV aleató-
rio seja incluído como o último associado dadosquadra.
DICA A SivMode classe da biblioteca é thread-safe e projetada para ser reutili-
zada. Se você usar essa biblioteca em produção, deverá criar uma única instância
dessa classe e reutilizá-la para todas as chamadas.
questionário
Em vez deem vez de instalar uma única chave uma vez quando um dispositivo é
adquirido pela primeira vez, você pode distribuir chaves periodicamente para
dispositivos usando um servidor de distribuição de chaves. Nesse modelo, o dispo-
sitivo usa sua chave inicial para se registrar no servidor de distribuição de chaves
e, em seguida, recebe uma nova chave que pode ser usada para comunicações fu-
turas. O servidor de distribuição de chaves também pode disponibilizar essa
chave para servidores de API quando eles precisarem se comunicar com esse
dispositivo.
Alguns dispositivos podem ser equipados com hardware seguro que pode ser
usado para estabelecer confiança em um dispositivo quando ele é conectado pela
primeira vez à rede de uma organização. Por exemplo, o dispositivo pode ter um
Trusted Platform Module (TPM), que é um tipo de módulo de segurança de hard-
ware (HSM) popularizado pela Microsoft. Um TPM pode provar a um servidor re-
moto que é um modelo específico de dispositivo de um fabricante conhecido com
um número de série específico, em um processo conhecido como atestado remoto.
O atestado remoto é obtido usando um protocolo de desafio-resposta baseado em
uma chave privada, conhecida como Chave de Endosso(EK), que é queimado no
dispositivo no momento da fabricação. O TPM usa o EK para assinar uma declara-
ção de atestado indicando a marca e o modelo do dispositivo e também pode for-
necer detalhes sobre o estado atual do dispositivo e do hardware conectado.
Como essas medições do estado do dispositivo são feitas pelo firmware em execu-
ção no TPM seguro, elas fornecem fortes evidências de que o dispositivo não foi
adulterado.
Embora o atestado de TPM seja forte, um TPM não é um componente barato para
adicionar aos seus dispositivos IoT. Algumas CPUs incluem suporte para um ambi-
ente de execução confiável(TEE), como o ARM TrustZone, que permite que o soft-
ware assinado seja executado em um modo de execução seguro especial, isolado
do sistema operacional normal e de outros códigos. Embora menos resistente a
ataques físicos do que um TPM, um TEE pode ser usado para implementar fun-
ções críticas de segurança, como atestado remoto. Um TEE também pode ser
usado como HSM de um homem pobre, fornecendo uma camada adicional de se-
gurança sobre soluções de software puro.
Em vez de escrever um servidor de distribuição de chaves dedicado, também é
possível distribuir chaves usando um protocolo existente, como OAuth2. Um ras-
cunho de padrão para OAuth2 (atualmente expirado, mas revivido periodica-
mente pelo grupo de trabalho OAuth) descreve como distribuir chaves simétricas
criptografadas juntamente com um token de acesso OAuth2 ( http://mng.bz/6AZy )
e RFC 7800 descreve como tal chave pode ser codificado em um JSON Web Token (
https://tools.ietf.org/html/rfc7800#section-3.3 ). A mesma técnica pode ser usada
com CBOR Web Tokens ( http://mng.bz/oRaM). Essas técnicas permitem que um
dispositivo receba uma nova chave sempre que obtém um token de acesso, e qual-
quer servidor de API com o qual ele se comunique pode recuperar a chave de ma-
neira padrão do próprio token de acesso ou por meio da introspecção do token. O
uso de OAuth2 em um ambiente IoT é discutido mais adiante emcapítulo 13.
Existem várias maneiras de derivar a nova chave da antiga. Por exemplo, você
pode derivar a nova chave usando HKDF com uma string de contexto fixa como
no exemplo a seguir:
DICA É uma prática recomendada usar HKDF para derivar duas (ou mais) cha-
ves: uma é usada apenas para HKDF, para derivar a próxima chave catraca, en-
quanto a outra é usada para criptografia ou autenticação. A chave de catraca às
vezes é chamada de chave de correnteou chave de encadeamento.
Se a chave não for usada para HMAC, mas usada para criptografia usando AES ou
outro algoritmo, você poderá reservar um valor nonce ou IV específico para ser
usado para a catraca e derivar a nova chave como a criptografia de uma mensa-
gem totalmente zero usando aquele IV reservado, conforme mostrado na Lista-
gem 12.17 usando AES no modo Counter. Neste exemplo, um IV de 128 bits de to-
dos os bits 1 é reservado para a operação de catraca porque é altamente imprová-
vel que esse valor seja gerado por um contador ou por um IV gerado
aleatoriamente.
AVISO Você deve garantir que o IV especial usado para a catraca nunca seja
usado para criptografar uma mensagem.
Se o invasor conseguir roubar a chave secreta de longo prazo usada pelo disposi-
tivo, pode ser impossível recuperar a segurança sem o envolvimento humano. Na
pior das hipóteses, o dispositivo pode precisar ser substituído ou restaurado para
as configurações de fábrica e reconfigurado. Os mecanismos de catraca discutidos
na seção 12.4.3 não protegem contra comprometimento, porque se o invasor obti-
ver acesso à chave de catraca atual, ele poderá calcular facilmente todas as cha-
ves futuras.
Medidas de segurança de hardware, como um elemento seguro, TPM ou TEE (con-
sulte a seção 12.4.1) podem fornecer segurança pós-comprometimento, garan-
tindo que um invasor nunca obtenha acesso direto à chave secreta. Um invasor
que tenha controle ativo do dispositivo pode usar o hardware para comprometer
as comunicações enquanto tiver acesso, mas uma vez que o acesso seja removido,
ele não poderá mais descriptografar ou interferir em comunicações futuras.
Uma forma mais fraca de segurança pós-compromisso pode ser alcançada se uma
fonte externa de material de chave for misturada em um processo de catraca peri-
odicamente. Se o cliente e o servidor concordarem com esse material de chave
sem que o invasor saiba disso, quaisquer novas chaves derivadas serão imprevisí-
veis para o invasor e a segurança será restaurada. Isso é mais fraco do que usar
hardware seguro, porque se o invasor roubou a chave do dispositivo, então, em
princípio, ele pode espionar ou interferir em todas as comunicações futuras e in-
terceptar ou controlar esse material de chave. No entanto, se até mesmo uma
única troca de comunicação puder ocorrer sem a interferência do invasor, a segu-
rança poderá ser restaurada.
Existem dois métodos principais para trocar material de chave entre o servidor e
o cliente:
Eles podem trocar diretamente novos valores aleatórios criptografados usando
a chave antiga. Por exemplo, um servidor de distribuição de chaves pode en-
viar periodicamente ao cliente uma nova chave criptografada com a antiga,
conforme descrito na seção 12.4.2, ou ambas as partes podem enviar nonces
aleatórios que são misturados no processo de derivação de chave usado na ca-
traca (seção 12.4 .3). Essa é a abordagem mais fraca porque um invasor passivo
capaz de espionar pode usar os valores aleatórios diretamente para derivar as
novas chaves.
Eles podem usar o acordo de chave Diffie-Hellmancom novas chaves aleatórias
(efêmeras) para derivar um novo material de chave. Diffie-Hellman é um algo-
ritmo de chave pública no qual o cliente e o servidor apenas trocam chaves pú-
blicas, mas usam chaves privadas locais para derivar um segredo comparti-
lhado. O Diffie-Hellman é seguro contra bisbilhoteiros passivos, mas um inva-
sor capaz de representar o dispositivo com uma chave secreta roubada ainda
pode realizar um ataque man-in-the-middle ativocomprometer a segurança. Os
dispositivos IoT implantados em locais acessíveis podem ser particularmente
vulneráveis a ataques man-in-the-middle porque um invasor pode ter acesso fí-
sico às conexões de rede.
questionário
1. b. NEED_WRAP indica que o SSLEngine precisa enviar dados para a outra parte
durante o handshake.
2. b. O AES-GCM falha catastroficamente se um nonce for reutilizado, e isso é mais
provável em aplicativos IoT.
3. Falso. Novas chaves são derivadas para cada sessão trocando valores aleatórios
durante o handshake.
4. d. O acordo de chaves Diffie-Hellman com novos pares de chaves efêmeras é
usado para garantir o sigilo de encaminhamento.
5. b. Os modos MRAE são mais robustos no caso de reutilização nonce.
6. Falso. O SIV-AES é menos seguro se um nonce for reutilizado, mas perde uma
quantidade relativamente pequena de segurança em comparação com outros
modos. Você ainda deve tentar usar nonces exclusivos para cada mensagem.
7. Falso. A catraca atinge o sigilo de encaminhamento, mas não a segurança pós-
compromisso. Depois que um invasor compromete a chave de catraca, ele pode
derivar todos osfuturochaves.
Resumo
1.
O DTLS está limitado a proteger conexões UDP unicast e não pode proteger trans-
missões multicast atualmente.
2.
Consulte o capítulo 3 se você ainda não instalou o mkcert.
3.
Consulte https://wiki.mozilla.org/Security/Server_Side_TLS .
4.
Thomas Pornin, o autor da biblioteca BearSSL, tem notas detalhadas sobre o custo
de diferentes algoritmos criptográficos TLS em https://bearssl.org/support.html .
5.
ChaCha20-Poly1305 também sofre de problemas de reutilização nonce semelhan-
tes ao GCM, mas em menor grau. GCM perde todas as garantias de autenticidade
após a reutilização de um único nonce, enquanto ChaCha20-Poly1305 só perde es-
sas garantias para mensagens criptografadas com o nonce duplicado.
6.
O suporte para X25519 também foi adicionado ao TLS 1.2 e anterior em uma atua-
lização subsequente; consulte https://tools.ietf.org/html/rfc8422 .
7.
O autor da implementação de referência, Jim Schaad, também administra uma vi-
nícola chamada August Cellars em Oregon, caso você esteja se perguntando sobre
o nome de domínio.
8.
É lamentável que o COSE tente lidar com ambos os casos em uma única classe de
algoritmos. Exigir a função de expansão para HKDF com uma função de hash é
ineficiente quando a entrada já é uniformemente aleatória. Por outro lado, ig-
norá-lo para AES é potencialmente inseguro se a entrada não for uniformemente
aleatória.
9.
Os mais atentos podem perceber que esta é uma variação do esquema MAC-then-
Encrypt que dissemos no capítulo 6 não é garantido como seguro. Embora isso ge-
ralmente seja verdade, o modo SIV tem uma prova de segurança, portanto, é uma
exceção à regra.
10.
Com 4,5 MB, o Bouncy Castle não se qualifica como uma implementação com-
pacta, mas mostra como o SIV-AES pode ser facilmente implementado no
servidor.
11.
O serviço de mensagens seguras Signal é famoso por seu algoritmo de “catraca
dupla” ( https://signal.org/docs/specificações/doubleratchet/ ), que garante que
uma nova chave seja derivada após cada mensagem.
12.
As explorações reais de passagem de caminho geralmente são mais complexas do
que isso, contando com bugs sutis nas rotinas de análise de URL.