coldfusion - 在 ColdFusion 中创建 Google reCAPTCHA 'secure token'

标签 coldfusion cfml lucee

Google 允许您为 reCAPTCHA 创建“安全 token ”,这意味着您可以在多个域中使用相同的 key / secret 。无需为您管理的每个域创建 key / secret 。

这是他们的文档,您可以看到,除了 an example in Java 之外,它对 token 的加密方式没有任何了解。 。我的问题是如何在 ColdFusion 中编写它。我已经尝试了 4 个小时,但就是无法让它发挥作用。我回顾过的其他示例:

任何 ColdFusion 加密大师都知道如何做到这一点吗?

更新

谢谢 Leigh,我认为我们已经取得了进展,但仍然看到“无效斯托肯”。这是我所拥有的:

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() 不可用。所以我们使用 arraySlice UDF来自 cflib.org。

我也看到了PHP实现上关于URL编码的评论,所以我最后也尝试了这个,没有效果:

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

最佳答案

注意:发布此内容是因为我在问题结束之前已经写了它。不过将来,请在问题中包含您尝试过的代码。这将有助于澄清问题(并可能避免它因“太宽泛”而被关闭)

no insight on how the token is encrypted

如果您只停留在加密部分,它看起来像 the java example 中的标准 AES 加密(ECB 模式和 PKCS5Padding) 。唯一棘手的部分是加密 key 的处理。

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

在java代码中,getKey()方法解码 key 字符串并使用SHA1对其进行哈希处理。 ,它产生 20 个字节(或 160 位)。因为那不是 valid AES key size ,代码获取前十六 (16) 个字节以用作 128 位 AES 加密 key 。其余的 java 代码只是基本的 AES 加密,您可以使用 encrypt() 在 CF 中轻松重现。功能。

要在 CF 中复制加密:

  1. 对 SecretKey 字符串进行哈希处理

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

  2. 然后将哈希值解码为二进制,这样您就可以提取前十六 (16) 个字节。这将为您提供 128 位 AES 加密 key (二进制形式):

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

  3. 现在只需将 key 字节转换为 Base64 字符串,然后将其传递到 encrypt() 函数即可:

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

就是这样。剩下的事情我会让你自己解决。

关于coldfusion - 在 ColdFusion 中创建 Google reCAPTCHA 'secure token',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33927812/

相关文章:

带有 Commandbox 的 Docker-Compose 无法更改 Web 根目录

cfml - 使用基于 CFC 的自定义标签将子标签数据与祖 parent 标签相关联

jsp - 使用CF标准无法运行JRun HTTP 500响应错误处理程序

coldfusion - 是否可以在coldfusion中的数据源设置文件中更改隔离级别?

json - 预期返回 JSON 的单元测试方法示例

hibernate - 是否可以在不使用 HBMXML 文件的情况下为 Hibernate 指定软删除过滤器?

model-view-controller - 选择 ColdFusion MVC 框架

mysql - 使用 MySQL 赋值运算符的 Coldfusion CFScript 查询

list - Lucee/CF-清理逗号分隔列表

mysql - 找不到 Coldfusion EntityLoad get 方法,但使用 EntityLoadByPK 时,get 方法可以工作