Chaîne de hachage en c #

92

J'ai un problème en essayant d'obtenir une chaîne de hachage c#.

J'ai déjà essayé quelques sites Web, mais la plupart d'entre eux utilisent des fichiers pour obtenir le hachage. D'autres qui sont pour les chaînes sont un peu trop complexes. J'ai trouvé des exemples d'authentification Windows pour le Web comme ceci:

FormsAuthentication.HashPasswordForStoringInConfigFile(tbxPassword.Text.Trim(), "md5")

J'ai besoin d'utiliser un hachage pour rendre une chaîne contenant un nom de fichier plus sécurisée. Comment puis je faire ça?

Exemple:

string file  = "username";
string hash = ??????(username); 

Dois-je utiliser un autre algorithme de hachage et non "md5"?

Edy Cu
la source

Réponses:

184
using System.Security.Cryptography;

public static byte[] GetHash(string inputString)
{
    using (HashAlgorithm algorithm = SHA256.Create())
        return algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString));
}

public static string GetHashString(string inputString)
{
    StringBuilder sb = new StringBuilder();
    foreach (byte b in GetHash(inputString))
        sb.Append(b.ToString("X2"));

    return sb.ToString();
}

Notes complémentaires

  • Étant donné que MD5 et SHA1 sont des algorithmes obsolètes et non sécurisés , cette solution utilise SHA256. Vous pouvez également utiliser BCrypt ou Scrypt comme indiqué dans les commentaires.
  • Pensez également à « saler » vos hachages et utilisez des algorithmes cryptographiques éprouvés, comme indiqué dans les commentaires.
Dmitry Polomoshnov
la source
46
N'UTILISEZ PAS MD5 OU SHA1 , ce sont des algorithmes obsolètes et non sécurisés. Utilisez SHA256 au minimum ou mieux utilisez BCrypt ou Scrypt.
Muhammad Rehan Saeed le
1
Voir cet exemple d'utilisation de SCrypt: stackoverflow.com/questions/20042977/…
Muhammad Rehan Saeed
6
@Muh Il peut facilement être utilisé pour les sommes de contrôle, car c'est beaucoup plus rapide que SHA512. Mais en effet pour stocker les mots de passe, il n'est pas recommandé, ce qui est juste.
LuckyLikey
6
Qu'est-ce b.ToString("X2")que cela signifie?
Bilal Fazlani
1
@BilalFazlani voir stackoverflow.com/questions/20750062/…
Hezi
60

Le moyen le plus rapide, pour obtenir une chaîne de hachage à des fins de stockage de mots de passe, est le code suivant:

    internal static string GetStringSha256Hash(string text)
    {
        if (String.IsNullOrEmpty(text))
            return String.Empty;

        using (var sha = new System.Security.Cryptography.SHA256Managed())
        {
            byte[] textData = System.Text.Encoding.UTF8.GetBytes(text);
            byte[] hash = sha.ComputeHash(textData);
            return BitConverter.ToString(hash).Replace("-", String.Empty);
        }
    }

Remarques:

  • si la méthode est souvent invoquée, la création de shavariable doit être refactorisée dans un champ de classe;
  • la sortie est présentée sous forme de chaîne hexadécimale codée;
andrew.fox
la source
SHA1Managedla classe n'est pas très coûteuse. il consomme environ 130 octets et les initialise à une valeur statique, mais c'est tout. il ne devrait donc pas y avoir de problème de performances dans la plupart des cas.
Earth Engine
1
Aussi SHA1Managedest IDisposableet nécessitent donc d'envelopper son utilisation dans un usingbloc.
Earth Engine
La Disposeméthode de but est d'effacer le tampon interne. Si vous ne le faites pas, vous risquez une attaque de la mémoire.
Earth Engine
3
@MuhammadRehanSaeed quand j'ai dit que ce SHA1Managedn'est pas coûteux, je veux dire que sa création ne l'est pas. De plus, un algorithme de hachage n'est pas nécessairement coûteux. Cela ne doit être (extrêmement) coûteux que lorsque vous voulez trouver une collision.
Earth Engine
1
@King_Fisher - c'est impossible! Le hachage est une fonction à sens unique, les informations sont perdues. Si vous avez besoin de déchiffrer, vous devez utiliser une méthode de cryptage sans hachage. BTW, le cryptage des mots de passe est une mauvaise pratique.
andrew.fox
8

