• Adam Patton
  • NEWBIE
  • 0 Points
  • Member since 2017

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 1
    Questions
  • 0
    Replies
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);