我有一个PHP代码,下面是我执行下面的PHP代码时,当我运行C#代码,这是PHP代码以下我得到了不同结果我不知道我错在哪里。
$accessID = "member-1681fca809";
$secretKey = "63f22236ab43b69462b3272b110e3c78";
$expires = 1357039353;
$stringToSign = $accessID."\n".$expires;
$binarySignature = hash_hmac('sha1', $stringToSign, $secretKey, true);
$urlSafeSignature = urlencode(base64_encode($binarySignature));
print_r($expires);
print_r($urlSafeSignature);
I got Output
1357039353
M1PZW2DYVzdRV1l4ZHBPAmiv9iM%3D
当我在c#中运行相同的代码时,我得到了不同的输出
string accessid = "member-1681fca809";
string secretekey = "63f22236ab43b69462b3272b110e3c78";
int Expire = 1357039353;
string stringTosign = accessid + Environment.NewLine + Expire;
byte[] secret = UTF8Encoding.UTF8.GetBytes(secretekey);
HMACSHA1 myhmacsha1 = new HMACSHA1(secret);
byte[] byteArray = Encoding.ASCII.GetBytes(stringTosign);
MemoryStream stream = new MemoryStream(byteArray);
byte[] hashValue = myhmacsha1.ComputeHash(stream);
string k = Convert.ToBase64String(Encoding.ASCII.GetBytes(hashValue.ToString()));
console.WriteLine(Expire);
console.WriteLine(k);
I Got OutPut
1357039353
U3lzdGVtLkJ5dGVbXQ==
答案 0 :(得分:2)
稍微修改了你的代码。
string accessid = "member-1681fca809";
string secretekey = "63f22236ab43b69462b3272b110e3c78";
int Expire = 1357039353;
string stringTosign = accessid + "\n" + Expire;
byte[] secret = UTF8Encoding.UTF8.GetBytes(secretekey);
HMACSHA1 myhmacsha1 = new HMACSHA1(secret);
byte[] byteArray = Encoding.ASCII.GetBytes(stringTosign);
MemoryStream stream = new MemoryStream(byteArray);
byte[] hashValue = myhmacsha1.ComputeHash(stream);
string k = Convert.ToBase64String(hashValue);
Console.WriteLine(Expire);
Console.WriteLine(k);
唯一的区别是你使用的url_encode将转换“=”字符后的最后一个字符。
答案 1 :(得分:0)
谢谢!问题解决了,仍然想分享我的经验。
我正在做的错误是我使用字符串生成器sbr.Append而不是sbr.AppendLine()或直接字符串连接,就像你在那里读取\ n作为新行一样。
答案 2 :(得分:0)
当您获得HMACSHA1 / hash_hmac(' sha1',...)的不同结果时,启动拆分测试PHP和C#版本,输入非常简单,例如input =" a&# 34;,key =" b"。如果您在将密钥传递给HMACSHA1之前对其进行编码,请检查您是否正确编码它。我花了好几个小时认为问题是HMACSHA1哈希,而实际上这是一个糟糕的包实现(' H *' ...)。
public static string Encode(string input, byte[] key)
{
HMACSHA1 myhmacsha1 = new HMACSHA1(key);
byte[] byteArray = Encoding.ASCII.GetBytes(input);
MemoryStream stream = new MemoryStream(byteArray);
return myhmacsha1.ComputeHash(stream).Aggregate("", (s, e) => s + String.Format("{0:x2}", e), s => s);
}
并打包(' H *' ...)C#实施:
public static byte[] PackH(string hex)
{
if ((hex.Length % 2) == 1) hex += '0';
byte[] bytes = new byte[hex.Length / 2];
for (int i = 0; i < hex.Length; i += 2)
{
bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
}
return bytes;
}
当您将内容传递给Encode函数时,不要将字节数组中的内容转换为字符串并返回字节数组,只需传递一个字节[]&amp;保持简单。