Pregunta

He escuchado a personas hablando sobre la codificación de " base 64 " aquí y allá. ¿Para qué se utiliza?

¿Fue útil?

Solución

Cuando tiene algunos datos binarios que desea enviar a través de una red, generalmente no lo hace simplemente transmitiendo los bits y bytes a través del cable en un formato en bruto. ¿Por qué? Porque algunos medios están hechos para transmitir texto. Nunca se sabe, algunos protocolos pueden interpretar sus datos binarios como caracteres de control (como un módem), o sus datos binarios podrían ser arruinados porque el protocolo subyacente podría pensar que ha ingresado una combinación de caracteres especiales (como la forma en que FTP traduce la línea). terminaciones).

Así que para solucionar esto, las personas codifican los datos binarios en caracteres. Base64 es uno de estos tipos de codificaciones.

¿Por qué 64?
Debido a que generalmente puede confiar en que los mismos 64 caracteres están presentes en muchos juegos de caracteres, y puede estar razonablemente seguro de que sus datos terminarán en el otro lado del cable no corrompido.

Otros consejos

Es básicamente una forma de codificar datos binarios arbitrarios en texto ASCII. Toma 4 caracteres por 3 bytes de datos, y potencialmente un poco de relleno al final.

Esencialmente, cada 6 bits de la entrada se codifica en un alfabeto de 64 caracteres. El " estándar " el alfabeto usa A-Z, a-z, 0-9 y + y /, con = como un carácter de relleno. Hay variantes de URL seguras.

Wikipedia es una fuente razonablemente buena de más información.

La codificación Base-64 es una forma de tomar datos binarios y convertirlos en texto para que se transmita más fácilmente en cosas como correo electrónico y datos de formularios HTML.

http://en.wikipedia.org/wiki/Base64

Es una codificación textual de datos binarios donde el texto resultante no tiene más que letras, números y los símbolos " + " ;, " / " y " = " ;. Es una forma conveniente de almacenar / transmitir datos binarios a través de medios que se utilizan específicamente para datos textuales.

Pero ¿por qué Base-64? Las dos alternativas para convertir datos binarios en texto que vienen inmediatamente a la mente son:

  1. Decimal: almacene el valor decimal de cada byte como tres números: 045 112 101 037 etc. donde cada byte se representa por 3 bytes. Los datos se multiplican por tres.
  2. Hexadecimal: almacena los bytes como pares de hex: AC 47 0D 1A, etc. donde cada byte está representado por 2 bytes. Los datos se multiplican por dos.

Base-64 asigna 3 bytes (8 x 3 = 24 bits) en 4 caracteres que abarcan 6 bits (6 x 4 = 24 bits). El resultado se ve algo así como " TWFuIGlzIGRpc3Rpb ... " Por lo tanto, la hinchazón es solo 4/3 = 1.3333333 veces el original.

Aparte de lo que ya se ha dicho, dos usos muy comunes que no se han enumerado son

Hashes :

Los hash son funciones unidireccionales que transforman un bloque de bytes en otro bloque de bytes de un tamaño fijo como 128bit o 256bit (SHA / MD5). Convertir los bytes resultantes en Base64 hace que sea mucho más fácil mostrar el hash, especialmente cuando se compara una suma de comprobación de integridad. Los hash se ven tan a menudo en Base64 que mucha gente confunde a Base64 con un hash.

Criptografía:

Dado que una clave de cifrado no tiene que ser texto sino bytes en bruto, a veces es necesario almacenarlo en un archivo o base de datos, lo que hace que Base64 sea útil. Lo mismo con los bytes encriptados resultantes.

Tenga en cuenta que aunque Base64 se utiliza a menudo en criptografía no es un mecanismo de seguridad. Cualquiera puede convertir la cadena Base64 de nuevo a sus bytes originales, por lo que no debe utilizarse como un medio para proteger datos, solo como un formato para mostrar o almacenar bytes en bruto más fácilmente.

Certificados

Los certificados x509 en formato PEM están codificados en base 64. http://how2ssl.com/articles/working_with_pem_files/

De http://en.wikipedia.org/wiki/Base64

  

El término Base64 se refiere a una codificación de transferencia de contenido MIME específica.   También se usa como un término genérico para cualquier esquema de codificación similar que   codifica datos binarios tratándolos numéricamente y traduciéndolos a   Una representación de base 64. La elección particular de la base se debe a la   historial de codificación de conjuntos de caracteres: se puede elegir un conjunto de 64   caracteres que forman parte del subconjunto común a la mayoría de las codificaciones,   y tambien para imprimir. Esta combinación hace que los datos sean poco probables.   modificado en tránsito a través de sistemas, como el correo electrónico, que fueron   Tradicionalmente no es limpio de 8 bits.

     

Base64 se puede utilizar en una variedad de contextos:

     
      
  • Evolution y Thunderbird usan Base64 para ofuscar contraseñas de correo electrónico [1]
  •   
  • Se puede usar Base64 para transmitir y almacenar texto que, de lo contrario, podría causar la colisión del delimitador
  •   
  • Base64 se usa a menudo como un atajo rápido pero inseguro para ocultar secretos sin incurrir en la sobrecarga de la administración de claves criptográficas

  •   
  • Los spammers utilizan Base64 para evadir las herramientas básicas de antispam, que a menudo no descodifican Base64 y, por lo tanto, no pueden detectar palabras clave codificadas   mensajes

  •   
  • Base64 se usa para codificar cadenas de caracteres en archivos LDIF
  •   
  • Base64 se usa a veces para incrustar datos binarios en un archivo XML, usando una sintaxis similar a ...... por ejemplo.   Los marcadores de Firefox.html.
  •   
  • Base64 también se usa cuando se comunica con dispositivos de impresión de firmas fiscales del gobierno (generalmente, a través de puertos seriales o paralelos) para   Minimice el retraso al transferir los caracteres del recibo para la firma.
  •   
  • Base64 se utiliza para codificar archivos binarios, como imágenes dentro de scripts, para evitar depender de archivos externos.
  •   
  • Se puede usar para incrustar datos de imágenes en bruto en una propiedad CSS como la imagen de fondo.
  •   

En los primeros días de las computadoras, cuando la comunicación entre sistemas de la línea telefónica no era particularmente confiable, un rápido y amp; Se utilizó un método sucio para verificar la integridad de los datos: " paridad de bits " ;. En este método, cada byte transmitido tendría 7 bits de datos, y el octavo sería 1 o 0, para forzar que el número total de 1 bits en el byte sea par.

Por lo tanto, 0x01 sería transmitido como 0x81; 0x02 sería 0x82; 0x03 permanecería 0x03 etc.

Para mejorar este sistema, cuando se definió el conjunto de caracteres ASCII, solo se asignaron caracteres 00-7F. (Aún hoy, todos los caracteres establecidos en el rango 80-FF no son estándar)

Muchos enrutadores del día ponen la comprobación de paridad y la traducción de bytes en hardware, lo que obliga a las computadoras conectadas a ellos a tratar estrictamente con datos de 7 bits. Esto obliga a que los archivos adjuntos del correo electrónico (y todos los demás datos, por lo que los protocolos HTTP y amp; SMTP estén basados ??en texto), se conviertan a un formato de solo texto.

Pocos de los enrutadores sobrevivieron hasta los años 90. Dudo mucho que alguno de ellos esté en uso hoy.

Algunos protocolos de transporte solo permiten la transmisión de caracteres alfanuméricos. Imagine una situación en la que los caracteres de control se utilizan para desencadenar acciones especiales y / o que solo admiten un ancho de bits limitado por carácter. Base64 transforma cualquier entrada en una codificación que solo utiliza caracteres alfanuméricos, + , / y el = como un carácter de relleno.

El uso de Base64 que voy a describir aquí es un tanto hack. Así que si no te gustan los hacks, no sigas.

