2015-12-01 32 views
0

我正在使用CryptoJS加密用戶名和密碼並在我的Coldfusion/Railo服務器上的遠程CFC上解密它。我收到的錯誤消息是:鑑於最終塊未正確填充。我看過相關的主題,但我無法將解決方案「翻譯」成我的案例。Coldfusion解密將無法與CryptoJS一起使用:鑑於最終塊未正確填充

這裏是調用服務器上的功能的JavaScript:

var username = "[email protected]" 
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> 

回答

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個字符的密碼加密,以基地64造成24個編碼的字符。 16個字節和24個字節都是AES的有效密鑰大小,但使用Base 64派生密鑰是非常奇怪的。


此代碼是不是很安全。如果您有密碼,那麼您需要以安全的方式從密碼中獲得密鑰。你需要用隨機鹽和許多次迭代來利用PBKDF2。見How to securely hash passwords?

的IV也必須被隨機產生。它不一定是保密的,所以你可以簡單地把它和密文一起發送。

+0

它不起作用的原因是,當你使用一個字符串,即'CryptoJS.enc.Base64.stringify(key)',該字符串被視爲密碼短語,並被用於*派生*加密密鑰。所以實際的「關鍵」與你在CF中使用的不一樣。爲了工作,您需要使用「WordArray」(或二進制)代替。但是,正如Artjom B.指出的那樣,這兩種方法都不是很安全。這類似於鎖定你的房子,但把鑰匙留在前門上。 – Leigh

相關問題