Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Hi,
When trying to connect to an API I have to convert a string to SHA-512. I found a similar question here: https://community.talend.com/t5/Design-and-Development/resolved-String-to-SHA-256/td-p/84300
Although I am not used to java coding, I did get that routine working. It seems the routine is not entirely applicable because my output string is different from the output string the API manual says I should have:
The documentation provides this example string:
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOUspRHGNhIMnZ6say4k3swVMfKER8UYbVOREqq7t71VL89bagEFZW4rSjkTcBg7fVZCWX5ijgQVEX4xfV5lapcCAwEAAQ==GET/authefec3dc1-9a99-4825-9e09-3e7772fc205d1456823909
The documentation says the output string should be:
RK+xg4V0hfgKs27ORFA2mVkXhYIX14zRH/f5bl6KqZB8zxJNgDpC6yHVIlN0uPuDXsR0cfdU9jAM1GdG7yzUSg==
The instruction says: "When extracting the byte array from the string, UTF8 decoding should be used. The SHA512 hash should be Base64 encoded." Probably I need to adjust the routine to decode/encode correctly based on this instruction, I don't know how to apply the necessary changes.
My question: Does anyone get the output string above, if so, how did you succeed?
Thank you
EDIT: edited the title and first sentence because it said SHA-256 instead of SHA-512
PS: I do see the correct output when testing the string on this page: http://approsto.com/sha-generator/ the correct output is show in field 'SHA512 base64 hash'
Update: first I managed to get a hex hash, with this code below.
public static String getHashCodeFromString(String str) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-512"); md.update(str.getBytes()); byte byteData[] = md.digest(); //convert the byte to hex format method 1 StringBuffer hashCodeBuffer = new StringBuffer(); for (int i = 0; i < byteData.length; i++) { hashCodeBuffer.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); } return hashCodeBuffer.toString(); }
What I needed is base64. I changed the code above, to the final code below, which gave me the expected result:
package routines; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import sun.misc.BASE64Encoder; public class MyRoutineStringToSHA512test7 { public static String getHashCodeFromString(String str) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-512"); md.update(str.getBytes()); byte byteData[] = md.digest(); String hashCodeBuffer = (new BASE64Encoder()).encode(byteData); return hashCodeBuffer.toString(); } }
Update: first I managed to get a hex hash, with this code below.
public static String getHashCodeFromString(String str) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-512"); md.update(str.getBytes()); byte byteData[] = md.digest(); //convert the byte to hex format method 1 StringBuffer hashCodeBuffer = new StringBuffer(); for (int i = 0; i < byteData.length; i++) { hashCodeBuffer.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); } return hashCodeBuffer.toString(); }
What I needed is base64. I changed the code above, to the final code below, which gave me the expected result:
package routines; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import sun.misc.BASE64Encoder; public class MyRoutineStringToSHA512test7 { public static String getHashCodeFromString(String str) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-512"); md.update(str.getBytes()); byte byteData[] = md.digest(); String hashCodeBuffer = (new BASE64Encoder()).encode(byteData); return hashCodeBuffer.toString(); } }
Hello,
Thanks for posting that you have resolved it by yourself.
Best regards
Sabrina