簡體   English   中英

將哈希值保存在數據庫中

[英]save hash value in the database

我使用此函數來計算哈希值:

public string GetSHA512(string input)
{
    byte[] data, result;
    StringBuilder hash = new StringBuilder();

    data = Encoding.UTF8.GetBytes(input);
    using (SHA512 shaM = new SHA512Managed())
    {
        result = shaM.ComputeHash(data);
    }

    for (int i = 0; i < result.Length; i++)
    {
        hash.Append(result[i].ToString());
    }

    return hash.ToString();
}

public string GetSHA256(string input)
{
    byte[] data, result;
    StringBuilder hash = new StringBuilder();

    data = Encoding.UTF8.GetBytes(input);
    using (SHA256 shaM = new SHA256Managed())
    {
        result = shaM.ComputeHash(data);
    }

    for (int i = 0; i < result.Length; i++)
    {
        hash.Append(result[i].ToString());
    }

    return hash.ToString();
}

public string GetSHA1(string input)
{
    byte[] data, result;
    StringBuilder hash = new StringBuilder();

    data = Encoding.UTF8.GetBytes(input);
    using (SHA1 shaM = new SHA1Managed())
    {
        result = shaM.ComputeHash(data);
    }

    for (int i = 0; i < result.Length; i++)
    {
        hash.Append(result[i].ToString());
    }

    return hash.ToString();
}

public string GetMD5(string input)
{
    byte[] data, result;
    StringBuilder hash = new StringBuilder();

    data = Encoding.UTF8.GetBytes(input);
    using (MD5 shaM = new MD5CryptoServiceProvider())
    {
        result = shaM.ComputeHash(data);
    }

    for (int i = 0; i < result.Length; i++)
    {
        hash.Append(result[i].ToString());
    }

    return hash.ToString();
}

但現在我有幾個問題:

  1. 哈希函數應該為任何類型的字符串創建固定輸出長度。(無論我的輸入長度是4還是10000,輸出始終具有固定大小),不是嗎? 但是當我的輸入長度改變時,輸出長度也會改變! 我猜我的哈希函數不起作用。

  2. 如果我想將結果保存在數據庫中,我的哈希值字段類型應該是什么?

  3. Web應用程序中通常使用哪種哈希函數?

謝謝。

當前,您只是返回所有字節的十進制表示形式,它們串聯在一起。 因此{0,0,0}最終以“ 000”結尾,而{123,123,123}最終以“ 123123123”結尾。 因此,是的,這兩個哈希將為任何輸入提供相同的輸出大小(SHA-1將提供20個字節; MD5將提供16個字節),但是您的字符串表示形式當前長度有所不同。

我建議使用十六進制表示形式或base64-特別是base64需要較少的工作:

public string GetSHA1(string input)
{
    byte[] data = Encoding.UTF8.GetBytes(input);
    using (SHA512 shaM = new SHA512Managed())
    {
        byte[] result = shaM.ComputeHash(data);
        return Convert.ToBase64String(result);
    }
}

十六進制的優點是它是表示哈希的更常見的方式。 (Base64通常用於傳輸任意二進制數據,例如圖像。)對於十六進制,可以使用:

return BitConverter.ToString(result).Replace("-", "");

(請注意,我已經聲明了局部變量-您似乎正在將字段用於dataresult ,這是個壞主意-調用這些方法不應影響實例IMO的狀態。)

另外,您可以返回一個byte[]並將其作為blob直接存儲在數據庫中。 不過,使用base64或hex可能更簡單-以這種方式檢查數據更容易,並且坦率地說更容易查詢。 字符串更易於處理:)

關於應該使用哪種哈希-除非必須,否則我可能不會使用SHA-1或MD5。 我默認使用SHA-256,盡管它取決於您要執行的操作。 例如,如果這是對密碼進行哈希處理,則您可能希望使用某種描述的HMAC-或更好的是,不要自己滾動,使用現成的身份驗證程序包。

  1. 每個哈希算法(md5 / sha1 / etc)都有自己固定的大小;
  2. 不要將輸出的哈希值轉換為字符串,而是將其保留為byte []。
  3. 為了存儲哈希,請在數據庫中創建一個blob列,並使用SQLParameter正確插入它

通常的做法是使用ToBase64String()將哈希碼的字節數組轉換為base64編碼。這也是存儲密碼的方式。 給定固定的字節數,base64編碼是固定長度的字符串。 每3個字節需要4個字符,外加一些填充

暫無
暫無

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

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