【问题标题】:Coldfusion Encrypt and DecryptColdfusion加密和解密
【发布时间】:2014-09-16 23:28:34
【问题描述】:

我在使用 cf9 加密和解密功能时遇到问题。具体来说,我使用的代码需要能够使用 AES/ECB/PKCS5Padding 256 进行加密。我正在尝试使用以下代码将数据发布到第三方银行:

<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-2zoqUROAeE8N8a87USuQpE7dVd5IvRa67cHsVkPwx9taKLuXKwsCKFC_-NW3j6IOQAvCnRNc4cRNfq2fqyRHBUrFbFDCCmwpk=

【问题讨论】:

标签: encryption coldfusion cryptography coldfusion-9


【解决方案1】:

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, 一定要更新正确的。 ie中列出的那个 CF 管理员)。

重新启动后,您将能够使用 256 位密钥进行加密。在 ECB 模式下,语法为:encrypt(string, key, algorithm, encoding)

  • string - 要加密的纯文本
  • key - 256 位密钥,必须是 base64 编码
  • algorithm - 表示所需的单个字符串:算法、模式和填充方案。注意:“AES”实际上是较长的“AES/ECB/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>

基于 cmets 的更新:

我注意到您正在处理原始 http 响应字符串。在没有看到 API 的情况下,我猜要么 a)您需要先解密整个字符串,然后提取部分-或- b)代码没有正确提取值,这就是为什么您无法解密。 cfloop 将响应视为逗号分隔的列表。根据变量名,我猜它实际上是用换行符分隔的,即:

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

不过,这些只是猜测。检查您的 API。返回响应的实际格式是什么?另外,您能否请edit your question 包含 full 错误消息?

【讨论】:

  • 这一切都很好,但是,我如何将加密字符串的值放入 cfhttp 帖子中?当我在参数中使用这个: 我什么也没得到。不仅如此,当我在转储中使用该变量时,它也不会显示加密值。
  • 那么你几乎肯定在做一些不同的事情。 1) 您是否安装了无限加密文件以允许 256 位密钥? 2) 您是否运行了上面的代码 - 完全按照原样?首先验证这一点,然后我们可以将其用于您的代码。
  • 是的,我在几天前添加了无限加密并重新启动了服务器。然后我按要求复制并粘贴了 cfscript,但是,当我尝试按前面所述进行转储时,没有加密字符串。
  • 我想我可能发布得太早了。你是对的,当我完全按照你说的那样使用它时,我可以看到转储。我将向其中添加其他字段,看看我得到了什么。
  • 好的,所以我已经成功加密表单字段并将数据发布到第三方。现在,当我尝试使用从 Httpresponse.filecontent 提供的相同 javaScript 来解密响应时,我收到一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多