2014-09-16 5 views
0

cf9 암호화 및 암호 해독 기능을 사용하는 데 문제가 있습니다. 특히, 내가 필요를 사용하는 코드는 내가 다음 코드를 사용하여 타사 은행에 데이터를 게시하려고 256을 PKCS5Padding에/AES/ECB으로 암호화 할 수 있도록 :Coldfusion 암호화 및 암호 해독

<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)

먼저 그 NOT 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 암호화하는 -을 base64 인코딩되어야 256 비트 키를
  • algorithm - 목적 나타내는 단일 문자열 : 알고리즘, 모드 및 패딩 방식참고 : "AES는"실제로
  • encoding 더 이상 "AES/ECB/PKCS5Padding에"에 대한 속기 - 모두 함께 퍼팅

"문자열로 데이터를 표현하기에 바이너리 인코딩"

를 의견에 따라
<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) 전체 문자열을 먼저 해독해야합니다. 다음에 부분 추출 - 또는 - b) 코드가 값을 올바르게 추출하지 않아서 해독 할 수 없습니다. cfloop은 응답을 쉼표로 구분 된 목록으로 처리합니다. 변수 이름을 기반으로, 실제로는 새 줄로 구분됩니다. 즉,

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

이러한 것들은 단지 추측입니다. API를 확인하십시오. 반환 된 응답의 실제 형식은 무엇입니까? 또한 edit your question전체 오류 메시지를 포함 시키실 수 있습니까?

+0

그러나 이것은 암호화 된 문자열의 가치를 cfhttp 게시물로 가져 오는 방법으로 훌륭합니다. 내가 이것을 사용할 때 : 나는 아무것도 얻지 못하고있다. 뿐만 아니라 덤프에서 해당 변수를 사용할 때도 암호화 된 값을 표시하지 않습니다. – user1188254

+0

그러면 거의 끝까지 뭔가 다른 것을하고있는 것입니다. 1) 256 비트 키를 사용할 수 있도록 무제한 암호화 파일을 설치 했습니까? 2) 위 코드를 실행 했습니까? * 정확하게 *? 먼저 코드에 적용 할 수 있는지 확인하십시오. – Leigh

+0

예 며칠 전 무제한 암호화를 추가하고 서버를 다시 시작했습니다. 그런 다음 요청한대로 cfscript를 복사하고 붙여 넣었습니다. 그러나 앞에서 설명한대로 덤프하려고하면 암호화 된 문자열이 없습니다. – user1188254