# Base64

El **Base64** és un sistema de **codificació** (no d'encriptació) que converteix dades binàries (imatges, fitxers, resultats de *hashing*, o dades xifrades) en una cadena de caràcters de text pla. El seu objectiu principal és garantir que les dades es puguin transmetre de manera segura a través de protocols dissenyats originalment per gestionar només text, com el correu electrònic (SMTP) o les URLs.

## Concepte Base64

El Base64 es basa en un conjunt de 64 caràcters segurs (A-Z, a-z, 0-9, més '+' i '/') i el caràcter '=' per farcir (*padding*).

<div _ngcontent-ng-c1448405485="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-grup-de-3-bytes%3A-agr" inline-copy-host="">1. **Grup de 3 Bytes:** Agrupa les dades binàries d'entrada en blocs de 3 bytes (24 bits).
2. **Conversió a 4 Grups:** Aquests 24 bits es divideixen en 4 grups de 6 bits cadascun.
3. **Mapa de 6 Bits:** Com que ![](), cada grup de 6 bits es mapeja a un dels 64 caràcters Base64 segurs.

</div><p class="callout info">**CONSEQÜÈNCIA:** El Base64 sempre augmenta la mida de la dada d'entrada en aproximadament un **33%** (de 3 bytes a 4 caràcters).</p>

### Exemple

S'utilitza habitualment per:

<div _ngcontent-ng-c1448405485="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-incrustar-imatges-di" inline-copy-host="">- Incrustar imatges directament en un fitxer HTML o CSS (*Data URIs*).
- Transmetre dades binàries o xifrades (com els resultats de `openssl_encrypt()`) a través de la web o per correu.
- Codificar paràmetres en URLs.

</div>## Codificació i decodificació a PHP

PHP ofereix dues funcions natives i molt senzilles per gestionar el Base64: **`base64_encode()`** i **`base64_decode()`**.

### Codificació (Encode)

La funció `base64_encode()` converteix una cadena de text o una dada binària en la seva representació Base64.

<div _ngcontent-ng-c1448405485="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-" inline-copy-host=""></div><div _ngcontent-ng-c2531377157="" class="code-block ng-tns-c2531377157-103 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_278fbd82435566e6","c_f93da456ed382884",null,"rc_38fa53b829fa2058",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c2531377157="" class="code-block-decoration header-formatted gds-title-s ng-tns-c2531377157-103 ng-star-inserted"><span class="ng-tns-c2531377157-103">PHP</span><div _ngcontent-ng-c2531377157="" class="buttons ng-tns-c2531377157-103 ng-star-inserted"><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c2531377157-103 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c2531377157="" class="formatted-code-block-internal-container ng-tns-c2531377157-103"><div _ngcontent-ng-c2531377157="" class="animated-opacity ng-tns-c2531377157-103"></div></div></div>```php
<?php
// Dada d'entrada (text clar o dada binària, com un hash)
$dades_originals = "Nom: David; ID: 42";

// Codificació Base64
$dades_codificades = base64_encode($dades_originals);

echo "Dades originals: " . $dades_originals . "\n";
echo "Dades codificades (Base64): " . $dades_codificades . "\n";
// Sortida: Tm9tOiBEYXZpZDsgSUQ6IDQy

// Fixa't que la sortida és un 33% més llarga i només conté caràcters alfanumèrics o els símbols de Base64.
?>
```

<div _ngcontent-ng-c2531377157="" class="code-block ng-tns-c2531377157-103 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_278fbd82435566e6","c_f93da456ed382884",null,"rc_38fa53b829fa2058",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c2531377157="" class="formatted-code-block-internal-container ng-tns-c2531377157-103"><div _ngcontent-ng-c2531377157="" class="animated-opacity ng-tns-c2531377157-103"></div></div></div><div _ngcontent-ng-c1448405485="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--2" inline-copy-host=""></div>### Decodificació (Decode)

La funció `base64_decode()` inverteix el procés, convertint la cadena Base64 a la seva dada binària o de text original.

<div _ngcontent-ng-c1448405485="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--3" inline-copy-host=""></div><div _ngcontent-ng-c2531377157="" class="code-block ng-tns-c2531377157-104 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php-1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_278fbd82435566e6","c_f93da456ed382884",null,"rc_38fa53b829fa2058",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c2531377157="" class="code-block-decoration header-formatted gds-title-s ng-tns-c2531377157-104 ng-star-inserted"><span class="ng-tns-c2531377157-104">PHP</span><div _ngcontent-ng-c2531377157="" class="buttons ng-tns-c2531377157-104 ng-star-inserted"><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c2531377157-104 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c2531377157="" class="formatted-code-block-internal-container ng-tns-c2531377157-104"><div _ngcontent-ng-c2531377157="" class="animated-opacity ng-tns-c2531377157-104"></div></div></div>```php
<?php
// Dades codificades que hem rebut
$dades_codificades = "Tm9tOiBEYXZpZDsgSUQ6IDQy";

// Decodificació Base64
$dades_restaurades = base64_decode($dades_codificades);

echo "Dades codificades: " . $dades_codificades . "\n";
echo "Dades restaurades: " . $dades_restaurades . "\n";
// Sortida: Nom: David; ID: 42
?>
```

<div _ngcontent-ng-c2531377157="" class="code-block ng-tns-c2531377157-104 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--4" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_278fbd82435566e6","c_f93da456ed382884",null,"rc_38fa53b829fa2058",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c2531377157="" class="formatted-code-block-internal-container ng-tns-c2531377157-104"><div _ngcontent-ng-c2531377157="" class="animated-opacity ng-tns-c2531377157-104"></div></div></div><div _ngcontent-ng-c1448405485="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--5" inline-copy-host=""></div>### Altres casos: Dades Binàries

Com en el cas d'un xifratge, si xifres una dada amb `openssl_encrypt()`, el resultat és binari. **És obligatori** codificar aquest resultat en Base64 abans d'emmagatzemar-lo a la majoria de bases de dades (que esperen text) o abans d'enviar-lo per JSON/XML, i decodificar-lo abans de desxifrar-lo.

<div _ngcontent-ng-c1448405485="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--6" inline-copy-host=""></div><div _ngcontent-ng-c2531377157="" class="code-block ng-tns-c2531377157-105 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-php-2" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_278fbd82435566e6","c_f93da456ed382884",null,"rc_38fa53b829fa2058",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c2531377157="" class="code-block-decoration header-formatted gds-title-s ng-tns-c2531377157-105 ng-star-inserted"><span class="ng-tns-c2531377157-105">PHP</span><div _ngcontent-ng-c2531377157="" class="buttons ng-tns-c2531377157-105 ng-star-inserted"><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c2531377157-105 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c2531377157="" class="formatted-code-block-internal-container ng-tns-c2531377157-105"><div _ngcontent-ng-c2531377157="" class="animated-opacity ng-tns-c2531377157-105"></div></div></div>```php
<?php
// === Paràmetres de Seguretat (HA DE SER SECRET) ===
$clau = "UnaClauSecretaDe32BytesPerAES256"; // Clau de 32 bytes (256 bits)
$metode_aes = 'AES-256-CBC'; 

// 1. Dades a Xifrar i Generació d'IV

$dades_originals = "Aquesta és la meva informació sensible a guardar.";
$iv_length = openssl_cipher_iv_length($metode_aes);
$iv_binari = openssl_random_pseudo_bytes($iv_length);

// Xifratge (Resultat Binari)
$dades_xifrades_binaries = openssl_encrypt($dades_originals, $metode_aes, $clau, 0, $iv_binari);

echo "1. Dades originals: " . $dades_originals . "\n";
echo "--- Iniciant Transmissió/Emmagatzematge ---\n";

// 2. Codificació Base64 (Preparació per a Emmagatzematge/Transmissió)

// Combinem les dades xifrades i l'IV (amb un separador '::') i les codifiquem totes dues.
$dades_combinades = $dades_xifrades_binaries . '::' . $iv_binari;
$dades_per_emmagatzemar = base64_encode($dades_combinades);

echo "2. Dades Xifrades i Codificades (Base64 per a BDD): " . $dades_per_emmagatzemar . "\n";
echo "--------------------------------------------------\n";


// === RECUPERACIÓ DE LA BASE DE DADES ===


// 3. Descodificació Base64 (Recuperació de les Dades Binàries)

$dades_recuperades = base64_decode($dades_per_emmagatzemar);

// Separem el text xifrat de l'IV
list($dades_xifrades_recuperades, $iv_recuperat) = explode('::', $dades_recuperades, 2);

// 4. Desxifratge (Decrypt)

// Utilitzem la CLAU SECRETA ($clau) i l'IV recuperat per desxifrar.
$dades_desxifrades = openssl_decrypt($dades_xifrades_recuperades, $metode_aes, $clau, 0, $iv_recuperat);

echo "3. Dades Desxifrades (Text Clar): " . $dades_desxifrades . "\n";

// Validació
if ($dades_originals === $dades_desxifrades) {
    echo " El procés complet de xifratge/codificació/desxifratge ha estat correcte.";
} else {
    echo " Error en el procés de desxifratge.";
}
?>
```

<div _ngcontent-ng-c2531377157="" class="code-block ng-tns-c2531377157-105 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--7" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_278fbd82435566e6","c_f93da456ed382884",null,"rc_38fa53b829fa2058",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c2531377157="" class="formatted-code-block-internal-container ng-tns-c2531377157-105"><div _ngcontent-ng-c2531377157="" class="animated-opacity ng-tns-c2531377157-105"></div></div></div><div _ngcontent-ng-c1448405485="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--8" inline-copy-host=""></div>