Как сгенерировать HMAC-SHA1 на C #?

Я пытаюсь использовать REST API на C #. Создатель 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();

44
задан jessegavin 1 November 2016 в 22:19
поделиться