2010-06-02 4 views
5

Aidez-nous! J'ai tiré mes cheveux sur celui-ci. :)HMAC SHA1 ColdFusion

J'ai un site dont j'ai besoin pour l'authentification HMAC SHA1. Il fonctionne actuellement avec une autre langue mais maintenant je dois le déplacer vers ColdFusion. Pour la vie de moi, je ne peux pas faire correspondre les ficelles. Toute aide serait grandement appréciée.

données: https%3A%2F%2Fwww%2Etestwebsite%2Ecom%3Fid%3D5447
clé: 265D5C01D1B4C8FA28DC55C113B4D21005BB2B348859F674977B24E0F37C81B05FAE85FB75EA9CF53ABB9A174C59D98C7A61E2985026D2AA70AE4452A6E3F2F9

Réponse correcte: WJd%2BKxmFxGWdbw4xQJZXd3%2FHkFQ%3d
Ma réponse: knIVr6wIt6%2Fl7mBJPTTbwQoTIb8%3d

Les deux sont encodées base64 puis encodées.

+0

Meilleur pour poster votre code actuel, qui montrera la fonction (s) que vous utilisez pour cela. –

Répondre

9

Faire moi-même une chose HMAC-SHA1. Le mieux que je puisse dire est que j'ai trouvé cette vieille fonction. A travaillé très bien pour ce que je fais jusqu'à présent. J'ai oublié où je l'ai trouvé si je ne peux pas créditer l'auteur. Pour votre base 64 ... exécutez cette fonction sur votre cryptage, puis faites simplement un cfset newString = toBase64 (oldString) sur ce qui est retourné.

<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

exactement ce dont j'avais besoin. Merci. FYI: colfdusion 10 a une fonction de hmac() intégrée, n'est pas si gentil :) – jan

1

Steve - Merci pour votre réponse. J'utilisais déjà la fonction hmacEncrypt. J'ai bien compris mon problème. Je passais dans une clé HEX au lieu d'une chaîne. Il a accepté la clé parce que techniquement c'était une chaîne. Pour revenir à une chaîne j'ai utilisé une autre fonction avec celle ci-dessus. Celui ci-dessous change le HEX en une chaîne. Je n'ai pas écrit la fonction ci-dessous et je ne me souviens pas d'où cela venait pour créditer l'auteur, mais cela a bien fonctionné.

<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

(* Ceci a été publié comme réponse, mais a été supprimé par les mods *): "[Ronald-c] (http: // stackoverflow.com/users/475420/roland-c) dit: J'ai écrit Hex2Bin il y a quelques années pour quelqu'un sur la liste de diffusion CFC! Juste comme un FYI, comme CF7, vous pouvez maintenant faire ceci: 'BinaryDecode (inputString," hex " C'est beaucoup plus simple (et plus performant) depuis qu'ils ont ajouté la fonction intégrée. " – Leigh

4

Procédé de chiffrement plus courte (sur la base de Barney's method) qui délivre en sortie une chaîne:

<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> 

En outre

  1. ColdFusion 10 supporte HMAC-SHA1 pour le chiffrement et de hachage natif.
  2. Il existe une bibliothèque appelée CF_HMAC distributed by Adobe
  3. Il existe plusieurs bibliothèques qui traitent HMAC en relation lors de la signature de fichiers pour Amazon. Parmi ceux-ci sont cf-amazon-s3, Barney's S3 URL Builder et RIAForge S3
+0

Nice. Faites juste attention à 'String.getBytes()' car il utilise l'encodage par défaut (pas toujours ce que vous voulez). Je ferais charset un paramètre facultatif, par défaut de UTF-8. Ensuite, passez-le soit dans [charsetDecode] (http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f64.html) ou getBytes (charset) – Leigh

+0

FYI, car ce post revient toujours fréquemment, corrigé GetBytes() encodage gotcha – Leigh