Me metí en problemas cuando descubrí que utf8 de MySQL no es compatible con caracteres Unicode de 4 bytes, ya que utiliza una versión de utf8 de 3 bytes. Entonces, ¿qué hice para admitir el código Unicode completo de 4 bytes sobre el utf8 de MySQL? Bueno, la base64 codifica las cadenas cuando se almacenan en la base de datos y la base64 se decodifica al recuperar.

Dado que la codificación y decodificación de base64 es muy rápida, lo anterior funcionó perfectamente.

Tienes los siguientes puntos para tomar nota de:

  • La codificación Base64 utiliza un 33% más de almacenamiento

  • Las cadenas almacenadas en la base de datos no serán legibles para el ser humano (podría vender eso como una característica de que las cadenas de la base de datos utilizan una forma básica de cifrado).

Puede usar el método anterior para cualquier motor de almacenamiento que no sea compatible con Unicode.

Se utiliza para convertir datos binarios arbitrarios a texto ASCII.

Por ejemplo, los archivos adjuntos de correo electrónico se envían de esta manera.

Lo uso en un sentido práctico cuando transferimos grandes objetos binarios (imágenes) a través de servicios web. Entonces, cuando estoy probando un servicio web de C # usando un script de Python, el objeto binario se puede recrear con un poco de magia.

[En python]

import base64
imageAsBytes = base64.b64decode( dataFromWS )
Los esquemas de codificación

& # 8220; Base64 se usan comúnmente cuando existe la necesidad de codificar datos binarios que necesitan ser almacenados y transferidos a través de medios diseñados para tratar con datos textuales. Esto es para garantizar que los datos permanezcan intactos sin modificaciones durante el transporte & # 8221; (Wiki, 2017)

El ejemplo podría ser el siguiente: tienes un servicio web que acepta solo caracteres ASCII. Desea guardar y luego transferir los datos del usuario a otra ubicación (API), pero el destinatario desea recibir los datos intactos. Base64 es para eso. . . El único inconveniente es que la codificación base64 requerirá un 33% más de espacio que las cadenas normales.

Otro ejemplo :: uenc = url codificado = aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggfgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg : //loc.querytip.com/asics-men-s-gel-kayano-xii.html .

Como puede ver, no podemos & # 8217; t poner char & # 8220; / & # 8221; en la URL si queremos enviar la última URL visitada como parámetro porque romperíamos la regla de atributo / valor para & # 8220; MOD rewrite & # 8221; & # 8211; Parámetro GET.

Un ejemplo completo sería: & # 8220; http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics -men-s-gel-kayano-xii.html / product / 93 / & # 8221;

Principalmente, he visto que se utiliza para codificar datos binarios en contextos que solo pueden manejar ascii, o simplemente conjuntos de caracteres.

Para ampliar un poco lo que Brad está diciendo: muchos mecanismos de transporte para correo electrónico y Usenet y otras formas de mover datos no están "limpios a 8 bits", lo que significa que los caracteres que se encuentran fuera del conjunto de caracteres ascii estándar pueden modificarse en tránsito - por ejemplo, 0x0D puede verse como un retorno de carro, y convertido en un retorno de carro y avance de línea. Base 64 asigna todos los caracteres binarios en varias letras y números ascii estándar y puntuación para que no se dañen de esta manera.

Hace años, cuando se introdujo la funcionalidad de envío de correos, se basó totalmente en el texto, a medida que pasaba el tiempo, la necesidad de adjuntos como imágenes y medios (audio, video, etc.) comenzó a existir. Cuando estos archivos adjuntos se envían por Internet (que es básicamente en forma de datos binarios), la probabilidad de que los datos binarios se corrompan es alta en su forma original. Entonces, para abordar este problema, apareció BASE64.

El problema con los datos binarios es que contiene caracteres nulos que en algunos lenguajes como C, C ++ representan el final de la cadena de caracteres, por lo que el envío de datos binarios en forma sin formato que contiene bytes NULOS evitará que un archivo se lea completamente y dará lugar a una corrupción. datos.

Por ejemplo:

En C y C ++, este " nulo " El carácter muestra el final de una cadena. Así que " HOLA " se almacena así:

