Repository navigation
criptografia externa
Home > Criptografia ponto a ponto
Vale para a 1.1 em diante · Nível: intermediário
Em uma frase: além do HTTPS, o cliente e o servidor RAL podem cifrar o corpo dos pedidos e respostas com AES e uma chave que só os dois conhecem.
Quando usar: quando o corpo passa por intermediários que abrem o HTTPS (proxy, balanceador, nginx) e você não quer que eles leiam os dados. Para o resto, o HTTPS basta.
A mesma chave dos dois lados.
| Lado | Até a 1.2 | A partir da 2.0 🚧
|
|---|---|---|
| Servidor |
Servidor.CriptoOptions.CriptType := crAES256; e CriptoOptions.Key := 'chave'
|
plugin TRALCriptoPlugin, Key := 'chave' (Plugins) |
| Cliente |
Cliente.CriptoOptions.CriptType := crAES256; e Cliente.CriptoOptions.Key := 'chave'
|
igual |
Tipos: crAES128, crAES192, crAES256 (CBC, padding PKCS#7). O servidor responde
no tipo que o cliente aceitar.
Com uma chave curta, ligue nos dois lados (é global do programa):
RALCriptoKeyDerivation := rkdPBKDF2; // unit RALCriptoAESCada tentativa de adivinhar a chave passa a custar 100 mil cálculos em vez de um. Se só um lado ligar, nada é lido (erro de integridade).
Dois cabeçalhos próprios do RAL (a grafia "Encription" é a do protocolo; não "corrija"):
| Cabeçalho | Significa | Valores |
|---|---|---|
Content-Encription |
como este corpo foi cifrado |
aes128cbc_pkcs7, aes192cbc_pkcs7, aes256cbc_pkcs7
|
Accept-Encription |
o que quem envia aceita receber | os mesmos, separados por vírgula |
Pedido:
POST /teste/dados HTTP/1.1
Content-Type: application/json
Content-Encoding: gzip
Content-Encription: aes128cbc_pkcs7
Accept-Encription: aes128cbc_pkcs7, aes192cbc_pkcs7, aes256cbc_pkcs7
<corpo comprimido e depois cifrado>
Com compressão, primeiro comprime, depois cifra (dado cifrado não comprime).
O corpo cifrado (desde a 1.1) é: IV aleatório de 16 bytes + texto cifrado (AES
CBC, PKCS#7) + HMAC-SHA256 de 32 bytes sobre IV + texto cifrado. A chave do HMAC
é SHA-256(chave + 'ral-mac'). O HMAC é conferido antes de decifrar: chave errada
ou corpo alterado dá erro, nunca lixo.
Warning
A 1.0 cifrava de outro jeito. Cliente 1.0 e servidor 1.1+ (ou o contrário) não se entendem: atualize os dois juntos.
| O que acontece | Causa | O que fazer |
|---|---|---|
Encrypted data failed integrity check: wrong key or altered content. |
chave diferente, ou PBKDF2 ligado só de um lado | mesma chave e mesma configuração nos dois |
| o servidor recebe lixo | o servidor não tem a chave (na 2.0: falta o TRALCriptoPlugin) |
configure o servidor |
Key must be provided. |
chave vazia | preencha Key
|
Começar
Servidor
- Rotas e parâmetros
- Ler o pedido e responder
- Resposta em fluxo 🚧
- Plugins 🚧
- Autenticação
- Banco de dados (DBWare)
- Servir site e arquivos
- Swagger e Postman
- Servidor SOAP 🚧
- HTTPS
- Criptografia ponto a ponto
- Segurança para produção
- Colocar no ar
- Desempenho
MQTT 🚧
- O que é e quando usar 🚧
- Cliente MQTT 🚧
- Broker MQTT 🚧
- MQTT-SN 🚧
- Ponte REST 🚧
- Segurança 🚧
- Rede ruim 🚧
Cliente
Motores
Avançado
Ajuda
- Problemas comuns
- Atualizar o Indy
- Várias versões do Delphi
- Vídeos e guias
- Módulos de terceiros
- Licenças
- Contribuir
- Roadmap e changelog
🚧 = em desenvolvimento, pode mudar