我们遇到了这个问题,我们无法解密我们加密的字符串。它比那更复杂,但这就是需要解决的问题。
<cfset URLString = "https://someurl/report/somereport?date=12/27/2017&areaid=25&districtid=111®ion=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请求的响应。
答案 0 :(得分:3)
(基于the original code的答案)
加密功能的结果正是我们想要的。
实际上,事实并非如此。
字符串逻辑稍微关闭,因此BaseURL包含太多字符。查询字符串的第一个字符(在本例中为“d”)将添加到变量字符串中。这会更改加密值,这就是它不会解密的原因。
BaseURL
:https://someurl/report/somereport? d Variables
:? d ate = 12/27/2017&amp; ... Encrypted
: 771D3386211040E83B0FD64F25 ... CompleteURL
:https://someurl/report/somereport? d 771D3386211040E83B0FD64F25 ... 我假设这不是真正的Decrypt()代码,因为参数与用于Encrypt()的参数不匹配。参数应该是:
decrypt(TheVariables, SecretKey, "AES", "HEX")
其他一些建议:
?
)可以简化代码Local
范围所有函数变量arguments
范围参数,而不是直接使用URL