2008-10-14 24 views

Respuesta

677

Cuando tenga datos binarios que usted quiere enviar a través de una red, por lo general no hacerlo simplemente por la transmisión de los bits y bytes sobre el alambre 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 estropearse porque el protocolo subyacente podría pensar que ha ingresado una combinación especial de caracteres (como cómo FTP traduce la línea) terminaciones).

Para evitar esto, las personas codifican los datos binarios en caracteres. Base64 es uno de estos tipos de codificaciones.

¿Por qué 64?
Porque generalmente puede confiar en los mismos 64 caracteres que están presentes en muchos juegos de caracteres, y puede estar razonablemente seguro de que sus datos van a estar del otro lado del cable sin daños.

+72

(En teoría, podría hacer codificación base-80 o algo similar, pero sería significativamente más difícil. Las potencias de dos son bases naturales para el binario.) –

+8

@yokees: No hay garantía, son solo caracteres que son * casi siempre * seguro. Esta es la razón por la cual hay múltiples formas de Base-64 (http://en.wikipedia.org/wiki/Base-64). –

+1

@Jon - ¿qué variante usa el navegador cuando coloco Base64 en una etiqueta de imagen? –

94

base 64 codificación es una forma de tomar los datos binarios y convertirlo en texto para que se transmite más fácilmente en cosas como datos de correo electrónico y de formulario HTML.

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

4

Sobre todo, he visto que se usa para codificar datos binarios en contextos que sólo pueden manejar ASCII - o - un simple juego de caracteres.

6

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.

158

Básicamente es una forma de codificar datos binarios arbitrarios en texto ASCII. Toma 4 caracteres por cada 3 bytes de datos, más posiblemente un poco de relleno al final.

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

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

+0

En un langange como PHP, eran datos binarios se vienen. Casi siempre trabajamos con datos de cadena que son texto. –

+3

@CholthiPaulTtiopic: los resultados de encriptación o compresión, o sonido/imágenes/video. –

+0

¿qué ocurre con el almacenamiento, php no parece tener datos binarios tipo –

9

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

3

Para ampliar un poco en lo que Brad está diciendo: muchos mecanismos de transporte para el correo electrónico y Usenet y otras formas de mover los datos no son "de 8 bits limpio", lo que significa que los caracteres fuera del conjunto de caracteres ASCII estándar podrían ser destrozados en tránsito - Por ejemplo, 0x0D puede verse como un retorno de carro, y se convierte en un retorno de carro y avance de línea. La Base 64 mapea todos los caracteres binarios en varias letras ascii estándar y números y signos de puntuación para que no se arruinen de esta manera.

21

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

El término Base64 se refiere a una codificación específica de la transferencia de contenido MIME. También se utiliza como un término genérico para cualquier esquema de codificación similar que codifica datos binarios tratándolo numéricamente y traducirlo en una base 64 la representación. La elección particular de la base se debe a la historia del juego de caracteres de codificación: se puede elegir un conjunto de 64 caracteres que es a la vez parte del subconjunto común a la mayoría de las codificaciones, y también imprimible. Esta combinación deja poco probable que los datos sean modificados en tránsito a través de sistemas, como el correo electrónico, que tradicionalmente no eran de 8 bits, .

Base64 se puede utilizar en una variedad de contextos:

    contraseñas
  • Evolución y Thunderbird uso Base64 para ofuscar correo electrónico [1]
  • Base64 se puede utilizar para transmitir y almacenar texto que de otro modo causa delimitador de colisión
  • base 64 se utiliza a menudo como un atajo rápido pero insegura para ocultar secretos sin incurrir en los gastos generales de gestión de claves criptográficas

  • nosotros los spammers e Base64 para evadir las herramientas básicas antispam, que a menudo no decodifican Base64 y, por lo tanto, no pueden detectar palabras clave en los mensajes codificados.

  • base 64 se utiliza para codificar cadenas de caracteres en archivos LDIF
  • base 64 se utiliza a veces para incrustar datos binarios en un archivo XML, utilizando una sintaxis similar al ejemplo ...... Marcadores de Firefox.html.
  • Base64 también se utiliza cuando se comunica con dispositivos de impresión de firma fiscal del gobierno (generalmente, a través de puertos serie o paralelo) a minimiza el retraso al transferir caracteres de 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 utilizar para incrustar datos de imágenes en bruto en una propiedad de CSS, como background-image.
90

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 los medios que se utilizan específicamente para datos de texto.

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

  1. decimal: almacenar el valor decimal de cada byte como tres números: 045 112 101 037 etc., donde cada byte está representado por 3 bytes. La información se triplica.
  2. Hexadecimal: almacena los bytes como pares hexadecimales: AC 47 0D 1A etc. donde cada byte se representa con 2 bytes. Los datos se duplican.

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 parece a "TWFuIGlzIGRpc3Rpb ...". Por lo tanto, la hinchazón es solo un mero 4/3 = 1.3333333 veces el original.

+4

¿Entiendo correctamente que 64 es la mejor opción, ya que es la mayor potencia de dos que se puede convertir en un carácter ASCII imprimible (hay 95)? – voho

+0

@voho Sí, eso es correcto! –

13

En los primeros días de las computadoras, cuando la comunicación entre sistemas de la línea telefónica no era particularmente confiable, se usaba 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 8vo sería 1 o 0, para forzar el número total de 1 bits en el byte para que sea par.

Por lo tanto, 0x01 se transmitiría como 0x81; 0x02 sería 0x82; 0x03 seguiría siendo 0x03, etc.

Para ampliar este sistema, cuando se definió el conjunto de caracteres ASCII, solo se asignaron caracteres a 00-7F. (Todavía hoy, todos los caracteres configurados en el rango 80-FF no son estándar)

Muchos enrutadores del día ponen el control de paridad y la traducción de bytes en el hardware, forzando a las computadoras conectadas a ellos a tratar estrictamente con 7 bits datos. Esto fuerza los archivos adjuntos de correo electrónico (y todos los demás datos, que es por qué HTTP & protocolos SMTP están basados ​​en texto), para convertirlos en 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.

+0

Este es un excelente punto de discusión y una interesante lección de historia, gracias. – Dan

6

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# utilizando un script de Python, el objeto binario se puede recrear con un poco de magia.

[en Python]

import base64 
imageAsBytes = base64.b64decode(dataFromWS) 
+1

¿Los datos viajan más rápido? – FelipeM

58

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

hashes:

hashes son funciones unidireccionales que transforman un bloque de bytes en otro bloque de bytes de un tamaño fijo, como 128 bits o 256 bits (SHA/MD5). La conversión de 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 para la integridad. Los hash se ven tan a menudo en Base64 que mucha gente confunde a Base64 como un hash.

Criptografía:

Desde una clave de cifrado no tiene que ser un texto, sino bytes sin que a veces es necesario almacenar en un archivo o base de datos, que Base64 viene muy bien para. Lo mismo con los bytes cifrados resultantes.

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

Certificados

certificados X509 en formato PEM son base 64 codificada.http://how2ssl.com/articles/working_with_pem_files/

+4

En realidad, es más fácil, en el proceso, almacenar bytes como bytes en muchos casos. Incluso en una base de datos, y * especialmente * en un archivo (si se usan registros de longitud fija, o los bytes son el único contenido). Base64 se usa normalmente cuando esos bytes están destinados * a ser * transmitidos * en algún lugar, particularmente sobre un canal que puede cortar bits o interpretar algunos de los bytes como códigos de control. – cHao

+0

Nunca he visto un hash escrito como enteros de 8 bits sin signo, 0,1,255,36 ... y mostrarlo con UTF-8 o cualquier otra codificación no tendría sentido, ¿cómo se podría mostrar de otra manera que con base64 ? Las claves de cifrado y los datos cifrados a menudo se almacenan en archivos de configuración y XML donde no se pueden almacenar los bytes sin formato. Estoy de acuerdo si puedes almacenarlo como bytes sin procesar, entonces, por supuesto, pero base64 es para aquellas situaciones en las que no puedes. Hay muchos usos de base64 más allá de la transmisión. Estos son simplemente dos escenarios comunes donde lo verá. – Despertar

+0

Debería mostrar el hash como hexadecimal, no decimal. Para los hash, de hecho es mucho más común que base64. – cHao

2

Base64

Base64 es un término genérico para un número de esquemas de codificación similares que codifican datos binarios tratándolo numéricamente y traducirlo en un 64 representación base. El término Base64 se origina a partir de una codificación de transferencia de contenido MIME específica.

Los esquemas de codificación de Base64 se usan comúnmente cuando existe la necesidad de codificar datos binarios que deben almacenarse y transferirse a través de medios diseñados para tratar datos textuales. Esto es para garantizar que los datos permanezcan intactos sin modificaciones durante el transporte. Base64 se utiliza comúnmente en una serie de aplicaciones, incluido el correo electrónico a través de MIME, y el almacenamiento de datos complejos en XML.

0

Base64 se puede utilizar para muchos propósitos.

La razón principal es convertir datos binarios a 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: Usted "puede" usarlo para el cifrado - No veo por qué la gente dice que no puede, y que no es encriptación, aunque sería fácilmente divisible y está mal visto. El cifrado no significa nada más que convertir una cadena de datos en otra cadena de datos que puede ser descifrada o no posteriormente, y eso es lo que hace base64.

+5

[La diferencia entre el cifrado y la codificación] (http://stackoverflow.com/questions/4657416/difference-between-encoding-and-encryption). –

+1

Está interpretando la definición de "cifrado" * ahora * demasiado literalmente. La palabra se ha convertido en algo bastante más específico que sus orígenes. – Dan

7

El uso de Base64 que voy a describir aquí es algo así como un truco. Entonces, si no te gustan los hacks, no sigas.

Tuve problemas cuando descubrí que el utf8 de MySQL no admite caracteres Unicode de 4 bytes ya que usa una versión de 3 bytes de utf8. Entonces, ¿qué hice para soportar unicode completo de 4 bytes sobre el utf8 de MySQL? Bueno, base64 codifica cadenas cuando se almacena en la base de datos y decodificación base64 cuando se recupera.

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

usted tiene los siguientes puntos a tomar nota de:

  • base 64 utiliza la codificación 33% más capacidad de almacenamiento

  • cadenas almacenadas en la base de datos no será legible (Usted podría vender que como una característica las cadenas de bases de datos usan una forma básica de encriptación).

Puede utilizar el método anterior para cualquier motor de almacenamiento que no admita unicode.

+5

"Se podría vender como una característica que las cadenas de bases de datos usan una forma básica de encriptación" Me gusta tu estilo: D – Ercan

+3

"Podrías vender eso como una característica que las cadenas de bases de datos usan una forma básica de cifrado" qué cosa tan horrible decir : D – Alex

+0

forma básica de encriptación contra cualquier persona que no tenga el algoritmo de decodificación base64 rofl: D – Eladian

2

"Los esquemas de codificación Base64 se usan comúnmente cuando existe la necesidad de codificar datos binarios que deben almacenarse y transferirse a través de medios diseñados para tratar datos textuales. Esto es para garantizar que los datos permanezcan intactos sin modificaciones durante el transporte "(Wiki, 2017)

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

Otro Ejemplo :: uenc = URL codificada = aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nZWwta2F5YW5vLXhpaS5odG1s = http://loc.querytip.com/asics-men-s-gel-kayano-xii.html.

Como puede ver, no podemos poner char "/" en la URL si queremos enviar la última URL visitada como parámetro porque romperíamos la regla de atributo/valor para "MOD reescribir" - parámetro GET.

un ejemplo completo sería: “http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics-men-s-gel-kayano-xii.html/product/93/

Cuestiones relacionadas