【问题标题】:Encryption Issues with ColdFusionColdFusion 的加密问题
【发布时间】:2011-01-08 08:40:00
【问题描述】:

我正在尝试在 cookie 中存储一些加密(短)信息。我正在生成一个短字符串(大约 64 个字符),使用 generateSecretKey() 生成密钥,并尝试使用 AES 或 Blowfish 加密。

我已经使用 encode() 和 decode() 函数中的参数尝试了默认的 UUEncoding、Base64 和 Hex。

使用 AES,我得到了错误

尝试加密或解密您的输入字符串时出错:com.rsa.jsafe.crypto.dr:无法执行取消填充:无效填充字节..

使用 Blowfish,我得到了错误

尝试加密或解密您的输入字符串时发生错误:未正确填充最终块。

我做错了什么?

【问题讨论】:

  • ColdFusion 的哪个版本/版本?
  • 你能提供一个简单的例子来说明这个问题吗?
  • 是的,请发布您使用的 cfml 代码。

标签: encryption coldfusion aes blowfish


【解决方案1】:

由于时间限制,我们最终使用了 cfmx_copat 加密。

我向两个回答的人道歉,因为我从来没有像我希望的那样充分试验他们的回答。

【讨论】:

    【解决方案2】:

    我不确定您使用的是哪个版本,但这似乎适用于 CF9、OpenBD 和 Railo(使用 AES 或 Blowfish)

    <!--- create an encrypted cookie --->
    <cfset text = "testing, 1, 2, 3" >
    <cfset key = generateSecretKey("AES")>
    <cfset encrypted = encrypt(text, key, "AES", "hex")>
    <cfcookie name="secretValue" value="#encrypted#">
    
    <!--- display test values used--->
    <form method="post">
        DEBUG:<hr />
        <cfoutput>
        Text: #text#<br />
        Key: #key#<br />
        Encrypted:  #encrypted# <br />
    
        <input type="hidden" name="text" value="#text#">
        <input type="hidden" name="key" value="#key#">
        <input type="submit" value="Decrypt Cookie"> 
        </cfoutput>
    </form>
    
    <!--- decrypt test values --->
    <cfif structKeyExists(FORM, "key") AND structKeyExists(COOKIE, "secretValue")>
        <cfset decrypted = decrypt(cookie.secretValue, key, "AES", "hex") >
        <cfoutput>
            form.text = #text# <br />
            form.key = #key# <br />
            cookie.secretValue = #cookie.secretValue# <br />
            decrypted = #decrypted# <br />
        </cfoutput>
    </cfif>
    

    【讨论】:

      【解决方案3】:

      Blowfish 的块大小为 64 位,即 8 个字节。 AES 的块大小为 128 位,即 16 个字节。

      块大小意味着它只能做那个大小的块。所以块大小为 8 字节的东西不能做 7,6,5,4,3,2,1 字节。

      如果您的位数或字节数少于所需数量(此处为 8 和 16 字节),您必须填充那些有东西的东西才能到达 8/16 字节长的块。 (英文填充意味着您必须附加未使用的位/字节 - 有时是协议/算法规定的内容,有时内容无关紧要),直到您拥有所需大小的东西。)

      这两个错误都抱怨填充错误。所以我的预感是你没有将正确大小(长度)的数据传递给加密/解密算法。检查您的文档以查看它们是否接受作为输入数据:

      • 正好是一个块(这里是 8 或 16 个字节)
      • 块大小的精确倍数(= 在这种情况下,您必须进行填充)
      • 任意大小的数据(= 您不必进行填充 - 但为什么一开始就出现错误?)

      您是否有可能在加密步骤之前不小心完成了 UU/Base64/Hex 编码?

      你应该:

      • 先进行加密,
      • 然后是 UU/Base64/Hex 编码,
      • 然后将数据发送出去。

      显然,在接收到数据时反转顺序:

      • 第一次 UU/Base64/Hex 解码,
      • 然后解密,
      • 然后使用数据。

      【讨论】:

      • 我没有自己编码。我在 encode()/decode() 函数中使用了内置选项。
      • 抱歉,缺乏对环境的深入了解,我不了解更多。我找到了这个帖子,也许它有帮助:forums.sun.com/thread.jspa?threadID=607193
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2012-12-09
      • 2011-04-02
      • 2014-11-06
      • 1970-01-01
      相关资源
      最近更新 更多