2014-09-16 2 views
0

У меня возникли проблемы с использованием функции шифрования и дешифрования cf9. В частности, код я использую потребности, чтобы иметь возможность шифрования с AES/ECB/PKCS5Padding 256. Я пытаюсь опубликовать данные в банк третьего лица со следующим кодом:Coldfusion Encrypt and Decrypt

<cfparam name="theKey" default="someStaticKey"> 
<cfset strName = leaddetail.leadlast&','&leaddetail.leadfirst /> 
    <cfset stFields = {requesttype = "eftaddonetimecompletetransaction" 
      ,clientid = "XXXXXX" 
      ,urltoredirect = "#RedirectURl#" 
      ,customerid = "#leaddetail.leadid#" 
      ,isdebitcardonly = "No" 
      ,customername = "#strName#" 
      ,customeraddress1 = "#form.billingaddress#" 
      ,customercity = "#form.billingcity#" 
      ,customerstate = "#form.billingstate#" 
      ,customerzip = "#form.billingzip#" 
      ,cardbillingaddr1 = "#form.billingaddress#" 
      ,cardbillingcity = "#form.billingcity#" 
      ,cardbillingstate = "#form.billingstate#" 
      ,cardbillingzip = "#form.billingzip#" 
      ,accounttype = "CC" 
      ,name_on_card = "#form.leadname#" 
      ,accountnumber = "#form.ccacctnum#" 
      ,expmonth = "#Left(form.ccexpdate,2)#" 
      ,expyear = "#Right(form.ccexpdate,2)#" 
      ,cvvcode = "#form.ccv2#" 
      ,amount = "#NumberFormat(esigninfo.esignpayamt,'9999.99')#" 
      ,startdate = "#DateFormat(Now(),'YYYY-MM-DD')#" 
      ,transactiontypecode = "WEB"}/> 
      <cfset theEncryptedStr = ToBase64(encrypt(serializeJson(stFields),theKey))> 
        <!--- shake hands and login to api ---> 
    <cfhttp url="https://www.somebank.com/cgi-bin/wsnvptest.vps" method="post" charset="ISO-8859-1" throwonerror="yes" result="httpResponse"> 
       <!--- login Variables ---> 
     <cfhttpparam type="Header" name="User-Agent" value="Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41"> 
     <cfhttpparam type="header" name="Content-Type" value="application/x-www-form-urlencoded" > 
     <cfhttpparam type="header" name="Accept" value="application/json" > 
       <!--- Login Credentials ---> 
     <cfhttpparam type="formfield"name="nvpvar"value="''"/> 
     <cfhttpparam type="formfield"name="requesttype"value="login"/> 
     <cfhttpparam type="formfield"name="userid"value="Dauserid"/> 
     <cfhttpparam type="formfield"name="password"value="password"/> 
     <cfhttpparam type="formfield"name="requestid"value="#uniquerequestid#"/> 
     <cfhttpparam type="formfield"name="PostData" value="#theEncryptedStr#"/> 
     <cfif isDefined('CheckSession.sessionID') AND CheckSession.sessionID NEQ ''> 
      <cfhttpparam type="formfield"name="sessionid" value="#checkSession.sessionID#"/> 
     </cfif> 
    </cfhttp> 

по какой-то причине я могу зашифровать, но не могу расшифровать ответ. Есть ли кто-нибудь, у кого больше опыта с этим, что может пойти на путь к успеху?


(Обновление от отвергнутого редактирования)

Я использую следующий скрипт для расшифровки моей строки ответа cfhttp:

<cfset content = httpResponse.filecontent> 
<cfset authdata = structNew()> 
<cfloop index="line" list="#content#"> 
    <cfset dtype = listFirst(line, "=")/> 
    <cfset EncodedString = listRest(line, "=")/> 
    <cfset authdata[dtype] = EncodedString /> 
</cfloop> 

<cfscript> 
    keyInBase64 = "Some64baseKey; 
    // Now decrypt the base64 encoded encryption string 
    decryptedValue = decrypt(EncodedString , keyInBase64 , "AES/ECB/PKCS5Padding" , "base64"); 
    WriteDump(variables); 
</cfscript> 

Строка Я пытаюсь расшифровать похожа на следующие:

