Crear un ''token seguro'' de Google reCAPTCHA en ColdFusion
cfml lucee (1)
Google le permite crear un ''token seguro'' para reCAPTCHA, lo que significa que puede usar la misma clave / secreto en varios dominios. No es necesario crear claves / secretos para cada dominio que cuida.
Aquí están sus documentos, como se puede ver, no tiene ninguna idea de cómo se codifica el token, a excepción de un ejemplo en Java . Mi pregunta es cómo se escribiría esto en ColdFusion. Lo he intentado durante 4 horas, pero no puedo hacer que funcione. Otros ejemplos que he revisado:
- Un ejemplo en PHP :
- Un ejemplo en .NET
¿Algún gurú de encriptación de ColdFusion sabe cómo hacer esto?
ACTUALIZAR
Gracias, Leigh, creo que estamos más adelante, pero seguimos viendo ''inválido stoken''. Esto es lo que tengo:
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'');
Estamos utilizando ColdFusion 9 en Java 1.7, el método arraySlice no está disponible o el subyacente java .subList (). Así que estamos usando la UDF arraySlice de cflib.org.
También he visto comentarios sobre la implementación de PHP sobre codificación URL, así que también he intentado esto al final, sin efecto:
secure_token = Replace(secure_token,"=","","ALL");
secure_token = Replace(secure_token,"+","-","ALL");
secure_token = Replace(secure_token,"/","_","ALL");
NB: Publicar esto porque ya lo había escrito antes de que se cerrara la pregunta. Aunque en el futuro, incluya el código que ha intentado en la pregunta. Habría ayudado a aclarar el problema (y probablemente haya evitado que se haya cerrado como "demasiado amplio")
no hay información sobre cómo se codifica el token
Si solo está atascado en la parte de cifrado, se parece al cifrado AES estándar (modo ECB y PKCS5Padding) del ejemplo de Java . La única parte difícil es el manejo de la clave de cifrado.
byte[] key = siteSecret.getBytes("UTF-8"); key = Arrays.copyOf(MessageDigest.getInstance("SHA").digest(key), 16);
En el código java, el método getKey()
decodifica la cadena clave y la mezcla mediante SHA1 , que produce 20 bytes (o 160 bits). Como ese no es un tamaño de clave AES válido , el código toma los primeros dieciséis (16) bytes para usar como clave de cifrado AES de 128 bits. El resto del código de Java es solo cifrado AES básico, que puede reproducir fácilmente en CF utilizando la función encrypt()
.
Para replicar el cifrado en CF:
Hash the secretKey string
hashAsHex = hash(secretKey, "SHA", "UTF-8");
Luego decodifique el hash en binario, para que pueda extraer los primeros dieciséis (16) bytes. Eso le da la clave de cifrado AES de 128 bits (en forma binaria):
hashAsBinary = binaryDecode(hashAsHex, "hex"); keyBytes = arraySlice(hashAsBinary, 1, 16);
Ahora simplemente convierta los bytes clave en una cadena base64 y páselos a la función encrypt ():
keyAsBase64 = binaryEncode( javacast("byte[]", keyBytes), "base64"); token = encrypt(jsonToken, keyAsBase64 , "AES/ECB/PKCS5Padding", "base64");
Eso es. Te dejaré para que descubras el resto por tu cuenta.