Hashing with HmacSHA256 returns unexpected result












0














I need to sign a message with a MAC using SHA-256 algorithm. I have the code for generating the MAC, however validation on the other end is failing.
I've been told that the value I am calculating is wrong.



Here is my code



    public static byte calculateMAC(byte _aiOutBufferForMacCalculation, String key) {
try{

Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte mac_data=sha256_HMAC.doFinal(_aiOutBufferForMacCalculation);

String result = "";
for (final byte element : mac_data)
{
result += Integer.toString((element & 0xff) + 0x100, 16).substring(1);
}
System.out.println("Result:[" + result + "]");

return mac_data;
} catch (Exception _exception) {
_exception.printStackTrace();
}

public static byte hexStringToByteArray(String s) {
int len = s.length();
byte data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}

public static void main(String args) {
String key = "7F6D7A688019DC4CA83883F2459E6B389BE99BB63B622A97";
String cadena = "1800990000014303181112190600048430303030303134370029030003483032001148324830303030303135320008143919751D5EB97C";


byte data_for_mac = hexStringToByteArray(cadena);

System.out.println(new String(data_for_mac));

bytemac = calculateMAC(data_for_mac,key);



}

}


What I see printed as a result is:
0e01a8a96b30ae0a918865d1cef898ea4f96e18680fa9aae4c5d9902090c2f81



But the expected value is:
7684024da7fe89029965ac037a1ec94b21479c91cd8495e726fec924e84b0773



I used a couple of online tools that allow me to enter an hexadecimal string as inputo to generate the hash. The result is the same as the expected, so I confirmed that mine has a problem.



I don´t know what I might be doing different or wrong,can anyone please help?
Thank you










