Coldfusion加密&解密组件中的函数

时间:2018-02-07 17:59:04

标签: ajax encryption coldfusion

我们遇到了这个问题,我们无法解密我们加密的字符串。它比那更复杂,但这就是需要解决的问题。

<cfset URLString = "https://someurl/report/somereport?date=12/27/2017&areaid=25&districtid=111&region=southwest&city=Tampa&localekey=X999&localename=Ybor&informed=true">
<cfset FindTheQ = Find('?', URLString)>
<cfset MinusTheQ = Val(FindTheQ + 1)>
<cfset BaseURL = Left(URLString, FindTheQ)>
<cfset URLStringLength = Len(URLString)>
<cfset TheVariables = Mid(URLString, MinusTheQ, URLStringLength)>
<cfset SecretKey=GenerateSecretKey("AES")>

<cfset Encrypted = encrypt(TheVariables, SecretKey, "AES", "HEX") />
<cfset Decrypted = decrypt(Encrypted, SecretKey, "AES", "HEX") />
<cfset CompleteURL = BaseURL & Decrypted>

<cfoutput>
URLString: #URLString#<BR><BR>
BaseURL: #BaseURL#<BR><BR>
Variables: #TheVariables#<BR><BR>
Encrypted: #Encrypted#<BR><BR>
Decrypted: #Decrypted#<BR><BR>
CompleteURL: #CompleteURL#<BR><BR>
</cfoutput>

所以上面是一个很好的小测试cfm页面。我们得到一个URL作为字符串。我们将它提取为两部分,BaseURL和TheVariables。我们的想法是加密TheVariables而不是BaseURL。然后我们解密TheVariables,并与FullURL的BaseURL连接。我在底部输出它们以显示它的工作原理。好极了!

然而,在“现实世界”中,它不是一个简单的cfm页面。在实际代码中,它是cfwheels框架控制器中的一个组件,其中使用Javascript和Ajax调用单独的加密和解密函数。啧!因此,假设所有相关代码都存在于下面的两个函数中(我包括可读性的最小值。

<cfcomponent extends="Controller">
    <cffunction name="EncryptLink">
        <cfset SecretKey = "WTq8zYcZfaWVvMncigHqwQ==">

        <cfset FindTheQ = Find('?', URL.URLString)>
        <cfset MinusTheQ = Val(FindTheQ + 1)>
        <cfset BaseURL = Left(URL.URLString, FindTheQ)>
        <cfset URLStringLength = Len(URL.URLString)>
        <cfset TheVariables = Mid(URL.URLString, MinusTheQ, URLStringLength)>
        <cfset Encrypted = encrypt(TheVariables, SecretKey, "AES", "Base64") />
        <cfset CompleteURL = BaseURL & Encrypted>

        <cfreturn renderText(CompleteURL)>
   </cffunction>

   <cffunction name="DecryptLink">
       <cfset SecretKey = "WTq8zYcZfaWVvMncigHqwQ==">

       <cfset FindTheQ = Find('?', URL.URLString)>
       <cfset MinusTheQ = Val(FindTheQ + 1)>
       <cfset BaseURL = Left(URL.URLString, FindTheQ)>
       <cfset URLStringLength = Len(URL.URLString)>
       <cfset TheVariables = Mid(URL.URLString, MinusTheQ, URLStringLength)>

       <cfset Decrypted = decrypt(TheVariables, SecretKey, "AES", "Base64")>
       <cfset CompleteURL = BaseURL & Decrypted>

       <cfreturn renderText(CompleteURL)>
   </cffunction>

加密功能的结果正是我们想要的。有用!再说一遍!但是,当解密函数运行时,它会正确地返回第一部分BaseURL,但是Decrypted部分会返回随机字符和那些带有问号的黑色钻石。这意味着它没有被解释。

其他:

  • GenerateSecretKey函数对我们不起作用,因为当点击链接进行解密时,它会生成一个新密钥。

  • 我们尝试过AES,DES和&amp; Blowfish加密。

  • 我们尝试过使用base64,UU和hex编码。

  • renderText()函数适用于cfwheels,只返回您的文本 指定。它可用作对AJAX请求的响应。

1 个答案:

答案 0 :(得分:3)

(基于the original code的答案)

  

加密功能的结果正是我们想要的。

实际上,事实并非如此。

字符串逻辑稍微关闭,因此BaseURL包含太多字符。查询字符串的第一个字符(在本例中为“d”)将添加到变量字符串中。这会更改加密值,这就是它不会解密的原因。

我假设这不是真正的Decrypt()代码,因为参数与用于Encrypt()的参数不匹配。参数应该是:

decrypt(TheVariables, SecretKey, "AES", "HEX")

其他一些建议:

  1. 使用列表函数(带分隔符?)可以简化代码>
  2. Local范围所有函数变量
  3. 使用arguments范围参数,而不是直接使用URL