2015-11-25 20 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,非常感谢。 –