126 votes

Chaîne de hachage en c#

J'ai un problème lorsque j'essaie d'obtenir une chaîne de hachage dans c# .

J'ai déjà essayé quelques sites web, mais la plupart d'entre eux utilisent des fichiers pour obtenir le hash. D'autres, qui utilisent des chaînes de caractères, sont un peu trop complexes. J'ai trouvé des exemples d'authentification Windows pour le web comme celui-ci :

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

J'ai besoin d'utiliser un hachage pour sécuriser une chaîne contenant un nom de fichier. Comment faire ?

Ejemplo:

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

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

243voto

Dmitry Polomoshnov Points 1915
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 obsolète et peu sûre cette solution utilise SHA256. Vous pouvez également utiliser BCrypt ou Scrypt comme indiqué dans les commentaires.
  • Pensez également à " salage " vos hachages et utilisez des algorithmes cryptographiques éprouvés, comme cela a été souligné dans les commentaires.

75voto

andrew.fox Points 320

Le moyen le plus rapide d'obtenir une chaîne de hachage pour stocker un mot 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 sha devrait être transformée en un champ de classe ;
  • est présenté sous la forme d'une chaîne de caractères hexagonale codée ;

10voto

Ehsan Mirsaeedi Points 128

Tous les exemples de code de hachage présentés ici sont obsolètes. Dans .NET 5, nous disposons d'une nouvelle méthode de hachage des données qui est deux fois plus rapide et ne nécessite pas d'allocation de mémoire. Il vous suffit d'utiliser le nouveau code statique HashData(byte[]) sur votre classe d'algorithme de hachage préférée.

byte[] buffer = Encoding.UTF8.GetBytes(input);
byte[] digest = SHA256.HashData(buffer);

Microsoft dispose d'une nouvelle règle dans son analyseur pour détecter les anciennes utilisations et les remplacer par la nouvelle API.

8voto

Cyril Gupta Points 7189

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.

Il suffit d'utiliser la méthode GetHashCode.

Comme ceci :

string hash = username.GetHashCode();

5voto

Pieter van Ginkel Points 17057

Je pense que ce que vous recherchez n'est pas le hachage mais le cryptage. Avec le hachage, vous ne pourrez pas retrouver le nom de fichier original à partir de la variable "hash". Avec le cryptage, c'est possible, et c'est sécurisé.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X