¿Es posible asegurar que una cadena esté con un hash siempre de la misma manera, independientemente del idioma que uses para hacerlo (Java, vb.net ...) y no importa en qué sistema operativo estés?
Las funciones de hash son deterministic : la misma entrada produce la misma salida. Cualquier implementación de una función hash dada, independientemente del idioma en que se implementa, debe actuar de la misma manera.
Sin embargo , tenga en cuenta que las funciones hash toman secuencias de bits como entrada. Cuando "hacemos una cadena", en realidad convertimos una secuencia de caracteres en una secuencia de bits, y luego la hacemos. Ahí comienza el problema. Considere la cadena "café"
: entre todas las posibles conversiones a bits, todas las siguientes son comunes:
63 61 66 e9 ISO-8859-1 ("latin-1")
63 61 66 ca a9 UTF-8
63 61 66 65 cc 81 UTF-8 (NFD)
ef bb bf 63 61 66 ca a9 UTF-8 (with BOM)
ef bb bf 63 61 66 65 cc 81 UTF-8 (NFD with BOM)
63 00 61 00 66 00 e9 00 UTF-16 little-endian
00 63 00 61 00 66 00 e9 UTF-16 big-endian
ff fe 63 00 61 00 66 00 e9 00 UTF-16 little-endian (with BOM)
fe ff 00 63 00 61 00 66 00 e9 UTF-16 big-endian (with BOM)
63 00 61 00 66 00 65 00 01 03 UTF-16 little-endian (NFD)
00 63 00 61 00 66 00 65 03 01 UTF-16 big-endian (NFD)
ff fe 63 00 61 00 66 00 65 00 01 03 UTF-16 little-endian (NFD with BOM)
fe ff 00 63 00 61 00 66 00 65 03 01 UTF-16 big-endian (NFD with BOM)
y todos producirán valores hash muy diferentes cuando se procesen con una función hash dada. Debe ser muy preciso acerca de lo que hace cuando trata con funciones criptográficas; cada bit cuenta.
No estoy exactamente seguro de lo que quieres decir, pero sí. La salida de una función hash escrita correctamente debe ser la misma independientemente del idioma.
La única diferencia entre los hashes de diferentes bibliotecas de lenguajes de programación y en diferentes plataformas será la velocidad. Aunque en bibliotecas escritas correctamente, la diferencia será trivial.
Sí, la misma "secuencia de bytes" siempre producirá exactamente el mismo valor de resumen, independientemente de la implementación (¡suponiendo que sea una implementación correcta!)
La palabra clave es que esto siempre es cierto para "secuencia de bytes", pero no siempre para "cadena" como escribiste. Dependiendo de muchas cosas, las cadenas se pueden generar de manera diferente en diferentes sistemas. Existe la posibilidad de una gran cantidad de espacios en blanco o diferencias de final de línea, o problemas de codificación ASCII frente a Unicode UTF-16.
Además, tenga en cuenta que cuando muestra el valor de resumen, se encuentra con problemas similares. Diferentes implementaciones podrían representar dígitos hexadecimales con mayúsculas o minúsculas, por lo que una prueba de igualdad de cadenas podría fallar.