Coldfusion解密不会使用CryptoJS:给定最终块没有正确填充

时间:2015-12-01 20:13:41

标签: encryption coldfusion aes cryptojs

我正在努力使用CryptoJS加密用户名和密码,并在Coldfusion / Railo服务器上的远程CFC上解密。我收到的错误消息是:给定最终块未正确填充。我看过相关的主题,但我无法翻译'解决我的问题。

以下是在服务器上调用该函数的JavaScript:

var username = "hr_muller@blabla.com"
var password = "12345"
var ident = username.concat('|',password)

var key = CryptoJS.enc.Utf8.parse("dotterbloem20151");
var key  = CryptoJS.enc.Base64.stringify(key);

var encrypted = CryptoJS.AES.encrypt(ident, key, {iv: key});

//In my JS the encryption/decryption works fine
var decrypted = CryptoJS.AES.decrypt(encrypted, key, {iv: key});
document.write(decrypted.toString(CryptoJS.enc.Utf8));
document.write('<BR>')
document.write(decrypted.toString(key));

var url = "cfc/roland.cfc?method=checkLoginstatus";
$.ajax({
     url: url,
     type: 'POST',
     dataType: "json",
     data: { "webkey" : encrypted.toString() }, 
     success: function(response) {
     }
});

这是我的CFC中的功能:

<cffunction name="checkLoginstatus" access="remote" returntype="any" returnformat="plain">

    <cfargument name="webkey" />

    <cfoutput>
        <cfset myKey = Tobase64("dotterbloem20151") />
        <cfset myIV = charsetDecode("dotterbloem20151", "utf-8" )>
        #Decrypt(ARGUMENTS.webkey, myKey, "AES/CBC/PKCS5Padding", "base64", myIV)#
    </cfoutput>

</cffunction>

1 个答案:

答案 0 :(得分:2)

我不知道Coldfusion,但看起来你使用相同的密码从中获取密钥和IV,但每个密码都不同。

您可以在CryptoJS中执行此操作:

var iv = CryptoJS.enc.Utf8.parse("dotterbloem20151");
var key = CryptoJS.enc.Base64.stringify(iv);

var encrypted = CryptoJS.AES.encrypt(ident, key, {iv: iv});

这是一种获取密钥的奇怪方法,因为16个字符的密码被编码为Base 64,导致24个编码字符。 16个字节和24个字节都是AES的有效密钥大小,但使用Base 64来获取密钥至少是奇怪的。

此代码不是很安全。如果您有密码,则需要以安全的方式从该密码派生密钥。您需要使用随机盐和多次迭代的PBKDF2。见How to securely hash passwords?

IV也必须随机生成。它不必是秘密的,因此您只需将其与密文一起发送即可。