2010-06-02 14 views
5

कृपया मदद करें! मैं इस पर अपने बालों को खींच रहा हूं। :)एचएमएसी SHA1 कोल्डफ्यूजन

मेरे पास एक साइट है जिसे मुझे प्रमाणीकरण के लिए एचएमएसी SHA1 की आवश्यकता है। यह वर्तमान में एक और भाषा के साथ काम करता है लेकिन अब मुझे इसे कोल्डफ्यूजन में स्थानांतरित करने की आवश्यकता है। मेरे जीवन के लिए मैं तारों को मिलान नहीं कर सकता। कोई भी सहायता की बहुत सराहना की जाएगी।

डाटा: https%3A%2F%2Fwww%2Etestwebsite%2Ecom%3Fid%3D5447
कुंजी: 265D5C01D1B4C8FA28DC55C113B4D21005BB2B348859F674977B24E0F37C81B05FAE85FB75EA9CF53ABB9A174C59D98C7A61E2985026D2AA70AE4452A6E3F2F9

सही जवाब: WJd%2BKxmFxGWdbw4xQJZXd3%2FHkFQ%3d
मेरा जवाब: knIVr6wIt6%2Fl7mBJPTTbwQoTIb8%3d

दोनों Base64 इनकोड और फिर यूआरएल इनकोडिंग।

+0

बेस्ट हैं, जो समारोह (रों) आप इस के लिए उपयोग कर रहे हैं दिखा देंगे। –

उत्तर

9

स्वयं एक एचएमएसी-एसएचए 1 चीज करना। सबसे अच्छा मैं कह सकता हूं कि मुझे यह पुराना काम मिला। मैं अब तक जो कर रहा हूं उसके लिए बहुत अच्छा काम किया है। भूल गए जहां मैंने इसे पाया, हालांकि मैं लेखक को क्रेडिट नहीं कर सकता।

अपने बेस 64 सामान के लिए ... इस फ़ंक्शन को अपने एन्क्रिप्शन पर चलाएं, फिर केवल एक सीएफसेट newString = toBase64 (oldString) को वापस लौटाएं।

<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

बिल्कुल मुझे क्या चाहिए। धन्यवाद। एफवाईआई: colfdusion 10 में एक एचएमएसी() फ़ंक्शन बनाया गया है, यह अच्छा नहीं है :) – jan

1

स्टीव - आपकी प्रतिक्रिया के लिए धन्यवाद। मैं वास्तव में पहले से ही hmacEncrypt फ़ंक्शन का उपयोग कर रहा था। हालांकि मैंने अपनी समस्या का पता लगाया। मैं एक स्ट्रिंग के बजाय एक हेक्स कुंजी में गुजर रहा था। यह कुंजी स्वीकार कर लिया क्योंकि तकनीकी रूप से यह एक स्ट्रिंग था। इसे एक स्ट्रिंग पर वापस लाने के लिए मैंने ऊपर दिए गए एक के साथ एक और फ़ंक्शन का उपयोग किया। नीचे दिया गया एक हेक्स को स्ट्रिंग में बदल देता है। मैंने नीचे दिए गए फ़ंक्शन को नहीं लिखा और न ही मुझे याद है कि लेखक क्रेडिट प्राप्त करने के लिए यह कहां से आया था, लेकिन यह बहुत अच्छा काम करता था।

<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

(* इसे मूल रूप से उत्तर के रूप में पोस्ट किया गया था, लेकिन मोड द्वारा हटा दिया गया था *): "[रोनाल्ड-सी] (http: // stackoverflow.com/users/475420/roland-c) ने कहा: मैंने सीएफसी मेलिंग सूची में किसी के लिए हेक्स 2 बीन साल पहले लिखा था! सीएफ 7 के रूप में, एक एफवाईआई के रूप में, अब आप यह कर सकते हैं: 'बाइनरीडेकोड (इनपुटस्ट्रिंग, "हेक्स") '। यह बहुत आसान (और अधिक प्रदर्शनकारी) है क्योंकि उन्होंने अंतर्निहित फ़ंक्शन जोड़ा है। " – Leigh

4

एक छोटा एन्क्रिप्शन विधि (Barney's method के आधार पर) है कि एक स्ट्रिंग आउटपुट:

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

अलावा

  1. ColdFusion 10 में कूटबद्ध करने और देशी रूप Hashing के लिए HMAC-SHA1 समर्थन करता है।
  2. एक पुस्तकालय कहा जाता है CF_HMAC distributed by Adobe
  3. कई पुस्तकालयों कि संबंध में HMAC से निपटने के अमेज़न के लिए फ़ाइलों को प्रवेश करते समय कर रहे हैं। अपने वर्तमान कोड पोस्ट करने के लिए उनमें से cf-amazon-s3, Barney's S3 URL Builder, और RIAForge S3
+0

अच्छा। बस 'String.getBytes()' से सावधान रहें क्योंकि यह डिफ़ॉल्ट एन्कोडिंग का उपयोग करता है (हमेशा जो भी आप चाहते हैं)। मैं अक्षरसेट को वैकल्पिक पैरामीटर, यूटीएफ -8 का डिफ़ॉल्ट बना दूंगा। फिर इसे [charsetDecode] (http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f64.html) में पास करें या प्राप्त करें बाइट्स (वर्णसेट) – Leigh

+0

FYI, क्योंकि यह पोस्ट अभी भी अक्सर आता है, निश्चित GetBytes() एन्कोडिंग गॉचा – Leigh

संबंधित मुद्दे