如何在 C# 中使用密钥和 MD5 算法散列字符串?

How to hash a string with a secret key and MD5 algorithm in C#?

我正在开发 API,它需要 header 才能进行 API 身份验证。 header 包含使用 md5 算法和密钥创建的哈希字符串。我想写一个这样的函数:

public string CreateMD5Hash(string input, string secretKey)
{
    return output;
}

我试过使用充气城堡API。但是我找不到合适的文档。这就是我无法使用它的原因。

好的基本上让我们把它分成两个简单的概念CryptographyHashing

密码学

有三个字段 secrete key 一个 value 和一个 encrypted value,以及两个方法。

  • Encrypt(value, secret-key)这个方法得到valuesecret key和returnsencrypted value.
  • Decrypt(encrypted-value, secret-key) 并且此方法得到 encrypted valuesecret key 和 returns value.
    AESDES 等...

散列

只有两个个字段valuehashed value,以及一个方法。

  • Hash(value)这个方法得到value和returnshashed value.

喜欢MD5SHA家人等...

简单吧!

所以你的问题不正确,因为MD5是一种散列算法,通常用于散列密码和比较它们的散列值。

现在我建议您看一下您所说的API以进行身份​​验证。

You can share the link of documentation or an already encrypted header (if it is not sensitive data) to help you.

更新

根据 link,它使用 HMACMD5。 这是文档中的示例,写在PHP.

 $hash = hash_hmac('md5', $string, $key);

您可以将此代码用于 C#:

using System.Security.Cryptography;
using System.Text;

...

public string HashHmacMD5(string message, string secret)
{
    Encoding encoding = Encoding.UTF8;
    using (HMACMD5 hmac = new HMACMD5(encoding.GetBytes(secret)))
    {
        var msg = encoding.GetBytes(message);
        var hash = hmac.ComputeHash(msg);
        return BitConverter.ToString(hash).ToLower().Replace("-", string.Empty);
    }
}

你的问题有点令人费解。

对于简单的 API 身份验证,您想生成一个要与调用者共享的秘密。您应该验证此机密。

通常您会生成一个长度约为 50 的随机安全字符串 - 这是秘密。您与调用者共享此秘密 - 通常您会警告调用者安全地存储该值,因为无法恢复它。 不要在数据库中存储这个秘密。

您将生成盐并对秘密进行哈希处理。您将 salt 和散列的秘密都存储在数据库中。当请求到达时,您提取 header 中的值,用盐对其进行散列并将结果与​​数据库中的散列秘密进行比较。如果匹配,用户将通过身份验证。

这样是不是更符合你的想法?你的问题是如何正确散列?