Coldfusion 在组件的函数内加密和解密
Coldfusion Encrypt & Decrypt Within Functions In A Component
我们遇到了这个问题,我们无法解密我们加密的字符串。它有点复杂,但这是需要解决的问题。
<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,并与 BaseURL 连接以获得 CompleteURL。我在底部输出它们以显示它是如何工作的。耶!
但是,在 "real world" 中,它不是一个简单的 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,但解密部分会返回随机字符和那些带有问号的黑色菱形。这意味着它没有被解释。
附加:
GenerateSecretKey函数对我们不起作用,因为它会在点击link进入解密时生成新密钥。
我们已经尝试过 AES、DES 和 Blowfish 加密。
我们已经尝试使用 base64、UU 和十六进制编码。
renderText() 函数适用于 cfwheels 并且只是 returns 您的文本
指定。它作为对 AJAX 请求的响应很有用。
(答案基于 the original code)
The result from the encrypt function is exactly what we want.
其实不然。
字符串逻辑略有偏差,因此 BaseURL 包含的字符过多。查询字符串的第一个字符(在本例中为 "d")被添加到变量字符串中。这会更改加密值,这就是它不会解密的原因。
BaseURL
: https://someurl/report/somereport?d
Variables
: ?date=12/27/2017&...
Encrypted
: 771D3386211040E83B0FD64F25...
CompleteURL
: https://someurl/report/somereport?d771D3386211040E83B0FD64F25...
我假设这不是真正的 Decrypt() 代码,因为参数与用于 Encrypt() 的参数不匹配。参数应该是:
decrypt(TheVariables, SecretKey, "AES", "HEX")
其他一些建议:
- 使用列表函数(带定界符
?
)将大大简化代码
Local
作用域所有函数变量
- 对参数使用
arguments
范围,而不是直接使用 URL
我们遇到了这个问题,我们无法解密我们加密的字符串。它有点复杂,但这是需要解决的问题。
<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,并与 BaseURL 连接以获得 CompleteURL。我在底部输出它们以显示它是如何工作的。耶!
但是,在 "real world" 中,它不是一个简单的 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,但解密部分会返回随机字符和那些带有问号的黑色菱形。这意味着它没有被解释。
附加:
GenerateSecretKey函数对我们不起作用,因为它会在点击link进入解密时生成新密钥。
我们已经尝试过 AES、DES 和 Blowfish 加密。
我们已经尝试使用 base64、UU 和十六进制编码。
renderText() 函数适用于 cfwheels 并且只是 returns 您的文本 指定。它作为对 AJAX 请求的响应很有用。
(答案基于 the original code)
The result from the encrypt function is exactly what we want.
其实不然。
字符串逻辑略有偏差,因此 BaseURL 包含的字符过多。查询字符串的第一个字符(在本例中为 "d")被添加到变量字符串中。这会更改加密值,这就是它不会解密的原因。
BaseURL
: https://someurl/report/somereport?dVariables
: ?date=12/27/2017&...Encrypted
: 771D3386211040E83B0FD64F25...CompleteURL
: https://someurl/report/somereport?d771D3386211040E83B0FD64F25...
我假设这不是真正的 Decrypt() 代码,因为参数与用于 Encrypt() 的参数不匹配。参数应该是:
decrypt(TheVariables, SecretKey, "AES", "HEX")
其他一些建议:
- 使用列表函数(带定界符
?
)将大大简化代码 Local
作用域所有函数变量- 对参数使用
arguments
范围,而不是直接使用URL