Implicaciones de hash a UTF-8 en una función criptográfica

2

Sé que la mayoría de las funciones hash de hoy en día usan la codificación Base64 para sus funciones, lo que resulta en hashes que usan a-Z y 0-9, y, a veces, otros caracteres especiales. Esto da como resultado valores posibles de 62-76ish para cada carácter, por lo que si tu hash termina siendo de 70 caracteres, hay 70 ^ 62 combinaciones posibles.

Pero, ¿y si hubiera una función de hash diseñada para aprovechar el UTF-8? De lo que entiendo hay aproximadamente 100,000 valores posibles para cada personaje. Esto significa, cerca de lo que puedo decir, que habría 70 ^ 100,000 valores posibles, lo cual es mucho. Parece que no podrías hacer una tabla de arco iris de eso.

También, sé que la velocidad es muy importante en las funciones de hash. ¿Sería esto inherentemente más lento que una función de hashing Base64?

Sé que los "bits de entropía" tienen mucho que ver con la seguridad de una contraseña. ¿Esto mejora de alguna manera esos bits entropiados? Estoy bastante confundido acerca de la entropía, para ser honesto.

Tenga en cuenta que no estoy hablando de combinación una función existente con UTF8. Me pregunto si se creó una nueva función de hash criptográfica para aprovechar el conjunto de caracteres más grande de UTF-8, ¿sería mejor (al menos en teoría) que las funciones existentes?

De mi lectura parece haber algunos problemas con bits flotando alrededor y causando confusión. ¿Sería posible solucionar este problema, o es la razón por la que no puede el hash con éxito de UTF-8 para las contraseñas, ya que el riesgo de colisión aumenta de manera dramática e impredecible?

    
pregunta Asa 03.09.2015 - 22:15
fuente

3 respuestas

7

Primero, Base64 usará, bueno, 64 caracteres diferentes (de ahí el nombre) para codificar datos binarios. El casi único conjunto de símbolos utilizados es este:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

No tengo conocimiento de ninguna implementación que use una diferente.

Según Wikipedia , "Una función hash es una función que se puede usar para mapear datos digitales de tamaño arbitrario a datos digitales de tamaño fijo ". Básicamente, usted utiliza una función de hash para convertir un texto de tamaño indeterminado en un número de tamaño fijo.

Los datos devueltos por la función de hashing son binary , no texto. Parece un texto porque es más útil (y fácil) para codificar el resultado en una representación de texto que para manejar uno binario. Así que generalmente (pero no siempre) codifican el resultado antes de mostrarlo. Generalmente la función hash devolverá codificación hexadecimal , no base64.

En PHP , si ejecuta esto:

$a = sha1('some string', true);

Devolverá los datos binarios, no la representación hexadecimal.

En Python , puedes usar sha.digest() para lograr lo mismo: obtendrás el binario Representación de 20 bytes, no el valor codificado.

Cuando codificas tus datos binarios en base64 (o uuencode , o yEnc ), no está cambiando los datos, solo la representación. Es como la relación entre one trillion, two hundred and seventy four million, five hundred and two thousand, nine hundred and fifty tree y 1274502953 . La codificación no cambia el valor.

El uso de UTF-8, UTF-32, Base64 o ASCII no cambiará nada.

    
respondido por el ThoriumBR 03.09.2015 - 22:53
fuente
6
  

Sé que la mayoría de las funciones hash de hoy en día utilizan la codificación Base64 para su   funciones, lo que resulta en hashes que utilizan a-Z y 0-9, y, a veces,   Otros personajes especiales. Esto da como resultado valores posibles de 62-76ish para   cada personaje, así que si tu hash termina siendo, digamos, 70 caracteres de largo,   hay 70 ^ 62 combinaciones posibles.

La mayoría de los hash se expresan utilizando una notación hexadecimal o base64. El hash en sí mismo es simplemente una cadena de bits, ya que tal no se expresa directamente como caracteres legibles.

Vea también Hash MD5 y Base64 Encoding y MD5 es de 128 bits, pero ¿por qué son 32 caracteres?

  

Pero, ¿y si hubiera una función de hash diseñada para aprovecharla?   de UTF-8? Por lo que entiendo hay aproximadamente 100,000 posibles   valores para cada personaje.

De nuevo, el hash es una cadena de bits: 128 de ellos en el caso de MD5, 256 en el caso de SHA-256. Si tuviera que expresar esos bits utilizando UTF-8, la complejidad del hash real es exactamente la misma, pero la cantidad de caracteres aumentará porque UTF-8 no es un formato de texto eficiente.

  

También, sé que la velocidad es muy importante en las funciones de hash. haría   ¿Esto es intrínsecamente más lento que una función hash Base64?

La función de hash permanecería igual; solo cambiaría la conversión de hash binario a caracteres textuales, lo que no tendría un impacto significativo en la velocidad.

  

Sé que los "bits de entropía" tienen mucho que ver con la seguridad de un   contraseña. ¿Esto mejora de alguna manera esos bits entropiados? estoy bastante   Confundido acerca de la entropía, para ser honesto.

Esto no tiene nada que ver con eso. La entropía tiene que ver con el cifrado, no el hash, y el conjunto de caracteres utilizado para expresar un hash en realidad no afecta al hashing de todos modos.

    
respondido por el gowenfawr 03.09.2015 - 23:00
fuente
2

Estoy lejos de ser un experto en criptografía, pero creo que si miras el resultado de la función hash como un flujo de bits, es lo mismo si lo "ves" como una cadena UTF-8 o Base64. . La forma en que lo ves puede ser diferente, pero el valor binario real es el mismo. Pero esto es solo una suposición que hice

    
respondido por el Mr. E 03.09.2015 - 22:54
fuente

Lea otras preguntas en las etiquetas