Spanish (Español) translation by Ana Paulina Figueroa (you can also view the original English article)
En este artículo rápido, analizaremos los conceptos básicos de la codificación Base64 en el contexto de PHP. Básicamente veremos cómo puedes usar las funciones de PHP para transformar datos al formato codificado en Base64.
¿Qué es la codificación Base64?
Base64 es una codificación de datos binarios en ASCII. Cada carácter de la cadena representa seis bits de información. De manera efectiva, muestra los datos binarios en la representación Base64. Consulta este manual sobre sistemas numéricos y bases si necesitas un repaso.
La codificación Base64 se usa principalmente para codificar datos binarios en texto ASCII, en situaciones en las que quieres transferir dichos datos a través de protocolos diseñados específicamente para el manejo de datos de tipo texto. Esto garantiza que los datos permanezcan intactos mientras son transportados. Específicamente, Base64 se usa para tareas como el envío de correos electrónicos y la carga de datos binarios en formularios HTML.
Otro uso común de la codificación Base64 es el hashing. Por supuesto, no deberías usar la codificación Base64 en sí para generar hashes, ya que se puede decodificar fácilmente. En primer lugar, debes generar un hash con la ayuda de un algoritmo hash como SHA, y luego debes convertir el hash resultante al formato codificado en Base64 para mostrarlo. Es muy fácil comparar dos sumas de verificación codificadas en Base64 para la comprobación de la integridad.
En la siguiente sección discutiremos las funciones de Base64 integradas en PHP.
Funciones de Base64 en PHP
En PHP existen dos funciones principales que se ocupan de la codificación Base64. La función base64_encode
te permite codificar datos en el formato Base64 de MIME. Por otro lado, la función base64_decode
se usa para decodificar los datos codificados en Base64 de MIME.
Revisemos cada una de estas funciones a detalle.
base64_encode
Analicemos la sintaxis de la función base64_encode
.
1 |
base64_encode ( string $string ) : string |
El único argumento que necesitas enviar a la función base64_encode
es la cadena de origen que quieras codificar a Base64 de MIME.
Esta devuelve una cadena codificada en Base64. Es importante tomar en cuenta que los datos codificados en Base64 ocupan aproximadamente un 33% más de espacio en la memoria que los datos originales.
base64_decode
Analicemos la sintaxis de la función base64_decode
.
1 |
base64_decode ( string $string , bool $strict = false ) : string|false |
El primer argumento son los datos codificados en Base64 que desees decodificar.
El segundo argumento es opcional, pero si envías TRUE
la función realizará una comprobación estricta. Esto significa que si los datos codificados en Base64 contienen caracteres que no pertenecen al alfabeto de Base64, la función de decodificación devolverá el valor FALSE
. Esto es útil para verificar la integridad de la cadena codificada en Base64. Por otro lado, si deseas descartar caracteres no válidos de manera silenciosa, simplemente envía FALSE
, que es el valor predeterminado.
La función devuelve la cadena decodificada si la decodificación es exitosa; de lo contrario, devuelve FALSE
. Es importante tomar en cuenta que la función base64_decode
puede devolver datos binarios si la cadena en cuestión estaba en formato binario antes de la codificación.
En la siguiente sección discutiremos cómo puedes usar funciones integradas de Base64 en PHP.
Cómo codificar y decodificar datos con Base64 de MIME
En esta sección analizaremos un par de ejemplos para ver las funciones de Base64 en acción.
Codifica parámetros de tipo URL
La mayoría de las veces terminarás usando la función base64_encode
para codificar parámetros que contienen URL.
Veamos rápidamente cómo funciona esto con el siguiente ejemplo.
1 |
<?php
|
2 |
$redirectUrl = 'https://www.example.com/some/other/url'; |
3 |
|
4 |
header('Location: https://www.example.com/redirect/' . base64_encode($redirectUrl)); |
5 |
//https://www.example.com/redirect/aHR0cDovL3d3dy5leGFtcGxlLmNvbS9zb21lL290aGVyL3VybA==
|
6 |
?>
|
Como puedes ver, si no usamos la función base64_encode
, el URL resultante se vería como https://www.example.com/redirect/https://www.example.com/some/other/url
, lo que no es válido.
Suma de verificación codificada en Base64
Como discutimos anteriormente, la función base64_encode
es útil al convertir datos binarios en una cadena ASCII.
Echemos un vistazo al siguiente ejemplo.
1 |
<?php
|
2 |
$base64_encoded_hash = base64_encode(hash_hmac('sha1', 'Source string to be hashed.', 'YOUR_TOP_SECRET_KEY', true)); |
3 |
?>
|
En el ejemplo anterior, la función hash_hmac
devolvería datos binarios con hash. Por lo tanto, si no usas la función base64_encode
sería difícil mostrar los datos binarios resultantes.
Archivos adjuntos de correos electrónicos
En PHP, cuando envías un correo electrónico con archivos adjuntos puedes codificar el contenido del archivo en el formato codificado en Base64. De hecho, si estás enviando archivos adjuntos binarios, es esencial que codifiques los datos adjuntos en lugar de enviarlos en formato sin procesar.
Echemos un vistazo al siguiente ejemplo.
1 |
<?php
|
2 |
$to = 'receiver@example.com'; |
3 |
$subject = 'Example of base64 encoded attachments'; |
4 |
$message = 'This email contains an image attachment.'; |
5 |
$boundary = md5(microtime()); |
6 |
|
7 |
$headers = "From: name <from@example.com>" . "\r\n"; |
8 |
$headers .= "MIME-Version: 1.0" . "\r\n"; |
9 |
$headers .= "Content-Type: multipart/mixed; boundary=" . $boundary . "\r\n"; |
10 |
$headers .= "Multipart MIME example." . "\r\n"; |
11 |
|
12 |
$message.= "--" . $boundary. "\r\n"; |
13 |
$message.= "Content-Type: text/plain; charset=\"iso-8859-1\"" . "\r\n"; |
14 |
$message.= "Content-Transfer-Encoding: 8bit" . "\r\n"; |
15 |
$message.= $message . "\r\n"; |
16 |
|
17 |
// attach file
|
18 |
$filename = 'nature.jpg'; |
19 |
$filecontents = file_get_contents($filename); |
20 |
$filecontents = chunk_split(base64_encode($filecontents)); |
21 |
|
22 |
$message.= "--" . $boundary. "\r\n"; |
23 |
$message.= "Content-Type: image/jpg; name=\"" . $filename . "\"" . "\r\n"; |
24 |
$message.= "Content-Transfer-Encoding: base64" . "\r\n"; |
25 |
$message.= "Content-Disposition: attachment" . "\r\n"; |
26 |
$message.= $filecontents . "\r\n"; |
27 |
$message.= "--" . $boundary. "--"; |
28 |
|
29 |
mail($mailto, $subject, $body, $headers); |
30 |
?>
|
Como puedes ver, hemos usado la función base64_encode
para codificar datos binarios de tipo imagen antes de enviarlos como datos adjuntos.
De esta manera puedes usar las funciones de Base64 en PHP para diversos propósitos.
Conclusión
En este artículo rápido discutimos cómo puedes usar funciones de Base64 en tu desarrollo cotidiano con PHP.