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.
1.2 🚧Com uma chave curta, ligue nos dois lados (é global do programa):
RALCriptoKeyDerivation := rkdPBKDF2; // unit RALCriptoAES
Cada 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 |