保存数据库中的哈希值

时间:2015-06-17 05:54:46

标签: c# hash

我用这个函数来计算哈希值:

.when('/product', {
     templateUrl: 'views/product.html',
     controller: 'ProductController',
     title: ''
})
.when('/product/new', {
      templateUrl: 'views/product_new.html',
      controller: 'ProductController',
      title: ''
})
.when('/product/:productId', {
      templateUrl: 'views/product_detail.html',
      controller: 'ProductDetailController',
      title: ''
})

但现在我几乎没有问题:

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

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

  3. Web应用程序中通常使用哪一个哈希函数?

  4. 谢谢。

3 个答案:

答案 0 :(得分:4)

目前,您只是返回连接在一起的所有字节的十进制表示。所以{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);
    }
}

Hex具有代表哈希的更常见方式的优点。 (Base64更常用于传输任意二进制数据,例如图像。)对于hex,您可以使用:

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

(请注意,我已声明本地变量 - 您似乎正在使用dataresult字段,这很糟糕想法 - 调用这些方法不应该影响实例的状态,IMO。)

或者,您可以返回byte[]并将其作为blob直接存储在数据库中。使用base64或hex可能更简单 - 以这种方式检查数据更容易,并且坦率地更容易查询。字符串处理起来更简单:)

就你应该使用哪个哈希而言 - 我可能不会使用SHA-1或MD5,除非我不得不这样做;我默认使用SHA-256,虽然这取决于你想要做什么。例如,如果这是散列密码,您可能需要某个描述的HMAC - 或者更好的是,不要自己滚动,并使用现成的身份验证包。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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