2010-06-02 18 views
5

Por favor ayuda! He estado sacando mi pelo sobre este. :)HMAC SHA1 ColdFusion

Tengo un sitio que necesito para HMAC SHA1 para la autenticación. Actualmente funciona con otro idioma, pero ahora necesito moverlo a ColdFusion. Por mi vida no puedo hacer que las cuerdas coincidan. Cualquier ayuda sería muy apreciada.

datos: https%3A%2F%2Fwww%2Etestwebsite%2Ecom%3Fid%3D5447
Clave: 265D5C01D1B4C8FA28DC55C113B4D21005BB2B348859F674977B24E0F37C81B05FAE85FB75EA9CF53ABB9A174C59D98C7A61E2985026D2AA70AE4452A6E3F2F9

Respuesta correcta: WJd%2BKxmFxGWdbw4xQJZXd3%2FHkFQ%3d
Mi respuesta: knIVr6wIt6%2Fl7mBJPTTbwQoTIb8%3d

Ambos están codificados en Base64 y luego URL codificada.

+0

mejor para publicar su código actual, que se mostrará la función (s) que está utilizando para esto. –

Respuesta

9

Haciendo una cosa de HMAC-SHA1 yo mismo. Lo mejor que puedo decir es que encontré esta antigua función. Funcionó muy bien para lo que estoy haciendo hasta ahora. Olvidé dónde lo encontré, así que no puedo dar crédito al autor.

Para su base 64 cosas ... ejecute esta función en su encriptación, luego simplemente haga un cfset newString = toBase64 (oldString) en lo que se devuelve.

<cffunction name="hmacEncrypt" returntype="binary" access="public" output="false"> 
    <cfargument name="signKey" type="string" required="true" /> 
    <cfargument name="signMessage" type="string" required="true" /> 
    <cfargument name="algorithm" type="string" default="HmacSHA1" /> 
    <cfargument name="charset" type="string" default="UTF-8" /> 

    <cfset var msgBytes = charsetDecode(arguments.signMessage, arguments.charset) /> 
    <cfset var keyBytes = charsetDecode(arguments.signKey, arguments.charset) /> 
    <cfset var keySpec = createObject("java","javax.crypto.spec.SecretKeySpec") /> 
    <cfset var mac = createObject("java","javax.crypto.Mac") /> 

    <cfset key = keySpec.init(keyBytes, arguments.algorithm) /> 
    <cfset mac = mac.getInstance(arguments.algorithm) /> 
    <cfset mac.init(key) /> 
    <cfset mac.update(msgBytes) /> 

    <cfreturn mac.doFinal() /> 
</cffunction> 
+1

exactamente lo que necesitaba. Gracias. FYI: colfdusion 10 tiene una función hmac() incorporada, no es tan agradable :) – jan

1

Steve - Gracias por su respuesta. De hecho, ya estaba usando la función hmacEncrypt. Sin embargo, descubrí mi problema. Estaba pasando una clave HEX en lugar de una cadena. Aceptó la clave porque técnicamente era una cadena. Para volver a una cadena utilicé otra función junto con la de arriba. El de abajo cambia el HEX en una cadena. No escribí la función a continuación ni recuerdo de dónde vino para obtener el crédito del autor, pero funcionó muy bien.

<cffunction name="Hex2Bin" returntype="any" hint="Converts a Hex string to binary"> 
    <cfargument name="inputString" type="string" required="true" hint="The hexadecimal string to be written."> 
    <cfset var outStream = CreateObject("java", "java.io.ByteArrayOutputStream").init()> 
    <cfset var inputLength = Len(arguments.inputString)> 
    <cfset var outputString = ""> 
    <cfset var i = 0> 
    <cfset var ch = ""> 
    <cfif inputLength mod 2 neq 0> 
    <cfset arguments.inputString = "0" & inputString> 
    </cfif> 
    <cfloop from="1" to="#inputLength#" index="i" step="2"> 
     <cfset ch = Mid(inputString, i, 2)> 
     <cfset outStream.write(javacast("int", InputBaseN(ch, 16)))> 
    </cfloop> 
    <cfset outStream.flush()> 
    <cfset outStream.close()> 
    <cfreturn outStream.toByteArray()> 
</cffunction> 
+1

(* Esto fue publicado originalmente como respuesta, pero fue eliminado por los mods *): "[Ronald-c] (http: // stackoverflow.com/users/475420/roland-c) dijo: ¡He escrito Hex2Bin hace años para alguien de la lista de correo de CFC! Solo como un FYI, a partir de CF7, ahora puede hacer esto: 'BinaryDecode (inputString," hex ") '.Es mucho más simple (y más eficiente) ya que agregaron la función incorporada." – Leigh

4

Un método más corto cifrado (basado en Barney's method) que da salida a una cadena:

<cffunction name="CFHMAC" output="false" returntype="string"> 
    <cfargument name="signMsg" type="string" required="true" /> 
    <cfargument name="signKey" type="string" required="true" /> 
    <cfargument name="encoding" type="string" default="utf-8" /> 
    <cfset var key = createObject("java", "javax.crypto.spec.SecretKeySpec").init(signKey.getBytes(arguments.encoding), "HmacSHA1") /> 
    <cfset var mac = createObject("java", "javax.crypto.Mac").getInstance("HmacSHA1") /> 
    <cfset mac.init(key) /> 
    <cfreturn toBase64(mac.doFinal(signMsg.getBytes(arguments.encoding))) /> 
</cffunction> 

Además

  1. ColdFusion 10 soporta HMAC-SHA1 para cifrar y Hashing nativa.
  2. Hay una biblioteca llamada CF_HMAC distributed by Adobe
  3. Hay varias bibliotecas que tratan con HMAC en relación al firmar archivos para Amazon. Entre ellos se encuentran cf-amazon-s3, Barney's S3 URL Builder y RIAForge S3
+0

Agradable. Solo tenga cuidado con 'String.getBytes()' ya que usa la codificación predeterminada (no siempre lo que quiere). Haría de Charset un parámetro opcional, por defecto de UTF-8. A continuación, pásalo a [charsetDecode] (http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f64.html) o getBytes (charset) – Leigh

+0

FYI, ya que esta publicación sigue apareciendo con frecuencia, se corrigió getBytes() que codifica gotcha – Leigh