Ves al contingut principal

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

  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.

CONSEQÜÈNCIA: El Base64 sempre augmenta la mida de la dada d'entrada en aproximadament un 33% (de 3 bytes a 4 caràcters).

Exemple

S'utilitza habitualment per:

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

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.

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

 

Decodificació (Decode)

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

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
?>

 

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.

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.";
}
?>