【问题标题】:Error with Decrypt for "Could not perform unpadding: invalid pad byte.."“无法执行取消填充:无效填充字节..”的解密错误
【发布时间】:2014-01-20 18:30:14
【问题描述】:

使用 CF8 和 MySQL 5.1,我尝试在创建密码时加密()密码,然后在登录时解密()。我可以让decrypt() 在测试页面上正常工作,但是当我将它放在带有cflogin 的cfincluded 页面中时,我收到错误“尝试加密或解密输入字符串时发生错误:com.rsa.jsafe.crypto .dr:无法执行取消填充:无效填充字节..“。从我的测试页面到我的应用程序,它是相同的代码和数据库。

应用程序.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,但得到一个字节数组错误。

非常感谢任何帮助或想法。

【问题讨论】:

    标签: encryption coldfusion aes coldfusion-8


    【解决方案1】:

    您正在为每个请求创建一个新的密钥,

    真的你的代码应该更像:

    <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>
    

    虽然您确实希望将密码密钥硬编码在配置文件中,否则如果您重新启动服务器,您将无法再次访问您的任何密码...

    【讨论】:

    • 真正要检查的主要事情是,当您对两个不同页面上的密钥和加密字符串进行 cfdump 时,它们都是相同的。所以存储在数据库中之前的加密字符串应该与以后从数据库中提取的相同。而且每次使用的密钥都需要相同。
    • 道歉-您的回答开始有意义,我相信我使用了不同的键。对你来说这么愚蠢的问题;使用 AES 的 generateSecretKey(),我如何确保我在重启时使用相同的密钥等...?
    • 我个人实际上为应用程序生成了一个唯一的密钥。然后将该密钥硬编码在应用程序中(存储在配置文件中 - 只是一个包含大量常量的 cfm)。这意味着您必须在服务器的某处拥有密钥的副本 - 但您无能为力。
    • 再次感谢您的帮助。我从 generateSecretKey 创建了一个变量,将其 cfoutput 以查看值是什么,然后将其用作密钥并从我的 application.cfc 中的配置文件中引用该变量。
    【解决方案2】:

    禁用 jsafe。将 -Dcoldfusion.disablejsafe=true 添加到您的 jvm 配置中。

    【讨论】:

      猜你喜欢
      • 2012-10-06
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 2012-12-26
      相关资源
      最近更新 更多