java hmac/sha512 generation
hmac, java, php, sha256
Solution
You simply forgot to mimic `pack()`'s behavior in your Java code (whatever you need that for).
Use
final SecretKeySpec secretKey = new SecretKeySpec( DatatypeConverter.parseHexBinary(PayboxConstants.KEY), "HmacSHA512" );
In your Java Code.
Where `DatatypeConverter.parseHexBinary()` is from the JAXB API.
Alternatively, if you don't want to include JAXB just for the purpose of converting HEX strings to bytes, you might want to use the code posted here.
Problem
I have this php code which generate a HMAC (and not a simple message digest): ``` <?php $key = "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"; $binkey = pack("H*", $key); echo strtoupper(hash_hmac('sha512', "ABC", $binkey)); ?> ``` And with `ABC` input its output is: ``` 100A6A016A4B21AE120851D51C93B293D95B7D8A44B16ACBEFC2D1C9DF02B6F54FA3C2D6802E52FED5DF8652DDD244788A204682D2D1CE861FDA4E67F2792643 ``` And I need to clone it in java. So here is my current java clone : ``` private String generateHMAC( String datas ) { // final Charset asciiCs = Charset.forName( "utf-8" ); Mac mac; String result = ""; try { byte[] bytesKey = PayboxConstants.KEY.getBytes( ); final SecretKeySpec secretKey = new SecretKeySpec( bytesKey, "HmacSHA512" ); mac = Mac.getInstance( "HmacSHA512" ); mac.init( secretKey ); final byte[] macData = mac.doFinal( datas.getBytes( ) ); byte[] hex = new Hex( ).encode( macData ); result = new String( hex, "ISO-8859-1" ); } catch ( final NoSuchAlgorithmException e ) { AppLogService.error( e ); } catch ( final InvalidKeyException e ) { AppLogService.error( e ); } catch ( UnsupportedEncodingException e ) { AppLogService.error( e ); } return result.toUpperCase( ); } ``` But it does not makes the job because for same input (ABC) its ouput is: ``` AA6492987D7A7AC81109E877315414806F1973CC47B897ECE713171A25A11B279329B1BFF39EA72A5EFB7EDCD71D1F34D5AAC49999A780BD13F019ED99685B80 ``` I've tries a lot of other java code but none of them was an exact clone of php version. What did I do wrong?