visual studio ponen generar fuente estandar documentar documentacion crear como comentarios codigo clases c# hash cryptography md5

studio - C#: ¿Cómo generar código corto MD5?



generar documentacion visual studio 2017 (7)

Cuando estoy encriptando 23 usando cifrado MD5 37693cfc748049e45d87b8c7d8b9aacd esta cadena larga de 32 caracteres que siempre será estática para 23.

Quiero el mismo tipo de mecanismo, pero eso debería generar 18 o menos (como: 122ff1e4883358b6 ) caracteres de cadena larga en lugar de 32.

¿Cómo puedo hacer eso en C #, hay alguna versión más corta de MD5 en c #?


MD5 siempre crea un Hash de 128 bits.

Otros Hashtypes más pequeños (tomados de Wikipedia)

Función hash Fowler-Noll-Vo (32, 64, 128, 256, 512 o 1024 bits)
Función hash de Jenkins (32 bits)
MurmurHash (32 o 64 bits)
Hash de Pearson (8 bits)

Pero recuerda colisiones hash


Me gusta la respuesta de @ RichieHindle. Sin embargo, si le interesa perder menos bits de fidelidad (y de ese modo disminuir el riesgo de colisiones), puede tomar el valor de 128 bits devuelto por el Hash MD5 y codificarlo utilizando ASCII85 (también conocido como codificación Base85), en su lugar de una codificación basada en hexadecimal. Esto le dará el hash completo en 20 bytes (que es más de lo que quería, pero podría cortar 2 bytes, lo que implicaría una pérdida mucho menor que la eliminación de 14 de los 32 bytes que obtendría utilizando la codificación hexadecimal).

Editar: Prashant dice que 20 caracteres están lo suficientemente cerca y pidió un código de muestra:

Después de obtener el hash MD5 de la llamada MD5.ComputeHash, puede usar el codificador ASCII85 de Jeff Atwood :

MD5 m = MD5.Create(); byte[] hash = m.ComputeHash(System.Text.Encoding.ASCII.GetBytes("23")); Ascii85 encoder = new Ascii85(); encoder.EnforceMarks = false; string hash85 = encoder.Encode(hash); Console.Out.WriteLine(hash85);

Rendimientos

2ebDPFFZsD?&,r1fX/$,

entonces puedes usar hash85 . El encoder.EnforceMarks se asegura de que la codificación no incluya algunos prefijos y sufijos típicos asociados con ASCII85.


No utilizaría una función hash si desea poder asignar el resultado a su valor original sin colisiones.

Si su objetivo es convertir un pequeño número decimal en una cadena larga ofuscada, solo invente algún algoritmo de mapeo y codifique el resultado con zBase32 o similar.

public string Obfuscate(long x) { return ToZBase32(BitConverter.GetBytes(x * 63498398L)); } public long Deobfuscate(string x) { return BitConverter.ToInt64(FromZBase32(x)) / 63498398L; }

23 se codifica para "gmuyaiayyyyyy" . (63498398 elegido por fair dice roll.)


Puede tomar la mayor cantidad de hash MD5 que necesite y descartar el resto. Todos los bits tienen el mismo valor, por lo que no hay diferencia entre hacer eso y usar algún algoritmo hash que produzca nativamente menos bits.

(Si está haciendo esto por razones de seguridad, recuerde que menos bits hacen que los hashes sean más fáciles de descifrar, independientemente del algoritmo. Incluso fuera de las aplicaciones de seguridad, menos bits aumentan el riesgo de colisión. También tenga en cuenta que MD5 es relativamente inseguro. días: SHA-1 o SHA-2 se consideran más seguros).



el algoritmo hash útil más corto sería md5. genera 16 bytes = hash de 128 bits. si usa codificación base 64 ... es decir 6 bits útiles por byte / char.

Deberías poder reducir el md5 a 22 caracteres (ascii). lo que tienes es una versión hexadecimal donde 2 bytes representan un byte real

(dejando el relleno posterior introducido por b64)

con la ventaja adicional de usar el mismo para nombres de archivos legales. (por supuesto, tendrá que sustituir los caracteres predeterminados / y + con cualquier otro símbolo que no entre en conflicto con la convención de denominación de archivos de su sistema operativo).

base64 (reemplazando / y +) asegura que su hash no arruine la URL con caracteres especiales que pueden significar algo más para su servidor web

ASCII85 agrega caracteres que son difíciles de tratar cuando se utilizan como nombres de archivo y en URL

md5 (''Esta cadena será hash'')

''37aa3296c523f6c5a7fd2102a9155dcc'' (hex) (32 bytes)

raw md5 (''Esta cadena será hash'')

[55, 170, 50, 150, 197, 35, 246, 197, 167, 253, 33, 2, 169, 21, 93, 204] = (16 bytes)

base64 de cadena md5 sin procesar

N6oylsUj9sWn_SECqRVdzA ==

My Final Hash

N6oylsUj9sWn_SECqRVdzA esto es realmente el md5 completo en 22 caracteres ascii

([puede quitar los dos trailing = siempre habrá dos para md5, agréguelos más tarde al decodificar. También reemplace + y / en b64 con cualquier otro que prefiera - (guión) y _ (guión bajo)]


esta cadena larga de 32 caracteres son números hexadecimales: 0-f puede acortarla convirtiendo su valor hexadecimal a raíz de 36: 0-z