ColdFusion Зашифровать URL-адрес: расшифровать обратный URL-адрес

Я ищу, чтобы зашифровать электронное письмо с проверкой.

Итак, пользователь регистрируется: и он отправляет на [email protected]

Я хочу зашифровать обратную ссылку. Мы скажем, что он создает этот HKDLEK6798JKJK.

Итак, он отправляет БОБу электронное письмо: кликабельная ссылка http://website.com?urlem=HKDLEK6798JKJK.

Когда он нажимает ссылку возврата. Я хочу расшифровать его обратно на [email protected]

      <cfset key = generateSecretKey("AES") />

      <!--- Set the ciphertext to a variable. This is the string you will store for later deciphering --->
      <cfset cipherText = encrypt(em, key, "AES/CBC/PKCS5Padding", "HEX") />

      <cfoutput>#cipherText#</cfoutput> 

Это создает HKDLEK6798JKJK (я знаю, что это больше)

Когда ссылка возвращается, я пытаюсь: (с возвратом URL или настройкой я получаю то же самое)

      <cfset urlem = "HKDLEK6798JKJK">

      <cfoutput>#urlem#</cfoutput>
      <br><br>

      <cfset urld = decrypt(urlem, key, "AES/CBC/PKCS5Padding", "HEX") />

      <cfoutput>[#urld#]</cfoutput>

URLD либо пуст, либо я получаю сообщение об ошибке: Ошибка: Произошла ошибка при попытке зашифровать или расшифровать входную строку: данный последний блок не заполнен должным образом.


person Merle_the_Pearl    schedule 10.03.2021    source источник
comment
Используете ли вы для расшифровки тот же ключ, что и для шифрования, и передаете ли вы decrypt то, что encrypt вернуло?   -  person user 9014097    schedule 11.03.2021


Ответы (1)


AES — это алгоритм с симметричным ключом, поэтому вы создаете ключ только один раз, а затем сохраняете его как секрет в своей конфигурации (например, в области APPLICATION). Если ключ изменится, вы больше не сможете расшифровать ранее зашифрованные данные.

Шаг 1

Создайте ключ AES, используя <cfoutput>#generateSecretKey("AES")#</cfoutput>. Нет необходимости иметь эту строку где-либо в вашей кодовой базе, поскольку вы, вероятно, никогда не измените этот ключ (по крайней мере, не для этого веб-приложения).

Сгенерированный ключ представляет собой случайную комбинацию из 16 байт (128 бит), закодированную в виде строки Base64. ColdFusion обычно никогда не ожидает массив байтов, поэтому вы можете работать с закодированными значениями для encrypt и decrypt. Это может выглядеть примерно так: k1+pzMg/rqmbVGfI5MOf8Q== Обратите внимание на + и /? Они являются частью Base64, и вам не о чем беспокоиться, но я всегда рекомендую вам сворачиваться до тех пор, пока вы не получите красивую строку для копирования и вставки, например: YncQUYZYdPez360xNmq2tw==

Шаг 2

Сохраните сгенерированный ключ как значение в кодировке Base64 в конфигурации вашего веб-приложения. Если у вас есть Application.cfc, вы можете записать его в функцию onApplicationStart. Или, если у вас все еще есть Application.cfm, запишите его прямо туда:

<cfset APPLICATION.AesKeyForMails = "YncQUYZYdPez360xNmq2tw==">

Конечно, вы также можете просто <cfinclude> конфигурационный файл с переменной (не используйте тогда APPLICATION). Все, что работает лучше всего для вас.

Шаг 3

Зашифруйте электронное письмо с помощью сохраненного ключа:

<cfset encryptedMail = encrypt("[email protected]", APPLICATION.AesKeyForMails, "AES/CBC/PKCS5Padding", "HEX")>

Это вернет зашифрованные данные (массив байтов) и представит их в виде строки в кодировке HEX, например: A0E2D61277EE1966CDD571B25A8B088E81AF7953B52BBE086C5079A8565D3D718DC572474A0C7DEF5BFC2F8F90CC464B

Обратите внимание, что это значение будет меняться при каждом вызове из-за цепочки блоков (режим CBC). Но не волнуйтесь, все они могут быть расшифрованы одинаково. (Если вы укажете только AES для параметра алгоритма, он использует режим ECB, всегда возвращая один и тот же результат, который считается менее безопасным.)

Шаг 4

Расшифруйте зашифрованное электронное письмо с помощью сохраненного ключа:

<cfset decryptedMail = decrypt("A0E2D61277EE1966CDD571B25A8B088E81AF7953B52BBE086C5079A8565D3D718DC572474A0C7DEF5BFC2F8F90CC464B", APPLICATION.AesKeyForMails, "AES/CBC/PKCS5Padding", "HEX")>

И вот: [email protected]

person Alex    schedule 10.03.2021