HMAC-SHA1 को C#में कैसे जनरेट करें?




java php (3)

मैं C # का उपयोग करके REST API का उपयोग करने का प्रयास कर रहा हूं। एपीआई निर्माता ने पीएचपी, रूबी और जावा में नमूना पुस्तकालय प्रदान किए हैं। मैं इसके एक हिस्से पर लटका हुआ हूं, जहां मुझे HMAC उत्पन्न करने की आवश्यकता है।

यहां बताया गया है कि यह उनके द्वारा प्रदान किए गए नमूना पुस्तकालयों में कैसे किया जाता है।

पीएचपी

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 # में मेरा प्रयास है। यह काम नहीं कर रहा है। अद्यतन: नीचे सी # उदाहरण ठीक काम करता है। मुझे पता चला कि असली समस्या मेरे 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();

Vimvq1987 के उत्तर का विस्तार:

return hashValue.ToString(); आप चाहते हैं उत्पादन की जरूरत नहीं है / की जरूरत है। आपको सरणी hashValue में बाइट्स को उनके हेक्स-स्ट्रिंग प्रतिनिधित्व में hashValue होगा।
return BitConverter.toString(hashValue); रूप में सरल हो सकता है return BitConverter.toString(hashValue); (प्रिंट ऊपरी मामले पत्र वायुसेना) या यदि आप इसे थोड़ा और अधिक जटिल पसंद करते हैं:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        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 );
        }


        static void Main(string[] args)
        {
            byte[] key = Encoding.ASCII.GetBytes("abcdefghijklmnopqrstuvwxyz");
            string input = "";
            foreach (string s in new string[] { "Marry", " had", " a", " little", " lamb" })
            {
                input += s;
                System.Console.WriteLine( Encode(input, key) );
            }
            return;
        }
    }
}

जो प्रिंट करता है

3545e064fb59bc4bfc02b6e1c3d4925c898aa504
3249f4c8468d4d67f465937da05b809eaff22fdb
87baaadf5d096677f944015e53d283834eb1e943
6325376820c29a09e3ab30db000033aa71d6927d
54579b0146e2476595381d837ee38863be358213

और मुझे इसके समान परिणाम मिलते हैं

<?php
$secretKey = 'abcdefghijklmnopqrstuvwxyz';

$signatureString = '';
foreach( array('Marry',' had',' a',' little',' lamb') as $s ) {
    $signatureString .= $s;
    echo hash_hmac('sha1', $signatureString, $secretKey, false), "\n";
}

संपादित करें: दमित्री नेमीकिन ने निम्नलिखित संपादन का सुझाव दिया

public static string Encode(string input, byte[] key)
{
    byte[] byteArray = Encoding.ASCII.GetBytes(input);
    using(var myhmacsha1 = new HMACSHA1(key))
    {
        var hashArray = myhmacsha1.ComputeHash(byteArray);
        return hashArray.Aggregate("", (s, e) => s + String.Format("{0:x2}",e), s => s );
    }
}

जिसे अस्वीकार कर दिया गया था। लेकिन जैसा कि जेम्स ने पहले ही इस जवाब में एक टिप्पणी में कहा था कि कम से कम उपयोग करने वाला बयान एक अच्छा बिंदु है।


इस साइट के भाषाओं में कुछ बहुत अच्छे उदाहरण हैं: http://jokecamp.wordpress.com/2012/10/21/examples-of-creating-base64-hashes-using-hmac-sha256-in-different-languages/

लेखन के समय ग # कार्यान्वयन है:

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