# 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:

<div _ngcontent-ng-c1448405485="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-funci%C3%B3-prop%C3%B2sit-sint" inline-copy-host=""><table><thead><tr><td>Funció</td><td>Propòsit</td><td>Sintaxi Simplificada</td></tr></thead><tbody><tr><td>**`openssl_encrypt()`**</td><td>Xifrar la cadena.</td><td>`openssl_encrypt($data, $method, $key, $options, $iv)`</td></tr><tr><td>**`openssl_decrypt()`**</td><td>Desxifrar la cadena.</td><td>`openssl_decrypt($data, $method, $key, $options, $iv)`</td></tr></tbody></table>

</div>Els paràmetres essencials són:

<div _ngcontent-ng-c1448405485="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-%24data%3A-la-cadena-de-" inline-copy-host="">- `$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.

</div>### Algoritmes recomanats

Per a les aplicacions modernes, es recomana utilitzar la família **AES** (*Advanced Encryption Standard*) en un mode operatiu segur.

<div _ngcontent-ng-c1448405485="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-algoritme-caracter%C3%ADs" inline-copy-host=""><table style="width: 100%;"><thead><tr><td style="width: 25.4864%;">Algoritme</td><td style="width: 74.5136%;">Característiques Clau</td></tr></thead><tbody><tr><td style="width: 25.4864%;">**AES-256-CBC**</td><td style="width: 74.5136%;">**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.</td></tr><tr><td style="width: 25.4864%;">**AES-256-GCM**</td><td style="width: 74.5136%;">**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).</td></tr></tbody></table>

</div>### Consideracions

<div _ngcontent-ng-c1448405485="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-generaci%C3%B3-de-l%27iv%3A-l" inline-copy-host="">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.

</div>### Resum del flux

<div _ngcontent-ng-c1448405485="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-generar-iv%3A-%24iv-%3D-op" inline-copy-host="">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);`

</div>## 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:

<div _ngcontent-ng-c1448405485="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-sense-autenticaci%C3%B3-%28" inline-copy-host="">- **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.

</div><p class="callout danger"> 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.</p>

<div _ngcontent-ng-c1448405485="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--1" inline-copy-host=""></div>