Google允许您为reCAPTCHA创建“安全令牌”,这意味着您可以跨多个域使用相同的密钥/机密。无需为您照顾的每个域创建密钥/机密。
这是他们的文档,因为您可以看到除了an example in Java之外,它没有深入了解令牌的加密方式。我的问题是如何在ColdFusion中编写。我已经对它进行了4个小时的破解,但却无法让它发挥作用。我回顾过的其他例子:
任何ColdFusion加密大师都知道如何做到这一点?
更新
感谢Leigh,认为我们还在继续,但仍然看到“无效的st”。这就是我所拥有的:
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");
答案 0 :(得分:3)
注意: 发布此信息,因为我在问题结束前已经写完了。虽然将来请在问题中包含您尝试过的代码。它本来可以帮助澄清问题(并且可能避免它被关闭为“太宽泛”)
无法深入了解令牌的加密方式
如果您只停留在加密部分,它看起来像the java example的标准AES加密(ECB模式和PKCS5Padding)。唯一棘手的部分是处理加密密钥。
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加密,您可以使用encrypt()
函数轻松地在CF中重现。
要在CF中复制加密:
散列secretKey字符串
hashAsHex = hash(secretKey, "SHA", "UTF-8");
然后将哈希解码为二进制,这样就可以提取前十六(16)个字节。这为您提供了128位AES加密密钥(二进制形式):
hashAsBinary = binaryDecode(hashAsHex, "hex");
keyBytes = arraySlice(hashAsBinary, 1, 16);
现在只需将密钥字节转换为base64字符串,并将其传递给encrypt()函数:
keyAsBase64 = binaryEncode( javacast("byte[]", keyBytes), "base64");
token = encrypt(jsonToken, keyAsBase64 , "AES/ECB/PKCS5Padding", "base64");
就是这样。我会让你自己弄清楚剩下的。