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
但现在我有几个问题:

  • 散列函数应该为任何类型的字符串创建固定的输出长度(无论我的输入长度是4还是10000,输出总是有固定的大小),不是吗?但是当我的输入长度改变时,输出长度也会改变!!我猜我的哈希函数不起作用

  • 如果我想将结果保存在数据库中,我的哈希值字段类型应该是什么

  • web应用程序中通常使用哪种哈希函数


  • 谢谢。

    目前,您只返回所有字节的十进制表示形式,并将其连接在一起。所以{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——或者更好的是,不要使用自己的,而是使用现成的身份验证包

  • 每个哈希算法(md5/sha1/etc)都有自己的固定大小
  • 不要将输出哈希转换为字符串,将其保留为字节[]
  • 为了存储散列,在数据库中创建一个blob列,并使用SQLParameter正确插入它

  • 通常的做法是使用ToBase64String()将hashcode的字节数组转换为base64编码 这也是存储密码的方式。base64编码是给定固定字节数的固定长度字符串。每3个字节需要4个字符,再加上一些填充