【问题标题】:Hashing by sha1 algorithm with user's secret key in C#在 C# 中使用用户的密钥通过 sha1 算法进行散列
【发布时间】:2019-06-26 07:47:23
【问题描述】:

我需要根据 sha1 算法使用用户的密钥对字符串进行哈希处理,例如:hash = hash (string, secret_key).

我使用这个代码:

byte[] data = sha1.ComputeHash(Encoding.UTF8.GetBytes(input));

但是我找不到如何在这个算法中使用密钥。

【问题讨论】:

  • 你想用这个实现什么?从您在此处发布的小信息来看,加密之类的东西似乎会更好。其中用户密码是用于加密数据的密码。
  • 我同意@Tachyon,所描述的用例似乎并不常见。
  • 我认为 OP 正在做一些事情,有一种称为盐渍散列的技术,它用字符串扩充原始文本,这样暴力攻击就不能使用预先计算的散列的彩虹表。加盐散列仅涉及将输入与“盐”字符串连接
  • 我只是有这个任务,我不会使用它。该任务包含 PHP 中的示例:hash_hmac('sha1', $input, $secret)
  • 如果只是为了加盐,你可以将密钥附加到输入中。

标签: c# sha1


【解决方案1】:

散列是对数据应用散列函数的结果。它将任意数据映射到固定大小的值。这不需要任何秘密。

使用哈希和密钥的加密过程是对数据进行签名。您可能希望使用私钥基于公钥/私钥加密创建数据哈希和 MAC(消息验证码)。

散列只告诉您数据是否被修改。

MAC 使用任何类型的秘密,因此它也可以防止操纵。通常,MAC 仅在发送方和接收方相互认识时才起作用。

你可以这样做:

public string SignData(string message, string secret)
{
    var encoding = new System.Text.UTF8Encoding();
    var keyBytes = encoding.GetBytes(secret);
    var messageBytes = encoding.GetBytes(message);
    using (var hmacsha1 = new HMACSHA1(keyBytes))
    {
        var hashMessage = hmacsha1.ComputeHash(messageBytes);
        return Convert.ToBase64String(hashMessage);
    }
}

【讨论】:

  • 如何从这个已知秘密的签名数据中检索原始数据?
猜你喜欢
  • 1970-01-01
  • 2021-01-20
  • 2015-05-25
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多