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).
-
Grup de 3 Bytes: Agrupa les dades binàries d'entrada en blocs de 3 bytes (24 bits).
-
Conversió a 4 Grups: Aquests 24 bits es divideixen en 4 grups de 6 bits cadascun.
-
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
// 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
// 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
// === 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.";
}
?>