我正在努力使用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>
答案 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也必须随机生成。它不必是秘密的,因此您只需将其与密文一起发送即可。