使用CF8和MySQL 5.1,我试图在创建时加密()密码,然后在登录时解密()。我可以让decrypt()在测试页面上正常工作但是当我把它放在带有cflogin的cfincluded页面时,我得到错误“尝试加密或解密输入字符串时出错:com.rsa.jsafe.crypto .dr:无法执行取消填充:无效的填充字节..“。从我的测试页面到我的应用程序是相同的代码和数据库。
application.cfc:
<cfif NOT IsDefined("Request.PasswordKey")>
<cfset request.PasswordKey = generateSecretKey("AES")>
<cfset request.algorithm = "AES">
<cfset request.encoding = "hex">
</cfif>
测试页面工作正常:
FORM DATA: <br/>
form password:<cfoutput>#form.passwd#</cfoutput><br/>
<cfset encrypted = Encrypt(form.passwd,Request.PasswordKey,Request.algorithm,Request.encoding)>
Encrypted: <cfoutput>#encrypted#</cfoutput><br/>
Decrypted: <cfoutput>#Decrypt(variables.encrypted,Request.PasswordKey,Request.algorithm,Request.encoding)#</cfoutput><br/>
<br/>
QUERY DATA<br/>
<cfinvoke component="components.userQ" method="login" returnvariable="qLogin">
<cfinvokeargument name="formData" value="#form#">
</cfinvoke>
<cfoutput>qLogin password: #qlogin.encPasswd#</cfoutput><br/>
<cfoutput>Decrypted encPasswd from qLogin: #Decrypt(qlogin.encPasswd,Request.PasswordKey,Request.algorithm,Request.encoding)#</cfoutput>
错误的应用页面中的Decrypt():
<cfset unEnPasswd = #Decrypt(qlogin.encPasswd,Request.PasswordKey,Request.algorithm,Request.encoding)#>
我可以使用相同的代码获取默认的CFMX_COMPAT encrypt()和decrypt()在我的应用程序中正常工作,只需更改密钥,算法和编码变量。
顺便说一句,我也将加密的字符串存储为数据库中的varchar(),这样就不会弄乱填充(所以我读了)。我尝试了BLOB但得到了一个bytearray错误。
非常感谢任何帮助或想法。
答案 0 :(得分:4)
您正在为每个请求创建一个新的密钥,
你的代码真的应该更像:
<cffunction name="onApplicationStart" returnType="boolean" output="false">
<cfset application.PasswordKey = generateSecretKey("AES")>
</cffunction>
<cffunction name="onRequestStart" returnType="boolean" output="false">
<cfset request.PasswordKey = application.PasswordKey />
<cfset request.algorithm = "AES" />
<cfset request.encoding = "hex" />
</cffunction>
虽然您确实希望在配置文件中对密码密钥进行硬编码,否则如果重新启动服务器,您将无法再次访问任何密码......
答案 1 :(得分:0)
禁用jsafe。将-Dcoldfusion.disablejsafe = true添加到您的jvm配置中。