比较C#中用于电报登录的HMACSHA256哈希
我正在按照官方教程实现一个网站的电报登录 将生成的哈希值与收到的哈希值进行比较时,字符串不匹配 我错过了什么比较C#中用于电报登录的HMACSHA256哈希,c#,telegram,hmac,C#,Telegram,Hmac,我正在按照官方教程实现一个网站的电报登录 将生成的哈希值与收到的哈希值进行比较时,字符串不匹配 我错过了什么 { string dataCheckString = $"auth_date={loginData.AuthDate}\nfirst_name={loginData.FirstName}\nid={loginData.Id}\nphoto_url={loginData.PhotoUrl}\nusername
{
string dataCheckString =
$"auth_date={loginData.AuthDate}\nfirst_name={loginData.FirstName}\nid={loginData.Id}\nphoto_url={loginData.PhotoUrl}\nusername={loginData.Username}";
var secretKey = Sha256Hash("<bot_token>");
var myHash = HashHmac(Encoding.UTF8.GetBytes(secretKey), Encoding.UTF8.GetBytes(dataCheckString));
var myHashStr = Concat(myHash.Select(i => i.ToString("x2")));
if (myHashStr == loginData.Hash)
{
// Data is from telegram
}
return NotFound();
}```
我猜问题在于,您的散列键实际上不是散列键,而是散列键的十六进制表示形式。尝试将Sha256更改为
public byte[]ShaHash(字符串值){using(var hasher=Sha256.Create()){return hasher.ComputeHash(Encoding.UTF8.GetBytes(value));}}
,并直接使用字节数组(实际哈希)作为hashmac函数的参数。完美
private static string Sha256Hash(string value)
{
using (SHA256 hash = SHA256.Create())
{
return Concat(hash.ComputeHash(Encoding.UTF8.GetBytes(value)).Select(i => i.ToString("x2")));
}
}
private static byte[] HashHmac(byte[] key, byte[] message)
{
var hash = new HMACSHA256(key);
return hash.ComputeHash(message);
}