Utilizo el siguiente código C # para calcular un hash MD5 a partir de una cadena. Funciona bien y genera una cadena hexadecimal de 32 caracteres como esta:
900150983cd24fb0d6963f7d28e17f72
string sSourceData;
byte[] tmpSource;
byte[] tmpHash;
sSourceData = "MySourceData";
//Create a byte array from source data.
tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
// and then convert tmpHash to string...
¿Hay alguna manera de usar un código como este para generar una cadena hexadecimal de 16 caracteres (o una cadena de 12 caracteres)? Una cadena hexadecimal de 32 caracteres es buena, ¡pero creo que será aburrido que el cliente ingrese el código!
Respuestas:
Según MSDN
Crear MD5:
fuente
fuente
BitConverter
no funciona de la misma manera en Windows y Linux, vea esta pregunta: stackoverflow.com/questions/11454004/…Estaba tratando de crear una representación de cadena de hash MD5 usando LINQ, sin embargo, ninguna de las respuestas eran soluciones de LINQ, por lo tanto, agregamos esto a la gran variedad de soluciones disponibles.
fuente
return string.Join( "", hash.ComputeHash( Encoding.UTF8.GetBytes(observedText) ).Select( x => x.ToString("x2") ) );
return string.Concat( hash.ComputeHash( Encoding.UTF8.GetBytes(observedText) ).Select( x => x.ToString("x2") ) );
lugar. Es un poco más corto, posiblemente con una intención más clara, y funciona marginalmente más rápido (<10% de aumento de rendimiento).Depende completamente de lo que intentes lograr. Técnicamente, podría tomar los primeros 12 caracteres del resultado del hash MD5, pero la especificación de MD5 es generar uno de 32 caracteres.
Reducir el tamaño del hash reduce la seguridad y aumenta la posibilidad de colisiones y la ruptura del sistema.
Quizás si nos hace saber más sobre lo que está tratando de lograr, podríamos ayudarlo más.
fuente
Puede usar
Convert.ToBase64String
para convertir la salida de 16 bytes de MD5 a una cadena de ~ 24 caracteres. Un poco mejor sin reducir la seguridad. (j9JIbSY8HuT89/pwdC8jlw==
por tu ejemplo)fuente
Cadena de soporte y secuencia de archivo.
ejemplos
-
fuente
Supongo que es mejor usar la codificación UTF-8 en la cadena MD5.
fuente
Un hash MD5 tiene 128 bits, por lo que no puede representarlo en hexadecimal con menos de 32 caracteres ...
fuente
fuente
Una alternativa más rápida de respuesta existente para .NET Core 2.1 y superior:
Puede optimizarlo aún más si está seguro de que sus cadenas son lo suficientemente pequeñas y reemplazan la codificación. GetBytes por la alternativa insegura GetBytes (caracteres de ReadOnlySpan, bytes de extensión).
fuente
Esta solución requiere c # 8 y se aprovecha
Span<T>
. Tenga en cuenta que aún deberá llamar.Replace("-", string.Empty).ToLowerInvariant()
para formatear el resultado si es necesario.fuente
fuente
https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.md5?view=netframework-4.7.2
fuente
Me gustaría ofrecer una alternativa que parece funcionar al menos un 10% más rápido que la respuesta de craigdfrench en mis pruebas (.NET 4.7.2):
Si prefiere tener
using System.Runtime.Remoting.Metadata.W3cXsd2001;
en la parte superior, el cuerpo del método puede ser más fácil de leer:Obviamente, pero para completar, en el contexto de OP se usaría como:
fuente
No sé nada sobre cadenas hexadecimales de 16 caracteres ...
Pero aquí está el mío para crear hash MD5 en una línea.
fuente