2009-06-04 9 views
5

Stiamo provando a calcolare un digest HMAC-SHA256 in ColdFusion e stiamo utilizzando l'HMAC CFC, ma in un caso sta producendo un risultato diverso per il digest rispetto a quelli generati in lingue diverse - hanno provato gli stessi dati usando Ruby & PHP e ottenere il risultato previsto. Ho anche provato il tag personalizzato CF_HMAC su cui è basato e ottengo gli stessi risultati.Calcolare il digest HMAC-SHA256 in ColdFusion utilizzando Java

Capisco che da CF8 encrypt() supporta HMAC-SHA256, ma è disponibile solo in Enterprise (che non abbiamo) e non è nemmeno disponibile nella versione sviluppatore per me da testare.

Quindi la mia domanda è posso farlo accedendo a Java da CF?

risposta

11

Questo è quello che ho finito per fare:

secret = createObject('java', 'javax.crypto.spec.SecretKeySpec').Init(my_key.GetBytes(), 'HmacSHA256'); 
mac = createObject('java', "javax.crypto.Mac"); 
mac = mac.getInstance("HmacSHA256"); 
mac.init(secret); 
digest = mac.doFinal(my_data.GetBytes()); 

Questo vi dà l'array di byte, che è quindi possibile convertire in una stringa.

+1

ultima riga dovrebbe essere 'Digest = mac.doFinal (my_data.GetBytes()); ' – WeeJames

+1

Fornisce sempre una codifica (come" UTF-8 ") quando si utilizza' getBytes() '. Altrimenti utilizza l'impostazione predefinita di jvm, che potrebbe produrre risultati imprevisti. O meglio ancora, usa la funzione CF [charsetDecode] (http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f64.html) per generare l'array di byte. – Leigh

0

Ecco un esempio della risposta di DEfusion con diversi formati di input/output. La mia chiave è esadecimale, miei dati è inferiore ascii (in modo UTF-8 farà), e ho bisogno di uscita Base64, così mi passano gli argomenti formato appropriato per BinaryDecode e CharsetDecode:

<cfset keybytes = BinaryDecode(SECRET_KEY, "Hex")> 
<cfset databytes = CharsetDecode(data, "UTF-8")> 
<cfset secret = createObject("java", "javax.crypto.spec.SecretKeySpec").Init(keybytes,"HmacSHA256")> 
<cfset mac = createObject("java", "javax.crypto.Mac")> 
<cfset mac = mac.getInstance("HmacSHA256")> 
<cfset mac.init(secret)> 
<cfset digest = mac.doFinal(databytes)> 
<cfset result = BinaryEncode(digest, "Base64")> 
+0

... e la mia chiave sembra esadecimale, ma in realtà è ascii ... – krubo