Je ne comprends pas vraiment toute la portée de votre question, mais si tout ce dont vous avez besoin est un hachage de la chaîne, il est très facile de l'obtenir.

Utilisez simplement la méthode GetHashCode.

Comme ça:

string hash = username.GetHashCode();
Cyril Gupta
la source
1
Oui, c'est ce que je cherche. Mais ce code est une grosse erreur. Afficher l'écriture comme int hash = "username" .GetHasCode ();
Edy Cu du
3
Pourquoi avez-vous mis le nom d'utilisateur entre guillemets? Cela obtiendra le hachage du mot 'username' et maintenant ce qu'il y a dans la variable username.
Cyril Gupta
15
ne stockez pas les valeurs de GetHashCode, c'est différent pour 32x et 64x
Slava
13
C'est une mauvaise façon de créer un hachage de mot de passe. Avec GetHashCode (), vous ne pouvez pas supposer que le même numéro sera généré par un ordinateur différent. Utilisez la méthode de hachage Sha1 ou quelque chose (je
posterai
2
Il convient de noter qu'il GetHashCodene s'agit pas d'un algorithme de hachage cryptographiquement sécurisé. Utilisez au moins SHA256 ou mieux utilisez BCrypt ou Scrypt pour un algorithme sécurisé.
Muhammad Rehan Saeed
5

Je pense que ce que vous recherchez n'est pas le hachage mais le cryptage. Avec le hachage, vous ne pourrez pas récupérer le nom de fichier d'origine à partir de la variable «hash». Avec le cryptage, vous pouvez, et c'est sécurisé.

Consultez AES dans ASP.NET avec VB.NET pour plus d'informations sur le chiffrement dans .NET.

Pieter van Ginkel
la source
oui, je pense que c'est le cryptage, mais je souhaite juste comparer le hachage des résultats. Après la page de redirection.
Edy Cu
Avec quoi voulez-vous comparer le nom de fichier haché?
Pieter van Ginkel
1
//Secure & Encrypte Data
    public static string HashSHA1(string value)
    {
        var sha1 = SHA1.Create();
        var inputBytes = Encoding.ASCII.GetBytes(value);
        var hash = sha1.ComputeHash(inputBytes);
        var sb = new StringBuilder();
        for (var i = 0; i < hash.Length; i++)
        {
            sb.Append(hash[i].ToString("X2"));
        }
        return sb.ToString();
    }
Soufiane Neffar
la source
3
N'UTILISEZ PAS SHA1 à partir de ce lien, SHA1 est un algorithme obsolète et non sécurisé. Utilisez au moins SHA256 ou mieux utilisez BCrypt ou Scrypt.
Muhammad Rehan Saeed
Voir cet exemple d'utilisation de SCrypt: stackoverflow.com/questions/20042977/…
Muhammad Rehan Saeed
1

Si les performances ne sont pas un problème majeur, vous pouvez également utiliser l'une de ces méthodes:
(Si vous souhaitez que la chaîne de hachage soit en majuscules, remplacez-la "x2"par "X2".)

public static string SHA256ToString(string s) 
{
    using (var alg = SHA256.Create())
        return string.Join(null, alg.ComputeHash(Encoding.UTF8.GetBytes(s)).Select(x => x.ToString("x2")));
}

ou:

public static string SHA256ToString(string s)
{            
    using (var alg = SHA256.Create())
        return alg.ComputeHash(Encoding.UTF8.GetBytes(s)).Aggregate(new StringBuilder(), (sb, x) => sb.Append(x.ToString("x2"))).ToString();
}
Babak
la source
0

Le moyen le plus court et le plus rapide jamais conçu. Seulement 1 ligne!

    public static string StringSha256Hash(string text) =>
        string.IsNullOrEmpty(text) ? string.Empty : BitConverter.ToString(new System.Security.Cryptography.SHA256Managed().ComputeHash(System.Text.Encoding.UTF8.GetBytes(text))).Replace("-", string.Empty);
Erçin Dedeoğlu
la source