2009-06-04 12 views
5

Estamos tratando de calcular un resumen HMAC-SHA256 en ColdFusion y estamos usando el CFC HMAC, pero en un caso está produciendo un resultado diferente para el resumen en comparación con los generados en diferentes idiomas - han intentado los mismos datos usando Ruby & PHP y obtienen el resultado esperado. También probé la etiqueta personalizada CF_HMAC en la que se basa y obtuve los mismos resultados.Calcula el resumen HMAC-SHA256 en ColdFusion usando Java

Entiendo que de CF8 encrypt() es compatible con HMAC-SHA256, pero solo está disponible en Enterprise (que no tenemos) y ni siquiera está disponible en la versión de desarrollador para que lo pruebe.

Así que mi pregunta es ¿puedo hacer esto accediendo a Java desde CF?

Respuesta

11

Esto es lo que terminé haciendo:

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()); 

Esto le da la matriz de bytes, que luego se puede convertir en una cadena.

+1

última línea debe ser 'digest = mac.doFinal (my_data.GetBytes()); ' – WeeJames

+1

Proporcione siempre una codificación (como" UTF-8 ") cuando use' getBytes() '. De lo contrario, usa el valor predeterminado de jvm, que puede producir resultados inesperados. O mejor aún, use la función CF [charsetDecode] (http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f64.html) para generar la matriz de bytes. – Leigh

0

Aquí hay un ejemplo de la respuesta de DEfusion con diferentes formatos de entrada/salida. Mi clave es hexagonal, mis datos es menor ASCII (de modo UTF-8 lo harán), y necesito salida de base 64, por lo que pasan los argumentos formato adecuado a BinaryDecode y 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

... y resulta que mi llave se ve como hexadecimal, pero en realidad es ascii ... – krubo

Cuestiones relacionadas