Ves al contingut principal

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

  1. 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.

  2. 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.

  3. 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., amb base64_encode()) abans d'emmagatzemar-lo a una base de dades o transmetre'l.

Resum del flux

  1. Generar IV: $iv = openssl_random_pseudo_bytes($iv_length);

  2. Xifrar: $xifrat = openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv);

  3. Emmagatzemar/Transmetre: Guardar/enviar $xifrat (codificat en Base64) + $iv (codificat en Base64).

  4. Desxifrar: Usar $key i 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.

Mcrypt proporcionava una interfície per a diversos algorismes de xifratge simètric, com AES, Triple DES, Blowfish, i altres.

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.