簡體   English   中英

C#中的哈希字符串

[英]Hash string in c#

嘗試在c#獲取哈希字符串時遇到問題。

我已經嘗試了幾個網站,但大多數都使用文件來獲取哈希值。 其他用於字符串的有點太復雜了。 我找到了像這樣的 Windows 身份驗證示例:

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

我需要使用散列來使包含文件名的字符串更安全。 我怎樣才能做到這一點?

例子:

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

我應該使用另一種散列算法而不是“md5”嗎?

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

附加說明

  • 由於 MD5 和 SHA1 是過時且不安全的算法,因此此解決方案使用 SHA256。 或者,您可以使用注釋中指出的BCryptScrypt
  • 此外,如評論中指出的那樣,考慮“加鹽”您的哈希並使用經過驗證的加密算法。

獲取用於密碼存儲目的的哈希字符串的最快方法是以下代碼:

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

備注:

  • 如果經常調用該方法,則將sha變量的創建重構為一個類字段;
  • 輸出顯示為編碼的十六進制字符串;

我不太了解您問題的全部范圍,但是如果您只需要字符串的哈希值,那么很容易得到它。

只需使用 GetHashCode 方法。

像這樣:

string hash = username.GetHashCode();

我認為你要找的不是散列而是加密。 使用散列,您將無法從“散列”變量中檢索原始文件名。 使用加密可以,而且它是安全的。

有關 .NET 中加密的更多信息,請參閱ASP.NET 中的 AES 和 VB.NET

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

如果性能不是主要問題,您還可以使用以下任何一種方法:
(如果您希望哈希字符串為大寫,請將"x2"替換為"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")));
}

或:

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

有史以來最短和最快的方式。 只有1行!

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

這里的所有散列代碼示例都已過時。 在 .NET 5 中,為我們提供了一種新的散列數據方法,它是雙倍速度並且零內存分配。 是不是很酷? 你只需要在你最喜歡的散列算法類上使用新的靜態HashData(byte[])

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

微軟在其分析器中有一個新規則來檢測舊用法並將其替換為新的 API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM