2015-11-25 3 views
2

Google позволяет вам создать «защищенный токен» для reCAPTCHA, что означает, что вы можете использовать один и тот же ключ/секрет для нескольких доменов. Не нужно создавать ключ/секреты для каждого домена, за которым вы смотрите.Создание защищенного маркера Google reCAPTCHA в ColdFusion

Вот их документы, поскольку вы можете видеть, что у него нет понимания того, как токен зашифрован, кроме an example in Java. Мой вопрос в том, как это будет написано в ColdFusion. У меня была трещина в течение 4 часов, но я просто не могу заставить ее работать. Другие примеры я рассмотрел:

любой ColdFusion шифровального гуру там знают, как это сделать?

UPDATE

Благодаря Leigh, думаю, мы дальше, но по-прежнему видим 'недействительных 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'); 

Мы используем ColdFusion 9 на Java 1.7, метод 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"); 
+1

Хотя это интересный вопрос, учитывая сферу действия - он, скорее всего, будет закрыт как «слишком широкий». Можете ли вы показать нам, что вы пробовали, и конкретно, с какой частью у вас возникли трудности с переводом или с проблемами? – Leigh

+1

Перечитав свой вопрос, вы просто спрашиваете, как это делается? Потому что это гораздо более узкий вопрос. Короче говоря, это просто стандартная AES с небольшой манипуляцией с ключом шифрования. См. [Мой ответ] (http://stackoverflow.com/a/33931276/104223). Хотя в будущем, пожалуйста, укажите код, который вы пробовали в вопросе. Это помогло бы прояснить проблему (и, вероятно, избегать ее закрытия как «слишком широкого»). – Leigh

ответ

3

NB: Проводка этого, так как я уже написал его до того, как вопрос был закрыт. Хотя в будущем, пожалуйста, укажите код, который вы пробовали в вопросе. Это помогло бы прояснить этот вопрос (и, возможно, избежать его закрытия, как «слишком широким»)

не понимание того, как маркер шифруется

Если вы только застряли на шифрование части , он выглядит как стандартное шифрование 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. хэша SecretKey строка

    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

Спасибо, Ли, мы почти там, но все еще видим «недопустимый сток». Я исправил вопрос наверху –

+0

OMG :) Вы правы. Изменено на '#dateConvert (" local2utc ", now()). Теперь работает getTime() #'! Но также потребовалось преобразование символа после этого 'secure_token = Replace (secure_token," = "," "," ALL "); secure_token = Заменить (secure_token, "+", "-", "ALL"); secure_token = Заменить (secure_token, "/", "_", "ALL"); ' –

+2

Спасибо за вашу помощь. Ли, оценил. –

 Смежные вопросы

  • Нет связанных вопросов^_^