从 id 创建哈希并签名
Create a hash from an id and sign it
我们的用户收到带有准备好的超链接的电子邮件。
这个超链接有一个参数。
当用户点击超链接时,我需要确保用户没有篡改参数。
参数是一个简单的整数。
- 我想从整数创建一个散列。
- 我想签署哈希。
我应该使用哪些当前的 .NET 类 来完成这项任务?
你可以看到here如何计算散列。
由于 HASH 函数只接受数组,我建议您创建一个包含单个项目的数组,其中包含您的整数。
您可以"sign"输入计算上面计算的哈希值的哈希值加上您的应用程序的常量(或日期和时间,例如)
最简单的方法是使用 HMAC ("keyed-hash message authentication code")。
public static string CreateHMAC(int data, byte[] key)
{
using(var hmac = new HMACSHA1(key))
{
var dataArray = BitConverter.GetBytes(data);
var resultArray = hmac.ComputeHash(dataArray);
return Convert.ToBase64String(resultArray);
}
}
您在您的服务器上保密 key
,并在 URL 中将 data
和 CreateHMAC
的结果传递给用户。当用户单击 link 时,您验证数据未被修改。
public static bool VerifyHMAC(int data, byte[] key, string verification)
{
using(var hmac = new HMACSHA1(key))
{
var dataArray = BitConverter.GetBytes(data);
var computedHash = hmac.ComputeHash(dataArray);
var verificationHash = Convert.FromBase64String(verification);
for (int i = 0; i < verificationHash.Length; i++)
{
if (computedHash[i] != verificationHash[i])
{
return false;
}
}
return true;
}
}
我们的用户收到带有准备好的超链接的电子邮件。
这个超链接有一个参数。
当用户点击超链接时,我需要确保用户没有篡改参数。
参数是一个简单的整数。
- 我想从整数创建一个散列。
- 我想签署哈希。
我应该使用哪些当前的 .NET 类 来完成这项任务?
你可以看到here如何计算散列。
由于 HASH 函数只接受数组,我建议您创建一个包含单个项目的数组,其中包含您的整数。
您可以"sign"输入计算上面计算的哈希值的哈希值加上您的应用程序的常量(或日期和时间,例如)
最简单的方法是使用 HMAC ("keyed-hash message authentication code")。
public static string CreateHMAC(int data, byte[] key)
{
using(var hmac = new HMACSHA1(key))
{
var dataArray = BitConverter.GetBytes(data);
var resultArray = hmac.ComputeHash(dataArray);
return Convert.ToBase64String(resultArray);
}
}
您在您的服务器上保密 key
,并在 URL 中将 data
和 CreateHMAC
的结果传递给用户。当用户单击 link 时,您验证数据未被修改。
public static bool VerifyHMAC(int data, byte[] key, string verification)
{
using(var hmac = new HMACSHA1(key))
{
var dataArray = BitConverter.GetBytes(data);
var computedHash = hmac.ComputeHash(dataArray);
var verificationHash = Convert.FromBase64String(verification);
for (int i = 0; i < verificationHash.Length; i++)
{
if (computedHash[i] != verificationHash[i])
{
return false;
}
}
return true;
}
}