我正在尝试使用C#利用REST API。API创建者已经在PHP、Ruby和Java中提供了示例库。我遇到了一个问题,需要生成HMAC
的一部分。
以下是他们提供的示例库中如何完成此操作的方法。
PHP
hash_hmac('sha1', $signatureString, $secretKey, false);
Ruby
digest = OpenSSL::Digest::Digest.new('sha1')
return OpenSSL::HMAC.hexdigest(digest, secretKey, signatureString)
Java
SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes(), HMAC_SHA1_ALGORITHM);
Mac mac = null;
mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
mac.init(signingKey);
byte[] bytes = mac.doFinal(signatureString.getBytes());
String form = "";
for (int i = 0; i < bytes.length; i++)
{
String str = Integer.toHexString(((int)bytes[i]) & 0xff);
if (str.length() == 1)
{
str = "0" + str;
}
form = form + str;
}
return form;
这是我在 C# 中的尝试。它不起作用。更新:下面的 C# 示例完美运行。我发现真正的问题是由于我的signatureString
中换行字符的跨平台差异导致的。
var enc = Encoding.ASCII;
HMACSHA1 hmac = new HMACSHA1(enc.GetBytes(secretKey));
hmac.Initialize();
byte[] buffer = enc.GetBytes(signatureString);
return BitConverter.ToString(hmac.ComputeHash(buffer)).Replace("-", "").ToLower();
signatureString
中换行符的跨平台差异导致的。我将标记此问题以进行删除。 - jessegavin