web-dev-qa-db-fra.com

Chaîne de hachage en c #

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

J'ai déjà essayé quelques sites Web, mais la plupart 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")

Je dois utiliser un hachage pour sécuriser une chaîne contenant un nom de fichier. Comment puis je faire ça?

Exemple:

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

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

68
Edy Cu
using System.Security.Cryptography;

public static byte[] GetHash(string inputString)
{
    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

  • Puisque 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.
  • En outre, considérez " salting " vos hachages et utilisez des algorithmes cryptographiques éprouvés, comme indiqué dans les commentaires.
150
Dmitry Polomoshnov

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 invoquée souvent, la création de la variable sha doit être refactorisée dans un champ de classe;
  • la sortie est présentée sous forme de chaîne hex codée;
45
andrew.fox

Je ne comprends pas vraiment 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();
6
Cyril Gupta

Je pense que ce que vous recherchez n'est pas un hachage mais un 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é.

Voir AES dans ASP.NET avec VB.NET pour plus d'informations sur le cryptage dans .NET.

5
Pieter van Ginkel
//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();
    }
2
Soufiane Neffar