Hashtekenreeks in c#

Ik heb een probleem bij het verkrijgen van een hash-tekenreeks in c#.

Ik heb al een paar websites geprobeerd, maar de meeste gebruiken bestanden om de hash te krijgen. Anderen die voor strijkers zijn, zijn een beetje te complex. Ik vond voorbeelden voor Windows-authenticatie voor het web als volgt:

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

Ik moet een hash gebruiken om een ​​string die een bestandsnaam bevat veiliger te maken. Hoe kan ik dat doen?

Voorbeeld:

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

Moet ik een ander hash-algoritme gebruiken en niet “md5”?


Antwoord 1, autoriteit 100%

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

Aanvullende opmerkingen

  • Aangezien MD5 en SHA1 verouderde en onveilige-algoritmen zijn, gebruikt deze oplossing SHA256. Als alternatief kunt u BCryptof Scryptzoals aangegeven in opmerkingen.
  • Overweeg ook “zouting” van uw hashes en gebruik bewezen cryptografische algoritmen, zoals aangegeven in opmerkingen.

Antwoord 2, autoriteit 30%

De snelste manier om een ​​hash-string te krijgen voor het opslaan van wachtwoorden, is de volgende code:

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

Opmerkingen:

  • als de methode vaak wordt aangeroepen, moet het maken van de variabele shaopnieuw worden omgezet in een klasseveld;
  • uitvoer wordt gepresenteerd als gecodeerde hexadecimale tekenreeks;

Antwoord 3, autoriteit 3%

Ik begrijp niet echt de volledige reikwijdte van uw vraag, maar als u alleen een hash van de string nodig heeft, dan is het heel gemakkelijk om die te krijgen.

Gebruik gewoon de GetHashCode-methode.

Zoals dit:

string hash = username.GetHashCode();

Antwoord 4, autoriteit 2%

Ik denk dat je niet naar hashing zoekt, maar naar versleuteling. Met hashing kunt u de oorspronkelijke bestandsnaam niet ophalen uit de “hash”-variabele. Met encryptie kan dat, en het is veilig.

Zie AES in ASP.NET met VB.NETvoor meer informatie over encryptie in .NET.


Antwoord 5

Als prestaties geen grote zorg zijn, kunt u ook een van deze methoden gebruiken:
(Als je de hash-tekenreeks in hoofdletters wilt hebben, vervang dan "X2"door "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")));
}

of:

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

Other episodes