如何在 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。但是我找不到合适的文档。这就是我无法使用它的原因。
好的基本上让我们把它分成两个简单的概念Cryptography
和Hashing
。
密码学
有三个字段 secrete key
一个 value
和一个 encrypted value
,以及两个方法。
Encrypt(value, secret-key)
这个方法得到value
和secret key
和returnsencrypted value
.
Decrypt(encrypted-value, secret-key)
并且此方法得到 encrypted value
和 secret key
和 returns value
.
像 AES
、DES
等...
散列
只有两个个字段value
和hashed value
,以及一个方法。
Hash(value)
这个方法得到value
和returnshashed value
.
喜欢MD5
、SHA
家人等...
简单吧!
所以你的问题不正确,因为MD5
是一种散列算法,通常用于散列密码和比较它们的散列值。
现在我建议您看一下您所说的API以进行身份验证。
You can share the link of documentation or an already encrypted header (if it is not sensitive data) to help you.
更新
根据 link,它使用 HMAC
和 MD5
。
这是文档中的示例,写在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 中的值,用盐对其进行散列并将结果与数据库中的散列秘密进行比较。如果匹配,用户将通过身份验证。
这样是不是更符合你的想法?你的问题是如何正确散列?
我正在开发 API,它需要 header 才能进行 API 身份验证。 header 包含使用 md5 算法和密钥创建的哈希字符串。我想写一个这样的函数:
public string CreateMD5Hash(string input, string secretKey)
{
return output;
}
我试过使用充气城堡API。但是我找不到合适的文档。这就是我无法使用它的原因。
好的基本上让我们把它分成两个简单的概念Cryptography
和Hashing
。
密码学
有三个字段 secrete key
一个 value
和一个 encrypted value
,以及两个方法。
Encrypt(value, secret-key)
这个方法得到value
和secret key
和returnsencrypted value
.Decrypt(encrypted-value, secret-key)
并且此方法得到encrypted value
和secret key
和 returnsvalue
.
像AES
、DES
等...
散列
只有两个个字段value
和hashed value
,以及一个方法。
Hash(value)
这个方法得到value
和returnshashed value
.
喜欢MD5
、SHA
家人等...
简单吧!
所以你的问题不正确,因为MD5
是一种散列算法,通常用于散列密码和比较它们的散列值。
现在我建议您看一下您所说的API以进行身份验证。
You can share the link of documentation or an already encrypted header (if it is not sensitive data) to help you.
更新
根据 link,它使用 HMAC
和 MD5
。
这是文档中的示例,写在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 中的值,用盐对其进行散列并将结果与数据库中的散列秘密进行比较。如果匹配,用户将通过身份验证。
这样是不是更符合你的想法?你的问题是如何正确散列?