&引用;无效填充“;ColdFusion加密/解密中的异常

&引用;无效填充“;ColdFusion加密/解密中的异常,coldfusion,coldfusion-11,Coldfusion,Coldfusion 11,我的代码抛出了一个我无法理解的异常。我还是个编程新手,请容忍我。这是我的代码: <cfsetting showdebugoutput="false"> <cfprocessingdirective pageencoding="utf-8"> <html> <head> <title>Test</title> </head> <body> <cfset k

我的代码抛出了一个我无法理解的异常。我还是个编程新手,请容忍我。这是我的代码:

<cfsetting showdebugoutput="false">
<cfprocessingdirective pageencoding="utf-8">
<html>
    <head>
        <title>Test</title>
    </head>
<body>

    <cfset key = generateSecretKey("AES")>

    <cfscript>
        if (isDefined("form")) {
            encFieldnamesArr = listToArray(form.fieldnames);
            decFieldnamesArr = arrayNew(1);

            for (paramName in encFieldnamesArr) {
                arrayAppend(decFieldnamesArr, "#decrypt(paramName, key, 'AES', 'HEX')#");
            }
        }
    </cfscript>

    <cfform>
        <cfinput name="#encrypt("firstName", key, "AES", "HEX")#" type="text" />
        <cfinput name="#encrypt("lastName", key, "AES", "HEX")#" type="text" />
        <cfinput type="submit" name="#encrypt("action", key, "AES", "HEX")#" value="submit" />
    </cfform>

</body>
</html>

“无效填充”是什么意思?谢谢

在解密时,您必须使用与加密值完全相同的
密钥
。每次加载页面时,您的代码都会生成一个全新的密钥:

<cfset key = generateSecretKey("AES")>
我意识到以上只是一个实验,但有几点提示:

  • 表单
    是一个系统结构,因此应始终对其进行定义。通常,您会检查是否存在特定的表单字段名。即

    structKeyExists(形式为“someFieldName”)

  • 因为您没有使用cfform/cfinput的任何额外功能(无论如何都不是很好),所以只需使用普通的html
    标记即可。使用CF版本将导致CF向页面添加大量不必要的javascript代码

  • 解密前后不需要双引号或
    #
    符号。只需使用:

    decrypt(参数名,密钥,'AES','HEX')


  • 你能发布一个我们可以复制+粘贴+运行的帖子吗?显然,不要包含真实的
    使用虚拟值或生成一次性键以用于演示目的。我猜您使用的解密密钥与加密密钥不同。您好,我刚刚添加了所有代码。没关系,我不是在应用程序中使用它,我只是好奇我是否可以这样做:)我完全忘记了在传递表单时页面会再次加载,因为我计划在ajax请求中使用它,我有一个不同的想法。谢谢D
    <cfset key = generateSecretKey("AES")>
    
    <cfscript>
      // WORKS: encrypt and decrypt with the same key
      key = generateSecretKey("AES");
      text = "the quick brown fox jumps over the lazy dog";
      encrypted = encrypt(text, key, 'AES', 'HEX');
      decrypted = decrypt(encrypted, key, 'AES', 'HEX');
      writeOutput("<br>text="& text);
      writeOutput("<br>key="& key);
      writeOutput("<br>encrypted="& encrypted);
      writeOutput("<br>decrypted="& decrypted);
    
      // FAILS: Decrypting with a *different* key will fail
      key = generateSecretKey("AES");
      writeOutput("<br>key="& key);
      decrypted = decrypt(encrypted, key, 'AES', 'HEX');
    </cfscript>