You need to sign in to do that
Don't have an account?
Adam Patton
Generate HmacSHA256 for SAS Token
I am trying to compute a HmacSHA256 Hash using APEX and I cannot get the correct encrypted signiture. Below is my Apex and the C# example that I am modeling after that works.
Apex:
datetime dt = datetime.now();
long epoch = dt.getTime()/1000;
System.debug('epoch: '+epoch);
Integer week = 60*60*24*7;
epoch = epoch+week;
Integer expiry = epoch.intValue();
System.debug('expiry: '+expiry);
String sasToken = null;
String stringToSign = resourceUri + '\n' + expiry;
String privateKey = EncodingUtil.urlEncode(key, 'UTF-8') ;
Blob privateKeyBlob = Blob.valueOf(EncodingUtil.urlEncode(privateKey, 'UTF-8'));
Blob urlBlob = Blob.valueOf(EncodingUtil.urlEncode(stringToSign, 'UTF-8'));
Blob signatureBlob = Crypto.generateMac('HmacSHA256', privateKeyBlob, urlBlob );
String s = EncodingUtil.base64Encode(signatureBlob);
String signature = EncodingUtil.base64encode(signatureBlob);
sasToken = 'SharedAccessSignature sr=' + EncodingUtil.urlEncode(resourceUri, 'UTF-8') +'&sig=' +
EncodingUtil.urlEncode(s, 'UTF-8') + '&se=' + expiry + '&skn=' + keyName;
C# Code:
var fromEpochStart = DateTime.UtcNow - new DateTime(1970, 1, 1);
var expiry = Convert.ToString((int)fromEpochStart.TotalSeconds + 3600);
var stringToSign = HttpUtility.UrlEncode(baseUrl) + "\n" + expiry;
var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(sasKeyValue));
var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
var sasToken = string.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",
HttpUtility.UrlEncode(baseUrl), HttpUtility.UrlEncode(signature), expiry, sasKeyName);
Apex:
datetime dt = datetime.now();
long epoch = dt.getTime()/1000;
System.debug('epoch: '+epoch);
Integer week = 60*60*24*7;
epoch = epoch+week;
Integer expiry = epoch.intValue();
System.debug('expiry: '+expiry);
String sasToken = null;
String stringToSign = resourceUri + '\n' + expiry;
String privateKey = EncodingUtil.urlEncode(key, 'UTF-8') ;
Blob privateKeyBlob = Blob.valueOf(EncodingUtil.urlEncode(privateKey, 'UTF-8'));
Blob urlBlob = Blob.valueOf(EncodingUtil.urlEncode(stringToSign, 'UTF-8'));
Blob signatureBlob = Crypto.generateMac('HmacSHA256', privateKeyBlob, urlBlob );
String s = EncodingUtil.base64Encode(signatureBlob);
String signature = EncodingUtil.base64encode(signatureBlob);
sasToken = 'SharedAccessSignature sr=' + EncodingUtil.urlEncode(resourceUri, 'UTF-8') +'&sig=' +
EncodingUtil.urlEncode(s, 'UTF-8') + '&se=' + expiry + '&skn=' + keyName;
C# Code:
var fromEpochStart = DateTime.UtcNow - new DateTime(1970, 1, 1);
var expiry = Convert.ToString((int)fromEpochStart.TotalSeconds + 3600);
var stringToSign = HttpUtility.UrlEncode(baseUrl) + "\n" + expiry;
var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(sasKeyValue));
var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
var sasToken = string.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",
HttpUtility.UrlEncode(baseUrl), HttpUtility.UrlEncode(signature), expiry, sasKeyName);
Daniel Laksana
Please try this code below. I have tested and worked:
joost karsten 4
I tested your code and can confirm that it works! Thanks for this, took me quite some time to find out