Tengo el siguiente código, el cual hash de una contraseña introducidos por el usuario, y posteriormente se almacena en una base de datos SQL Server:

   Byte[] originalPassword;
   Byte[] hashedPassword;

   MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
   UTF8Encoding encoder = new UTF8Encoding();

   originalPassword = encoder.GetBytes(passwordBox.Text);
   hashedPassword = md5Hasher.ComputeHash(originalPassword);
   command.Parameters.Add(new SqlParameter("Password", hashedPassword));
   command.ExecuteNonQuery();

Mi problema es que tengo un número de contraseñas de texto plano que ya están almacenados en la base de datos. Exactamente cómo soy yo para modificar en este nuevo hash formato, ya que aparecen como ‘0xA99ED….’?

  • Ok, así que usted tiene que utilizar MD5 por alguna razón… ¿no podías utilizar al menos una sal, o incluso almacenar todo el hash? De todos modos, parecen estar asumiendo que las cadenas y los binarios son equivalentes – que no está, que existe la necesidad de una codificación.
  • ¿Cuál es el problema? Usted no puede esperar que una binary16 columna a tener el mismo resultado cuando se cambia a nvarchar.
  • Creo que el problema radica en que la frase: «he introducido manualmente un MD5 en la cadena de formato y cambiar el tipo de datos binario(16)». Si usted entró a una representación hexadecimal de la hash, y se convierte a binario tomando el valor binario de cada personaje en la representación hexadecimal, es normal que el resultado no es el mismo…
  • He actualizado mi pregunta para reflejar lo que mi verdadero problema es 🙂
InformationsquelleAutor Dot NET | 2011-11-09

4 Comentarios

  1. 2

    La salida de una función hash es una colección de bytes, no es una colección de texto. Así que cuando usted entra en el texto como prueba de que son, probablemente, escribir un texto de conversión de la matriz de bytes. Simplemente convertir en SQL en un archivo binario(16) no es correcta, usted necesita para hacer una adecuada conversión, que es algo que no se puede hacer en SQL. Esto también explica por qué cambiar el tipo de dato de la columna no funciona bien.

    Cuando hash se expresa como cadenas es generalmente a través de los valores hexadecimales de cada byte, o a través de un conjunto de caracteres del codificador. Para cambiar entre ellos tiene que averiguar cuál de ellos está en uso y realizar la conversión en el código, no por el cambio de los tipos de datos en SQL

  2. 2
    try this out first create a Windows form with 2 buttons and 2 text boxes
    1st button label Encrypt
    2nd button label Validate
    **--- Hashing using the MD5 class ---**
    
    use the following code below
    ///<summary>
    ///take any string and encrypt it using MD5 then
    ///return the encrypted data 
    ///</summary>
    ///<param name="data">input text you will enterd to encrypt it</param>
    ///<returns>return the encrypted text as hexadecimal string</returns>
    private string GetMD5HashData(string data)
    {
        //create new instance of md5
        MD5 md5 = MD5.Create();
    
        //convert the input text to array of bytes
        byte[] hashData = md5.ComputeHash(Encoding.Default.GetBytes(data));
    
        //create new instance of StringBuilder to save hashed data
        StringBuilder returnValue = new StringBuilder();
    
        //loop for each byte and add it to StringBuilder
        for (int i = 0; i < hashData.Length; i++)
        {
            returnValue.Append(hashData[i].ToString());
        }
    
        //return hexadecimal string
        return returnValue.ToString();
    
    }
    
    ///<summary>
    ///encrypt input text using MD5 and compare it with
    ///the stored encrypted text
    ///</summary>
    ///<param name="inputData">input text you will enterd to encrypt it</param>
    ///<param name="storedHashData">the encrypted text
    ///        stored on file or database ... etc</param>
    ///<returns>true or false depending on input validation</returns>
    private bool ValidateMD5HashData(string inputData, string storedHashData)
    {
        //hash input text and save it string variable
        string getHashInputData = GetMD5HashData(inputData);
    
        if (string.Compare(getHashInputData, storedHashData) == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
  3. 1

    Este método funciona muy bien, devuelve una cadena desde el hash MD5 usando LINQ. Esto funcionó para MailChimp API 3.0, mientras que el anterior código que devuelve la matriz de bytes no.

      public static string GetMd5HashData(string yourString )
      {
         return string.Join("", MD5.Create().ComputeHash(Encoding.ASCII.GetBytes(yourString)).Select(s => s.ToString("x2")));
      }

    Encontrar aquí: http://rion.io/2013/02/23/generating-an-md5-hash-from-a-string-using-linq/

  4. 1

    Aquí es el VB.NET versión usando LINQ (para aquellos que todavía están usando VB.NET):

    Public Function GenerateMD5(ByVal plainText As String) As String
            Return String.Join("", System.Security.Cryptography.MD5.Create().ComputeHash(System.Text.Encoding.ASCII.GetBytes(plainText)).Select(Function(x) x.ToString("x2")))
    End Function

Dejar respuesta

Please enter your comment!
Please enter your name here