2016-09-06 32 views
8

java gizli anahtar ile:Compute HMAC-SHA512 i excatly bu site gibi gizli bir anahtar sağlar sahip bir HMAC üreten bir işlev inşa etmek isteyen

http://www.freeformatter.com/hmac-generator.html

java 8 lib sadece MessageDigest ve KeyGenerator sağlar hangi ikisi sadece SH256 destekler.

Ayrıca doesnt google bir HMAC oluşturmak için bir uygulamaya bana herhangi bir sonuç verir.

birisi bir uygulama biliyor mu?

Ben sıradan bir SH256 oluşturmak için bu kodu var ama bana çok yardımcı Bu doesnt tahmin:

public static String get_SHA_512_SecurePassword(String passwordToHash) throws Exception { 
    String generatedPassword = null; 

    MessageDigest md = MessageDigest.getInstance("SHA-512"); 
    byte[] bytes = md.digest(passwordToHash.getBytes("UTF-8")); 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < bytes.length; i++) { 
     sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1)); 
    } 
    generatedPassword = sb.toString(); 
    System.out.println(generatedPassword); 
    return generatedPassword; 
} 

cevap

10

Umut bu yardımcı olur:

import java.io.UnsupportedEncodingException; 
import java.security.InvalidKeyException; 
import java.security.NoSuchAlgorithmException; 
import javax.crypto.Mac; 
import javax.crypto.spec.SecretKeySpec; 

public class Test1 { 
public static void main(String[] args) { 
    Mac sha512_HMAC = null; 
    String result = null; 
    String key = "Welcome1"; 

    try{ 
     byte [] byteKey = key.getBytes("UTF-8"); 
     final String HMAC_SHA512 = "HmacSHA512"; 
     sha512_HMAC = Mac.getInstance(HMAC_SHA512);  
     SecretKeySpec keySpec = new SecretKeySpec(byteKey, HMAC_SHA512); 
     sha512_HMAC.init(keySpec); 
     byte [] mac_data = sha512_HMAC. 
     doFinal("My message".getBytes("UTF-8")); 
     //result = Base64.encode(mac_data); 
     result = bytesToHex(mac_data); 
     System.out.println(result); 
    } catch (UnsupportedEncodingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InvalidKeyException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }finally{ 
     System.out.println("Done"); 
    } 
} 

public static String bytesToHex(byte[] bytes) { 
    final char[] hexArray = "ABCDEF".toCharArray(); 
    char[] hexChars = new char[bytes.length * 2]; 
    for (int j = 0; j < bytes.length; j++) { 
     int v = bytes[j] & 0xFF; 
     hexChars[j * 2] = hexArray[v >>> 4]; 
     hexChars[j * 2 + 1] = hexArray[v & 0x0F]; 
    } 
    return new String(hexChars); 
} 
} 

bu stackoverflow başvurmak hex bayt diziden dönüştürme için cevap: here

+0

arkadaşı çok teşekkür ederim :) onun çalışma – PowerFlower

4

basit yolu olabilir -

private static final String HMAC_SHA512 = "HmacSHA512"; 

private static String toHexString(byte[] bytes) { 
    Formatter formatter = new Formatter(); 
    for (byte b : bytes) { 
     formatter.format("%02x", b); 
    } 
    return formatter.toString(); 
} 

public static String calculateHMAC(String data, String key) 
    throws SignatureException, NoSuchAlgorithmException, InvalidKeyException 
{ 
    SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), HMAC_SHA512); 
    Mac mac = Mac.getInstance(HMAC_SHA512); 
    mac.init(secretKeySpec); 
    return toHexString(mac.doFinal(data.getBytes())); 
} 

public static void main(String[] args) throws Exception { 
    String hmac = calculateHMAC("data", "key"); 
    System.out.println(hmac); 
} 

Mac algoritması herhangi birine HMAC_SHA512 değişkeni değiştirebilir ve kod aynı şekilde çalışacaktır.