2011-11-09 2 views
0

J'ai le code suivant, qui hash un mot de passe comme entrée par l'utilisateur, puis il stocke dans une base de données SQL Server:mot de passe ASP.NET utilisant Hash MD5

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(); 

Mon problème est que J'ai un certain nombre de mots de passe en clair qui sont déjà stockés dans la base de données. Comment exactement suis-je pour les modifier dans ce nouveau format haché, puisqu'ils apparaissent comme '0xA99ED ....'?

+0

Ok, donc vous devez utiliser MD5 pour une raison quelconque ... ne pourriez-vous au moins utiliser un sel, ou même stocker le hachage entier? De toute façon, vous semblez supposer que les chaînes et les binaires sont équivalents - ils ne le sont pas, il doit y avoir un encodage. – Aaronaught

+0

Quel est le problème? Vous ne pouvez pas attendre qu'une colonne binary16 ait le même résultat lorsqu'elle est changée en nvarchar. –

+1

Je pense que votre problème réside dans cette phrase: «J'ai entré manuellement un MD5 en format de chaîne et ai changé le type de données en binaire (16)». Si vous avez entré une représentation hexadécimale du hachage, et qu'elle a été convertie en binaire en prenant la valeur binaire de chaque caractère dans la représentation hexadécimale, il est normal que le résultat ne soit pas le même ... –

Répondre

2

La sortie d'une fonction de hachage est une collection d'octets, pas une collection de texte. Ainsi, lorsque vous entrez du texte en tant que test, vous entrez probablement une conversion de texte de ce tableau d'octets. Le convertir simplement en SQL en un binaire (16) n'est pas correct, vous devez faire une conversion correcte, ce que vous ne pouvez pas faire en SQL. Cela explique également pourquoi le changement du type de données de la colonne ne fonctionne pas non plus.

Lorsque les hachages sont exprimés sous forme de chaînes, il s'agit généralement de valeurs hexadécimales de chaque octet ou d'un codeur de jeu de caractères. Pour basculer entre eux, vous devez comprendre que l'on est en cours d'utilisation et effectuer la conversion en code, et non en changeant les types de données dans SQL

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; 
    } 
} 
1

Cette méthode fonctionne très bien, retourne une chaîne à partir du hachage MD5 à l'aide LINQ. Cela a fonctionné pour MailChimp API 3.0 alors que le code précédent qui renvoyait le tableau d'octets ne l'a pas fait.

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

trouvés ici: http://rion.io/2013/02/23/generating-an-md5-hash-from-a-string-using-linq/

0

Voici la version VB.NET LINQ (pour ceux qui utilisent encore 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 
Questions connexes