c# - 암호화 - sha256 hmacsha256




C#에서 HMAC-SHA1을 생성하는 방법은 무엇입니까? (2)

C #을 사용하여 REST API를 사용하려고합니다. API 작성자는 PHP, Ruby 및 Java에서 샘플 라이브러리를 제공합니다. 나는 HMAC 을 생성해야하는 부분의 한 부분에 매달려있다.

그들이 제공 한 샘플 라이브러리에서 수행되는 방법은 다음과 같습니다.

PHP

hash_hmac('sha1', $signatureString, $secretKey, false);

루비

digest = OpenSSL::Digest::Digest.new('sha1')
return OpenSSL::HMAC.hexdigest(digest, secretKey, signatureString)

자바

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();

이 사이트는 여러 언어에서 좋은 예가 있습니다. http://jokecamp.wordpress.com/2012/10/21/examples-of-creating-base64-hashes-using-hmac-sha256-in-different-languages/

작성 당시의 C # 구현은 다음과 같습니다.

private string CreateToken(string message, string secret)
{
 secret = secret ?? "";
 var encoding = new System.Text.ASCIIEncoding();
 byte[] keyByte = encoding.GetBytes(secret);
 byte[] messageBytes = encoding.GetBytes(message);
 using (var hmacsha256 = new HMACSHA256(keyByte))
 {
 byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
 return Convert.ToBase64String(hashmessage);
 }
}

이 시도:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacsha1.aspx

신속하고 지저분한 코드 :

public string Encode(string input, byte [] key)
{
        HMACSHA1 myhmacsha1 = new HMACSHA1(key);
        byte[] byteArray = Encoding.ASCII.GetBytes( input );
        MemoryStream stream = new MemoryStream( byteArray ); 
        byte[] hashValue = myhmacsha1.ComputeHash(stream);
        return hashValue.ToString();
}




hmac