nvpvar = fKsJGJ-Fe-2zoqUROAeE8N8a87USuQpE7dVd5IvRa6 7cHsVkPwx9taKLuXKwsCKFC_-NW3j6IOQAvCnRNc4cRNfq2fqyRHBUrFbFDCCmwpk =

+1

Режим ECB может быть небезопасным. Я предполагаю, что алгоритм не ваш выбор? – ntoskrnl

+1

Да, [Режим ECB менее безопасен, чем CBC] (https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation). Возможно, вы спросите об использовании CBC. – Leigh

ответ

6

encrypt(serializeJson(stFields),theKey)

Во-первых, это НЕ AES шифрования. Вы опустили параметр algorithm, поэтому encrypt() по умолчанию использует устаревший алгоритм CFMX_COMPAT (самый слабый). CFMX_COMPAT это вовсе не «настоящий» алгоритм шифрования, поэтому не используйте его ни для чего!

Во-вторых, с AES вы являетесь limited to 128 bit keys out of the box. Чтобы использовать 256-битные ключи, вы должны сначала установить (JCE) Unlimited Strength Jurisdiction Policy Files.

Скопируйте их в ваш каталог /lib/security/. Затем перезапустите сервер CF, чтобы применить изменения.

Примечание: Если у вас установлено несколько JVM, обязательно уточните правильный. т.е. тот, который указан в CF-администраторе).

После перезапуска вы сможете зашифровать с помощью 256-битного ключа. С ECB режиме, синтаксис: encrypt(string, key, algorithm, encoding)

  • string - обычный текст для шифрования
  • key - 256 битный ключ, должен быть в кодировке base64
  • algorithm - одна строка, представляющая желаемое: алгоритм, режим и прокладка.Примечание: «AES» на самом деле является сокращение для более «AES/ЕЦБ/PKCS5Padding»
  • encoding - «Двоичная кодировка, в которой для представления данных в виде строки»

Собирает все вместе:

<cfscript> 
    // some sample data to encrypt 
    stFields = { clientid = "AA-BB-CC-123" 
        , customername = "ABC Incorporated" 
        }; 

    // some 256 bit key, must be base64 encoded 
    // hard coded for demo purposes only 
    keyInBase64 = "9NJU2L3FZ8Rr0WKZUFC3lyE/yRrQ7sIZmQRk3kx9MLE="; 

    // AES encrypt the value, and base64 encode the result 
    encryptedValue = encrypt( serializeJson(stFields) 
            , keyInBase64 
            , "AES/ECB/PKCS5Padding" 
            , "base64" 
          ); 
    // Now decrypt the base64 encoded encryption string 
    decryptedValue = decrypt( encryptedValue 
             , keyInBase64 
             , "AES/ECB/PKCS5Padding" 
             , "base64" 
          ); 

    // display results 
    WriteDump(variables); 
</cfscript> 

Обновление на основе комментариев:

Я заметил, что вы манипулируете сырье HTTP-строка ответа. Не видя API, я бы предположил, что либо: a) вам нужно сначала дешифровать всю строку, , затем извлечь части -OR- b) код не извлекает значения правильно, и поэтому вы не можете его расшифровать. Cfloop обрабатывает ответ как список, разделенный запятыми. На основании имен переменных, я предполагаю, что это на самом деле разделены новыми линиями вместо этого, то есть:

param1=xxxxx  -- new line 
param2=yyyyy  -- new line 
param3=zzzzz  

Это только догадки, хотя. Проверьте свой API. Каков фактический формат возвращаемого ответа? Кроме того, можете ли вы edit your question включить сообщение об ошибке?

+0

Это все хорошо и dandy, однако, как мне получить значение зашифрованной строки в сообщение cfhttp? Когда я использую это: в параметре я ничего не получаю. Не только это, когда я использую эту переменную в дампе, она также не отображает зашифрованное значение. – user1188254

+0

Тогда вы почти наверняка делаете что-то другое на своем конце. 1) Установили ли вы неограниченные файлы шифрования для обеспечения 256-битных ключей? 2) Вы запустили код выше - * точно так же, как и *? Сначала убедитесь, что мы можем работать в вашем коде. – Leigh

+0

Да, я добавил неограниченное шифрование пару дней назад и перезапустил сервер. Затем я копировал и вставлял cfscript в соответствии с запросом, однако, когда я пытаюсь сбрасывать, как указано ранее, нет зашифрованной строки. – user1188254