share|improve this question





























    0














    I need to sign a message with a MAC using SHA-256 algorithm. I have the code for generating the MAC, however validation on the other end is failing.
    I've been told that the value I am calculating is wrong.



    Here is my code



        public static byte calculateMAC(byte _aiOutBufferForMacCalculation, String key) {
    try{

    Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
    SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
    sha256_HMAC.init(secret_key);
    byte mac_data=sha256_HMAC.doFinal(_aiOutBufferForMacCalculation);

    String result = "";
    for (final byte element : mac_data)
    {
    result += Integer.toString((element & 0xff) + 0x100, 16).substring(1);
    }
    System.out.println("Result:[" + result + "]");

    return mac_data;
    } catch (Exception _exception) {
    _exception.printStackTrace();
    }

    public static byte hexStringToByteArray(String s) {
    int len = s.length();
    byte data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
    data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
    + Character.digit(s.charAt(i+1), 16));
    }
    return data;
    }

    public static void main(String args) {
    String key = "7F6D7A688019DC4CA83883F2459E6B389BE99BB63B622A97";
    String cadena = "1800990000014303181112190600048430303030303134370029030003483032001148324830303030303135320008143919751D5EB97C";


    byte data_for_mac = hexStringToByteArray(cadena);

    System.out.println(new String(data_for_mac));

    bytemac = calculateMAC(data_for_mac,key);



    }

    }


    What I see printed as a result is:
    0e01a8a96b30ae0a918865d1cef898ea4f96e18680fa9aae4c5d9902090c2f81



    But the expected value is:
    7684024da7fe89029965ac037a1ec94b21479c91cd8495e726fec924e84b0773



    I used a couple of online tools that allow me to enter an hexadecimal string as inputo to generate the hash. The result is the same as the expected, so I confirmed that mine has a problem.



    I don´t know what I might be doing different or wrong,can anyone please help?
    Thank you










    share|improve this question



























      0












      0








      0







      I need to sign a message with a MAC using SHA-256 algorithm. I have the code for generating the MAC, however validation on the other end is failing.
      I've been told that the value I am calculating is wrong.



      Here is my code



          public static byte calculateMAC(byte _aiOutBufferForMacCalculation, String key) {
      try{

      Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
      SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
      sha256_HMAC.init(secret_key);
      byte mac_data=sha256_HMAC.doFinal(_aiOutBufferForMacCalculation);

      String result = "";
      for (final byte element : mac_data)
      {
      result += Integer.toString((element & 0xff) + 0x100, 16).substring(1);
      }
      System.out.println("Result:[" + result + "]");

      return mac_data;
      } catch (Exception _exception) {
      _exception.printStackTrace();
      }

      public static byte hexStringToByteArray(String s) {
      int len = s.length();
      byte data = new byte[len / 2];
      for (int i = 0; i < len; i += 2) {
      data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
      + Character.digit(s.charAt(i+1), 16));
      }
      return data;
      }

      public static void main(String args) {
      String key = "7F6D7A688019DC4CA83883F2459E6B389BE99BB63B622A97";
      String cadena = "1800990000014303181112190600048430303030303134370029030003483032001148324830303030303135320008143919751D5EB97C";


      byte data_for_mac = hexStringToByteArray(cadena);

      System.out.println(new String(data_for_mac));

      bytemac = calculateMAC(data_for_mac,key);



      }

      }


      What I see printed as a result is:
      0e01a8a96b30ae0a918865d1cef898ea4f96e18680fa9aae4c5d9902090c2f81



      But the expected value is:
      7684024da7fe89029965ac037a1ec94b21479c91cd8495e726fec924e84b0773



      I used a couple of online tools that allow me to enter an hexadecimal string as inputo to generate the hash. The result is the same as the expected, so I confirmed that mine has a problem.



      I don´t know what I might be doing different or wrong,can anyone please help?
      Thank you










      share|improve this question















      I need to sign a message with a MAC using SHA-256 algorithm. I have the code for generating the MAC, however validation on the other end is failing.
      I've been told that the value I am calculating is wrong.



      Here is my code



          public static byte calculateMAC(byte _aiOutBufferForMacCalculation, String key) {
      try{

      Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
      SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
      sha256_HMAC.init(secret_key);
      byte mac_data=sha256_HMAC.doFinal(_aiOutBufferForMacCalculation);

      String result = "";
      for (final byte element : mac_data)
      {
      result += Integer.toString((element & 0xff) + 0x100, 16).substring(1);
      }
      System.out.println("Result:[" + result + "]");

      return mac_data;
      } catch (Exception _exception) {
      _exception.printStackTrace();
      }

      public static byte hexStringToByteArray(String s) {
      int len = s.length();
      byte data = new byte[len / 2];
      for (int i = 0; i < len; i += 2) {
      data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
      + Character.digit(s.charAt(i+1), 16));
      }
      return data;
      }

      public static void main(String args) {
      String key = "7F6D7A688019DC4CA83883F2459E6B389BE99BB63B622A97";
      String cadena = "1800990000014303181112190600048430303030303134370029030003483032001148324830303030303135320008143919751D5EB97C";


      byte data_for_mac = hexStringToByteArray(cadena);

      System.out.println(new String(data_for_mac));

      bytemac = calculateMAC(data_for_mac,key);



      }

      }


      What I see printed as a result is:
      0e01a8a96b30ae0a918865d1cef898ea4f96e18680fa9aae4c5d9902090c2f81



      But the expected value is:
      7684024da7fe89029965ac037a1ec94b21479c91cd8495e726fec924e84b0773



      I used a couple of online tools that allow me to enter an hexadecimal string as inputo to generate the hash. The result is the same as the expected, so I confirmed that mine has a problem.



      I don´t know what I might be doing different or wrong,can anyone please help?
      Thank you







      java hash cryptography sha256 hmac






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 13 '18 at 15:21







      gabyly

















      asked Nov 13 '18 at 6:42









      gabylygabyly

      32




      32
























          1 Answer
          1






          active

          oldest

          votes


















          0














          From your main function parameters, I'm expecting that key is hex string too. So you need to call hexStringToByteArray for it too. getBytes() method just return bytes, it will not convert from hex string.



          Change calculateMAC function to something like this:



          public static byte calculateMAC(byte _aiOutBufferForMacCalculation, byte key) {
          try{

          Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
          SecretKeySpec secret_key = new SecretKeySpec(key, "HmacSHA256");
          ...
          }


          and you main like this:



          public static void main(String args) {
          String key = "7F6D7A688019DC4CA83883F2459E6B389BE99BB63B622A97";
          String cadena = "1800990000014303181112190600048430303030303134370029030003483032001148324830303030303135320008143919751D5EB97C";


          byte data_for_mac = hexStringToByteArray(cadena);
          byte mac_key = hexStringToByteArray(key);

          // System.out.println(new String(data_for_mac)); <-- what is this????

          byte mac = calculateMAC(data_for_mac,mac_key);
          }


          I tested and with these 2 small changes, you get your expected results.



          By the way, I'm expecting that you have surely not posted all important key in this sample code and you are just using a dummy one. :D






          share|improve this answer























          • That absolutely solved it! Thank you very much, and yes I used a dummy key I got from a random key generator.
            – gabyly
            Nov 13 '18 at 20:03











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53275230%2fhashing-with-hmacsha256-returns-unexpected-result%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          0














          From your main function parameters, I'm expecting that key is hex string too. So you need to call hexStringToByteArray for it too. getBytes() method just return bytes, it will not convert from hex string.



          Change calculateMAC function to something like this:



          public static byte calculateMAC(byte _aiOutBufferForMacCalculation, byte key) {
          try{

          Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
          SecretKeySpec secret_key = new SecretKeySpec(key, "HmacSHA256");
          ...
          }


          and you main like this:



          public static void main(String args) {
          String key = "7F6D7A688019DC4CA83883F2459E6B389BE99BB63B622A97";
          String cadena = "1800990000014303181112190600048430303030303134370029030003483032001148324830303030303135320008143919751D5EB97C";


          byte data_for_mac = hexStringToByteArray(cadena);
          byte mac_key = hexStringToByteArray(key);

          // System.out.println(new String(data_for_mac)); <-- what is this????

          byte mac = calculateMAC(data_for_mac,mac_key);
          }


          I tested and with these 2 small changes, you get your expected results.



          By the way, I'm expecting that you have surely not posted all important key in this sample code and you are just using a dummy one. :D






          share|improve this answer























          • That absolutely solved it! Thank you very much, and yes I used a dummy key I got from a random key generator.
            – gabyly
            Nov 13 '18 at 20:03
















          0














          From your main function parameters, I'm expecting that key is hex string too. So you need to call hexStringToByteArray for it too. getBytes() method just return bytes, it will not convert from hex string.



          Change calculateMAC function to something like this:



          public static byte calculateMAC(byte _aiOutBufferForMacCalculation, byte key) {
          try{

          Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
          SecretKeySpec secret_key = new SecretKeySpec(key, "HmacSHA256");
          ...
          }


          and you main like this:



          public static void main(String args) {
          String key = "7F6D7A688019DC4CA83883F2459E6B389BE99BB63B622A97";
          String cadena = "1800990000014303181112190600048430303030303134370029030003483032001148324830303030303135320008143919751D5EB97C";


          byte data_for_mac = hexStringToByteArray(cadena);
          byte mac_key = hexStringToByteArray(key);

          // System.out.println(new String(data_for_mac)); <-- what is this????

          byte mac = calculateMAC(data_for_mac,mac_key);
          }


          I tested and with these 2 small changes, you get your expected results.



          By the way, I'm expecting that you have surely not posted all important key in this sample code and you are just using a dummy one. :D






          share|improve this answer























          • That absolutely solved it! Thank you very much, and yes I used a dummy key I got from a random key generator.
            – gabyly
            Nov 13 '18 at 20:03














          0












          0








          0






          From your main function parameters, I'm expecting that key is hex string too. So you need to call hexStringToByteArray for it too. getBytes() method just return bytes, it will not convert from hex string.



          Change calculateMAC function to something like this:



          public static byte calculateMAC(byte _aiOutBufferForMacCalculation, byte key) {
          try{

          Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
          SecretKeySpec secret_key = new SecretKeySpec(key, "HmacSHA256");
          ...
          }


          and you main like this:



          public static void main(String args) {
          String key = "7F6D7A688019DC4CA83883F2459E6B389BE99BB63B622A97";
          String cadena = "1800990000014303181112190600048430303030303134370029030003483032001148324830303030303135320008143919751D5EB97C";


          byte data_for_mac = hexStringToByteArray(cadena);
          byte mac_key = hexStringToByteArray(key);

          // System.out.println(new String(data_for_mac)); <-- what is this????

          byte mac = calculateMAC(data_for_mac,mac_key);
          }


          I tested and with these 2 small changes, you get your expected results.



          By the way, I'm expecting that you have surely not posted all important key in this sample code and you are just using a dummy one. :D






          share|improve this answer














          From your main function parameters, I'm expecting that key is hex string too. So you need to call hexStringToByteArray for it too. getBytes() method just return bytes, it will not convert from hex string.



          Change calculateMAC function to something like this:



          public static byte calculateMAC(byte _aiOutBufferForMacCalculation, byte key) {
          try{

          Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
          SecretKeySpec secret_key = new SecretKeySpec(key, "HmacSHA256");
          ...
          }


          and you main like this:



          public static void main(String args) {
          String key = "7F6D7A688019DC4CA83883F2459E6B389BE99BB63B622A97";
          String cadena = "1800990000014303181112190600048430303030303134370029030003483032001148324830303030303135320008143919751D5EB97C";


          byte data_for_mac = hexStringToByteArray(cadena);
          byte mac_key = hexStringToByteArray(key);

          // System.out.println(new String(data_for_mac)); <-- what is this????

          byte mac = calculateMAC(data_for_mac,mac_key);
          }


          I tested and with these 2 small changes, you get your expected results.



          By the way, I'm expecting that you have surely not posted all important key in this sample code and you are just using a dummy one. :D







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 13 '18 at 15:58

























          answered Nov 13 '18 at 15:25









          AfshinAfshin

          3,0011624




          3,0011624












          • That absolutely solved it! Thank you very much, and yes I used a dummy key I got from a random key generator.
            – gabyly
            Nov 13 '18 at 20:03


















          • That absolutely solved it! Thank you very much, and yes I used a dummy key I got from a random key generator.
            – gabyly
            Nov 13 '18 at 20:03
















          That absolutely solved it! Thank you very much, and yes I used a dummy key I got from a random key generator.
          – gabyly
          Nov 13 '18 at 20:03




          That absolutely solved it! Thank you very much, and yes I used a dummy key I got from a random key generator.
          – gabyly
          Nov 13 '18 at 20:03


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53275230%2fhashing-with-hmacsha256-returns-unexpected-result%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          這個網誌中的熱門文章

          Xamarin.form Move up view when keyboard appear

          Post-Redirect-Get with Spring WebFlux and Thymeleaf

          Anylogic : not able to use stopDelay()