Xifrat OpenSSL
Per xifrar una cadena de caràcters (no només fer-ne el hash per contrasenyes, sinó xifrar-la per poder-la desxifrar més tard) a PHP, s'utilitza principalment el conjunt de funcions de l'extensió OpenSSL. Aquest mètode aplica l'encriptació simètrica.
Xifrat i desxifrat a PHP (OpenSSL)
El procés requereix tres elements clau: la cadena, una clau secreta (password) i un vector d'inicialització (IV).
Funcions i paràmetres
Les dues funcions principals són:
| Funció | Propòsit | Sintaxi Simplificada |
openssl_encrypt() |
Xifrar la cadena. | openssl_encrypt($data, $method, $key, $options, $iv) |
openssl_decrypt() |
Desxifrar la cadena. | openssl_decrypt($data, $method, $key, $options, $iv) |
Els paràmetres essencials són:
-
$data: La cadena de caràcters (text clar) a xifrar. -
$method: L'algoritme de xifrat a utilitzar (p. ex., AES-256-CBC). -
$key: La clau secreta (password) que s'utilitza per al xifrat i el desxifrat. Ha de ser la mateixa per a ambdós processos. -
$iv: El Vector d'Inicialització (Initialization Vector). Una cadena de dades aleatòries que assegura que si xifrem la mateixa entrada dues vegades, obtindrem resultats diferents.
Algoritmes recomanats
Per a les aplicacions modernes, es recomana utilitzar la família AES (Advanced Encryption Standard) en un mode operatiu segur.
| Algoritme | Característiques Clau |
| AES-256-CBC | Segur i molt utilitzat. 256 bits de clau. El mode CBC (Cipher Block Chaining) necessita l'IV (Vector d'Inicialització), que és obligatori per garantir la seguretat. |
| AES-256-GCM | Molta seguretat i modern. Ofereix a més d'encriptació, autenticació de dades (assegura que les dades no han estat manipulades). És més complex d'implementar però és l'estàndard actual per a la majoria de protocols (com TLS). |
Consideracions
-
Generació de l'IV: L'IV s'ha de generar de manera criptogràficament segura amb la funció
openssl_random_pseudo_bytes(). MAI s'ha de fixar o reutilitzar l'IV per a més d'un xifratge. -
Emmagatzematge Segur:
-
El text xifrat (ciphertext) s'emmagatzema a la base de dades.
-
L'IV no és secret i s'ha d'emmagatzemar juntament amb el text xifrat (sovint concatenat o en un camp separat) per poder fer el procés de desxifrat.
-
La Clau Secreta (
$key) mai s'ha d'emmagatzemar a la base de dades. S'ha de guardar de forma segura en un fitxer de configuració del servidor o com a variable d'entorn.
-
-
Conversió del Text Xifrat: El resultat de
openssl_encrypt()és binari, per la qual cosa cal convertir-lo a un format de text segur (p. ex., ambbase64_encode()) abans d'emmagatzemar-lo a una base de dades o transmetre'l.
Resum del flux
-
Generar IV:
$iv = openssl_random_pseudo_bytes($iv_length); -
Xifrar:
$xifrat = openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv); -
Emmagatzemar/Transmetre: Guardar/enviar
$xifrat(codificat en Base64) +$iv(codificat en Base64). -
Desxifrar: Usar
$keyi l'IV extret per fer$original = openssl_decrypt($xifrat, 'AES-256-CBC', $key, 0, $iv);
Xifrat amb Mcrypt (Mètode Obsolet)
Si vols xifrar dades a PHP sense utilitzar l'extensió OpenSSL, l'alternativa principal i històrica ha estat l'extensió Mcrypt. No obstant això, Mcrypt està obsoleta (deprecada) des de PHP 7.1 i ha estat eliminada completament a PHP 7.2 i posteriors a causa dels seus problemes de manteniment i seguretat.
Per a qualsevol projecte, sempre es recomana utilitzar OpenSSL.
Per què Mcrypt NO s'ha d'utilitzar
La principal raó per la qual Mcrypt es va eliminar és que oferia massa opcions de configuració i no forçava l'usuari a aplicar pràctiques segures:
-
Sense Autenticació (AEAD): No oferia modes de xifratge que incloguessin autenticació de dades (com GCM), cosa que permetia a un atacant manipular el missatge xifrat sense ser detectat.
-
Gestió Insegura de l'IV: L'usuari havia de calcular la mida correcta de l'IV i era fàcil cometre errors com reutilitzar-lo, cosa que compromet la seguretat.
-
Problemes de farciment (Padding): Mcrypt sovint generava problemes amb el farciment de les dades per adaptar-les a la mida del bloc, un aspecte que OpenSSL gestiona automàticament i de forma correcta.
Encara que Mcrypt és la resposta històrica per a xifratge sense OpenSSL, si necessites xifratge simètric en un entorn PHP modern, la implementació d'OpenSSL és l'única opció robusta i mantinguda per garantir que les teves dades estiguin protegides de manera efectiva.