[英]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();
}
但現在我有幾個問題:
哈希函數應該為任何類型的字符串創建固定輸出長度。(無論我的輸入長度是4還是10000,輸出始終具有固定大小),不是嗎? 但是當我的輸入長度改變時,輸出長度也會改變! 我猜我的哈希函數不起作用。
如果我想將結果保存在數據庫中,我的哈希值字段類型應該是什么?
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("-", "");
(請注意,我已經聲明了局部變量-您似乎正在將字段用於data
和result
,這是個壞主意-調用這些方法不應影響實例IMO的狀態。)
另外,您可以返回一個byte[]
並將其作為blob直接存儲在數據庫中。 不過,使用base64或hex可能更簡單-以這種方式檢查數據更容易,並且坦率地說更容易查詢。 字符串更易於處理:)
關於應該使用哪種哈希-除非必須,否則我可能不會使用SHA-1或MD5。 我默認使用SHA-256,盡管它取決於您要執行的操作。 例如,如果這是對密碼進行哈希處理,則您可能希望使用某種描述的HMAC-或更好的是,不要自己滾動,使用現成的身份驗證程序包。
通常的做法是使用ToBase64String()將哈希碼的字節數組轉換為base64編碼。這也是存儲密碼的方式。 給定固定的字節數,base64編碼是固定長度的字符串。 每3個字節需要4個字符,外加一些填充
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.