How to generate HMAC-SHA1 in C#?
an extension to Vimvq1987's answer:
return hashValue.ToString();
doesn't produce the output you want/need. You have to convert the bytes in the array hashValue
to their hex-string representation.
Can be as simple as return BitConverter.toString(hashValue);
(prints upper-case letters A-F) or if you like it a bit more complex:
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; } }}
which prints
3545e064fb59bc4bfc02b6e1c3d4925c898aa5043249f4c8468d4d67f465937da05b809eaff22fdb87baaadf5d096677f944015e53d283834eb1e9436325376820c29a09e3ab30db000033aa71d6927d54579b0146e2476595381d837ee38863be358213
and I get the exact same result for
<?php$secretKey = 'abcdefghijklmnopqrstuvwxyz';$signatureString = '';foreach( array('Marry',' had',' a',' little',' lamb') as $s ) { $signatureString .= $s; echo hash_hmac('sha1', $signatureString, $secretKey, false), "\n";}
edit: Dmitriy Nemykin suggested the following edit
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 ); }}
which was rejected. But as James already pointed out in a comment to this answer at the very least the using statement is a good point.
This site has some pretty good examples across languages: http://jokecamp.wordpress.com/2012/10/21/examples-of-creating-base64-hashes-using-hmac-sha256-in-different-languages/
The c# implementation at the time of writing is:
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); }}
Try this:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacsha1.aspx
quick and dirty code:
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();}