H E L L O

72 69 76 76 79 00

El 00 dice " detente aquí " ;.

Ahora vamos a & # 8217; s sumergirnos en cómo funciona la codificación BASE64.

Punto a tener en cuenta: la longitud de la cadena debe estar en múltiplos de 3.

Ejemplo 1:

Cadena para codificar: & # 8220; ace & # 8221 ;, Longitud = 3

1) Convierte cada carácter a decimal.

a = 97, c = 99, e = 101

 ingrese la descripción de la imagen aquí

2) Cambia cada decimal a representación binaria de 8 bits.

97 = 01100001, 99 = 01100011, 101 = 01100101

Combinado: 01100001 01100011 01100101

3) Sepárese en un grupo de 6 bits.

011000 010110 001101 100101

4) Calcular binario a decimal

011000 = 24, 010110 = 22, 001101 = 13, 100101 = 37

5) Convierta los caracteres decimales a base64 usando el gráfico base64.

24 = Y, 22 = W, 13 = N, 37 = l

& # 8220; ace & # 8221; = > & # 8220; YWNl & # 8221;

 ingrese la descripción de la imagen aquí

Ejemplo 2:

Cadena para codificar: & # 8220; abcd & # 8221; Longitud = 4, no es múltiplo de 3. Por lo tanto, para hacer que la longitud de la cadena sea 3, debemos agregar 2 bits de relleno para que la longitud sea igual a 6. El espacio de relleno se representa con & # 8220; = & # 8221; signo.

Punto a tener en cuenta: un bit de relleno es igual a dos ceros 00, por lo que dos bits de relleno es igual a cuatro ceros 0000.

Así que comencemos el proceso: & # 8211;

1) Convierte cada carácter a decimal.

a = 97, b = 98, c = 99, d = 100

2) Cambia cada decimal a representación binaria de 8 bits.

97 = 01100001, 98 = 01100010, 99 = 01100011, 100 = 01100100

3) Separar en un grupo de 6 bits.

011000, 010110, 001001, 100011, 011001, 00

por lo que el último 6 bits no está completo, por lo que insertamos dos bits de relleno que equivalen a cuatro ceros & # 8220; 0000 & # 8221 ;.

011000, 010110, 001001, 100011, 011001, 000000 ==

Ahora, es igual. Dos signos de igual al final muestran que se agregaron 4 ceros (ayuda en la decodificación).

4) Calcular binario a decimal.

011000 = 24, 010110 = 22, 001001 = 9, 100011 = 35, 011001 = 25, 000000 = 0 ==

5) Convierta los caracteres decimales a base64 usando el gráfico base64.

24 = Y, 22 = W, 9 = j, 35 = j, 25 = Z, 0 = A ==

& # 8220; abcd & # 8221; = > & # 8220; YWJjZA == & # 8221;

Base64

Base64 es un término genérico para una serie de esquemas de codificación similares que codifican datos binarios al tratarlos numéricamente y traducirlos a una representación de base 64. El término Base64 se origina a partir de una codificación de transferencia de contenido MIME específica.

Los esquemas de codificación Base64 se usan comúnmente cuando existe la necesidad de codificar datos binarios que necesitan ser almacenados y transferidos a través de medios que están diseñados para tratar con datos textuales. Esto es para asegurar que los datos permanezcan intactos sin modificaciones durante el transporte. Base64 se usa comúnmente en varias aplicaciones, incluido el correo electrónico a través de MIME y el almacenamiento de datos complejos en XML.

Base64 se puede utilizar para muchos propósitos.

El motivo principal es convertir los datos binarios en algo pasable.

A veces lo uso para pasar datos JSON de un sitio a otro, almacenar información en las cookies de un usuario.

Nota: Tú " puedes " utilícelo para el cifrado: no veo por qué la gente dice que no puede hacerlo, y que no es un cifrado, aunque sería fácil de romper y está mal visto. El cifrado no significa nada más que convertir una cadena de datos en otra cadena de datos que se puede descifrar más tarde o no, y eso es lo que hace base64.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top