web-dev-qa-db-fra.com

MD5CryptoServiceProvider dans ASP.NET Core

J'ai une base de données avec des mots de passe créés dans l'ancien système d'identité. Les mots de passe ont été hachés à l'aide de la classe MD5CryptoServiceProvider. Je dois maintenant utiliser ces mots de passe dans ASP.NET MVC Core, mais MD5CryptoServiceProvider n'existe pas.

Dans .NET Framework, la fonction que j'ai utilisée pour calculer les hachages est la suivante:

public static string CreateHash(string unHashed)
{
    var x = new System.Security.Cryptography.MD5CryptoServiceProvider();
    var data = Encoding.ASCII.GetBytes(unHashed);
    data = x.ComputeHash(data);
    return Encoding.ASCII.GetString(data);
}

J'ai essayé les deux fonctions suivantes dans ASP.NET Core:

public static string CreateHash(string unHashed)
{
    var x = new System.Security.Cryptography.HMACMD5();
    var data = Encoding.ASCII.GetBytes(unHashed);
    data = x.ComputeHash(data);
    return Encoding.ASCII.GetString(data);
}

et

public static string MD5Hash(string input)
{
    using (var md5 = MD5.Create())
    {
        var result = md5.ComputeHash(Encoding.ASCII.GetBytes(input));
        var strResult = BitConverter.ToString(result);
        return strResult.Replace("-", "");
    }
}

Aucune méthode ne retourne la même chaîne que la classe MD5CryptoServiceProvider dans la première méthode. Je ne peux pas changer toute la base de données pour utiliser de nouveaux mots de passe.

Une solution à cela?

6
Yuri Morales

Il y a deux problèmes ici:

Tout d'abord, vous utilisez différentes méthodes pour reconvertir le tableau d'octets en chaîne. Dans vos première et deuxième méthodes, vous utilisez

return Encoding.ASCII.GetString(data);

Dans votre troisième méthode, vous utilisez:

var strResult = BitConverter.ToString(result);
return strResult.Replace("-", "");

Ceux-ci ne produisent pas les mêmes résultats.

Deuxièmement, alors que les fonctions de hachage utilisées dans les premier et troisième exemples sont effectivement identiques, la méthode utilisée dans le deuxième exemple ne l’est pas.

En bref, pour obtenir ce que vous voulez, utilisez la troisième option, mais utilisez la même méthode pour la reconvertir en une chaîne que vous avez utilisée dans le premier exemple (si c'est ce que vous utilisiez précédemment):

public static string MD5Hash(string input)
{
    using (var md5 = MD5.Create())
    {
        var result = md5.ComputeHash(Encoding.ASCII.GetBytes(input));
        return Encoding.ASCII.GetString(result);
    }
}
17
Brett Wolfington

Voici ma version de md5 helper

public static string ToMD5Hash(this string str)
{
    if (string.IsNullOrEmpty(str))
        return null;

    return Encoding.ASCII.GetBytes(str).ToMD5Hash();
}

public static string ToMD5Hash(this byte[] bytes)
{
    if (bytes == null || bytes.Length == 0)
        return null;

    using (var md5 = MD5.Create())
    {
        return string.Join("", md5.ComputeHash(bytes).Select(x => x.ToString("X2")));
    }
}
2
ADM-IT