C# 在数据库中保存哈希值
我使用以下函数计算哈希值:C# 在数据库中保存哈希值,c#,hash,C#,Hash,我使用以下函数计算哈希值: public string GetSHA512(string input) { byte[] data, result; StringBuilder hash = new StringBuilder(); data = Encoding.UTF8.GetBytes(input); using (SHA512 shaM = new SHA512Managed()) { result = shaM.ComputeH
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();
}
公共字符串GetSHA512(字符串输入)
{
字节[]数据,结果;
StringBuilder哈希=新的StringBuilder();
数据=Encoding.UTF8.GetBytes(输入);
使用(SHA512 shaM=new SHA512Managed())
{
结果=假计算哈希(数据);
}
for(int i=0;i
但现在我有几个问题:
谢谢。目前,您只返回所有字节的十进制表示形式,并将其连接在一起。所以{0,0,0}以“000”结尾,而{123123123}以“123123”结尾。因此,是的,这两个散列将为任何输入提供相同的输出大小(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("-", "");
(请注意,我声明了局部变量-您似乎在使用数据
和结果
的字段,这是一个坏主意-调用这些方法不应该影响实例的状态,依我看。)
或者,您可以只返回一个字节[]
,并将其作为blob直接存储在数据库中。不过,使用base64或hex可能更简单——这样更容易检查数据,坦率地说,更容易查询。字符串只是更容易处理:)
就你应该使用哪种散列而言——我可能不会使用SHA-1或MD5,除非我不得不这样做;我会默认为SHA-256,尽管这取决于您尝试执行的操作。例如,如果这是散列密码,您可能需要某种描述的HMAC——或者更好的是,不要使用自己的,而是使用现成的身份验证包
通常的做法是使用ToBase64String()将hashcode的字节数组转换为base64编码 这也是存储密码的方式。base64编码是给定固定字节数的固定长度字符串。每3个字节需要4个字符,再加上一些填充