我正在尝试使用C#的REST API。
API创建者为hmac创建提供了以下伪代码。
var key1 = sha1(body);
var key2 = key1 . SECRET_KEY;
var key3 = sha1(key2);
var signature = base64_encode(key3);
在上面的伪代码中,body是html请求体字符串和SECRET_KEY 是REST API提供程序提供的密钥。
据我所知,我需要使用System.Security.Cryptography.HMACSHA1类 实现这一点。
但是我无法在C#中完全实现上述逻辑。
有什么建议吗?
答案 0 :(得分:2)
将上述代码直接映射到C#将类似于:
static string ComputeSignature(byte[] body, byte[] secret) {
using (var sha1 = SHA1.Create())
{
var key1 = sha1.ComputeHash(body);
var key2 = key1.Concat(secret).ToArray();
var key3 = sha1.ComputeHash(key2);
return Convert.ToBase64String(key3);
}
}
如果您将请求正文作为字符串,请使用适当的编码将其转换为字节数组,例如:
var body = Encoding.UTF8.GetBytes(bodyAsString);
如果您将秘密作为字符串 - 这取决于api开发人员希望将其转换为字节数组的方式。很可能它已经是HEX或base64编码的字符串。
答案 1 :(得分:0)
使其在c#中工作的问题是,您需要考虑到十六进制格式,然后在某些情况下使其起作用,最终结果应为小写(例如,如果您将它用于quickblox api,则为示例等等)
private string GetHashedMessage(String _secret)
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(_secret);
String _message= "Your message that needs to be hashed";
HMACSHA1 hmacsha1 = new HMACSHA1(keyByte);
byte[] messageBytes = encoding.GetBytes(_message);
byte[] hashmessage = hmacsha1.ComputeHash(messageBytes);
return ByteToString(hashmessage).ToLower();
}
public string ByteToString(byte[] buff)
{
string sbinary = "";
for (int i = 0; i < buff.Length; i++)
{
sbinary += buff[i].ToString("X2"); // hex format
}
return (sbinary);
}