2015-11-25 53 views
2

創建一個谷歌的reCAPTCHA「安全令牌」谷歌允許你創建一個「安全令牌」的驗證碼,這意味着你可以使用跨多個域相同的密鑰/祕密。無需爲您關注的每個域創建關鍵/祕密。ColdFusion的

這裏是他們的文檔,你可以看到它有令牌是如何比an example in Java加密等沒有洞察。我的問題是如何寫在ColdFusion中。我已經對它進行了4個小時的破解,但卻無法實現。其他的例子我查看:

任意ColdFusion加密大師的那裏知道如何做到這一點?

UPDATE

感謝利,認爲我們一起,但仍然看到 '無效stoken' 進一步是。下面是我有:

json_token = '{"session_id":"#createUUID()#","ts_ms":#dateDiff("s", dateConvert("utc2Local", "January 1 1970 00:00"), now())#}'; 
secret_key_hash = hash(secret_key,"SHA", "UTF-8"); 
secret_key_binary = binaryDecode(secret_key_hash, "hex"); 
secret_key_aes = arraySlice(secret_key_binary,1,16); 
secret_key_base64 = binaryEncode(javacast("byte[]", secret_key_aes), "base64"); 
secure_token = Encrypt(json_token,secret_key_base64,"AES/ECB/PKCS5Padding",'base64'); 

我們使用基於Java 1.7的ColdFusion 9,arraySlice方法不可用或底層Java .subList()。所以我們使用cflib.org的arraySlice UDF

我也看到了關於URL的PHP​​實現編碼的意見,所以我也試過這個結尾,沒有影響:

secure_token = Replace(secure_token,"=","","ALL"); 
    secure_token = Replace(secure_token,"+","-","ALL"); 
    secure_token = Replace(secure_token,"/","_","ALL"); 
+1

雖然這是一個有趣的問題,但考慮到範圍 - 它很可能被封閉爲「太寬泛」。你能告訴我們你試過的是什麼,特別是哪一部分難以翻譯或遇到問題? – Leigh

+1

重新閱讀你的問題後,你只是問如何加密?因爲這是一個更窄的問題。簡而言之,它只是標準的AES加密密鑰的輕微操縱。請參閱[我的回覆](http://stackoverflow.com/a/33931276/104223)。儘管將來,請包括您在問題中嘗試過的代碼。這將有助於澄清這個問題(並且可能避免它被封爲「太寬泛」)。 – Leigh

回答

3

注:發佈此,因爲我已經在問題結束前寫下來。儘管將來,請包括您在問題中嘗試過的代碼。這將有助於澄清問題(可能避免它被關閉,因爲「過於寬泛」

的令牌的加密方式

如果只停留在加密部分沒有洞察,它看起來像標準AES加密(ECB模式和PKCS5Padding)從the java example。唯一棘手的部分是處理加密密鑰。

byte[] key = siteSecret.getBytes("UTF-8"); 
key = Arrays.copyOf(MessageDigest.getInstance("SHA").digest(key), 16); 

在Java代碼,該方法getKey()鍵串進行解碼,並使用SHA1,其產生20個字節(或160位)散列它。由於這不是一個valid AES key size,代碼抓住第一十六(16)個字節作爲一個128位的AES加密密鑰來使用。 java代碼的其餘部分只是基本的AES加密,您可以在CF使用encrypt()功能很容易繁殖。

要複製在CF加密:

  1. 散列的祕密密鑰串

    hashAsHex = hash(secretKey, "SHA", "UTF-8");

  2. 然後解碼散成二進制,所以可以提取第一個十六(16)個字節。這就給了你128位AES加密密鑰(以二進制形式):

    hashAsBinary = binaryDecode(hashAsHex, "hex"); keyBytes = arraySlice(hashAsBinary, 1, 16);

  3. 現在只需將密鑰字節轉換爲Base64字符串,並將其傳遞到加密()函數:

    keyAsBase64 = binaryEncode(javacast("byte[]", keyBytes), "base64"); token = encrypt(jsonToken, keyAsBase64 , "AES/ECB/PKCS5Padding", "base64");

就是這樣。我會讓你自己找出其餘的。

+0

謝謝Leigh,我們快到了,但仍然看到'無效的stoken'。我已經修正了頂部的問題 –

+0

OMG :)你說得對。更改爲'#dateConvert(「local2utc」,now())。getTime()#'現在可用!但之後還需要進行字符轉換'secure_token = Replace(secure_token,「=」,「」,「ALL」); secure_token =替換(secure_token,「+」,「 - 」,「ALL」); secure_token =替換(secure_token,「/」,「_」,「ALL」);' –

+2

感謝您的全力幫助Leigh,非常感謝。 –