2013-05-17 20 views
6

Abbiamo un servizio di login silenzioso scritto in Coldfusion9 che accetta stringhe crittografate da sistemi esterni e quindi decripta in base ad un setup Algorithm/Encoding concordato. Questo ha funzionato senza problemi per anni dai sistemi che eseguono ASP/JAVA/PHP, ma ora abbiamo un client che non ha altra scelta che usare CryptoJS per eseguire la crittografia e per la vita di me non riesco a capire perché questo non decifrare in Coldfusion.AES Encrypt in CryptoJS e decifrare in Coldfusion

La mia conoscenza di crittografia non è brillante, ma la cosa che sto notando è il testo cifrato CryptoJS criptati per l'esatta stessa stringa/chiave è diversa ogni volta che effettuo la crittografia mentre in Coldfusion/Java posso sempre aspettarsi la stessa identica criptato stringa. Non sono sicuro se questo è legato alla codifica o meno, ma non ho mai incontrato questo problema accettando stringhe crittografate da qualsiasi altro sistema prima, quindi spero che sia il modo in cui sto crittografando in CryptoJS che non è corretto.

<cfoutput> 

<!--- Set String and Key ---> 
<cfset theKey = toBase64("1234567812345678")> 
<cfset string = "[email protected]"> 

<!--- CryptoJS AES Libraries ---> 
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> 
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64-min.js"></script> 

<script> 

// Encrypt String using CryptoJS AES 
var encrypted = CryptoJS.AES.encrypt("#string#", "#theKey#"); 
console.log(encrypted.toString()); 

// Decrypt String using CryptoJS AES 
var decrypted = CryptoJS.AES.decrypt(encrypted, "#theKey#"); 
console.log(decrypted.toString(CryptoJS.enc.Utf8)); 

</script> 

<!--- Coldfusion Decrypt String/FAILS ---> 
Decrypted: #decrypt(encryptedEmail, "#theKey#", "AES", "BASE64")# 

</cfoutput> 
+0

il codice di esempio non viene eseguito perché si puo' mescolare le variabili JavaScript e ColdFusion insieme come siete. JavaScript è lato client e ColdFusion è lato server, non possono parlare di come stai cercando di farli funzionare. –

+0

Matt quando questo script viene eseguito come CFM e analizzato/compilato da Coldfusion, queste variabili verranno valutate prima dell'esecuzione del javascript. Ho lavorato su molti progetti nel corso degli anni in cui coldfusion e javascript si stanno scambiando i dati, penso che il problema qui sia legato alla codifica in CryptoJS e mi sto avvicinando da un punto di vista semplicistico. –

+0

Encryptedemail non è definito ovunque. Questo non è il tuo problema generale, ma il codice di esempio non dà l'errore che dici che lo fa –

risposta

11

Sembra che ci siano due questioni:

  1. CryptoJS non sta usando la variabile come il key. Come menzionato @ Miguel-F, quando passi una stringa, "it's treated as a passphrase and used to derive [the] actual key and IV". Entrambi sono generati casualmente, motivo per cui il tuo risultato crittografato continua a cambiare. Ma ancora più importante, questo significa che CryptoJS sta usando uno key completamente diverso da quello nel tuo codice CF ed è per questo che decrypt() fallisce. (Almeno è parte del motivo ...)

  2. Il secondo problema è che, oltre all'algoritmo "AES", ci sono altre due impostazioni di crittografia, che devono corrispondere: mode e padding scheme. Mentre CryptoJS e ColdFusion utilizzano le stesse impostazioni predefinite per lo schema di riempimento, le "modalità" sono diverse:

È necessario garantire tutte e tre le impostazioni sono gli stessi su entrambi i lati. Prova ad utilizzare la modalità CBC in CF, poiché è comunque più sicuro di ECB. Nota: richiede l'aggiunta di un valore IV.

Codice CF:

<!--- this is the base64 encrypted value from CryptoJS ---> 
<cfset encrypted = "J2f66oiDpZkFlQu26BDKL6ZwgNwN7T3ixst4JtMyNIY="> 
<cfset rawString = "[email protected]"> 
<cfset base64Key = "MTIzNDU2NzgxMjM0NTY3OA=="> 
<cfset base64IV = "EBESExQVFhcYGRobHB0eHw=="> 

<cfset ivBytes = binaryDecode(base64IV, "base64")> 
<cfoutput> 
    #decrypt(encrypted, base64Key, "AES/CBC/PKCS5Padding", "base64", ivBytes)# 
</cfoutput> 

CryptoJS: (Adjusted originale Esempio)

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> 
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64-min.js"></script> 
<script> 
    var text = "#rawString#"; 
    var key = CryptoJS.enc.Base64.parse("#base64Key#"); 
    var iv = CryptoJS.enc.Base64.parse("#base64IV#"); 

    var encrypted = CryptoJS.AES.encrypt(text, key, {iv: iv}); 
    console.log(encrypted.toString()); 

    var decrypted = CryptoJS.AES.decrypt(encrypted, key, {iv: iv}); 
    console.log(decrypted.toString(CryptoJS.enc.Utf8)); 
</script> 


Edit:

Tutto ciò detto, cosa intendi per il client "non ha altra scelta che utilizzare CryptoJS per eseguire la crittografia"? Perché non possono usare la crittografia lato server?Io non sono un esperto di crittografia, ma facendo la crittografia in javascript, e esponendo la chiave sul client, non suona all'impazzata sicuro per cominciare ...

+0

+1 @Leigh - Lo stavo guardando stamattina (ma poi ho dovuto andarmene) e fondamentalmente sono arrivato alla tua stessa conclusione. Senza tutti gli stessi pezzi, ColdFusion non sarà in grado di decifrare il valore. Ho persino scritto uno script di test simile a quello che hai qui, ma non l'ho mai fatto decifrare correttamente ... –

+0

Sì, di solito è qualcosa di piccolo come una differenza come codifica, modalità o padding. Ma con la crittografia è tutto ciò che serve per ottenere un risultato completamente diverso ;-) @Phil - Per motivi di chiarezza, potresti voler impostare la modalità CryptoJS e riempirla esplicitamente, ad es. '{Iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7} '. Solo così è chiaro. – Leigh

+0

@ Miguel-F - Per i grin ho provato a utilizzare anche la modalità 'ECB' meno sicura. Ma non ha avuto fortuna con questo. I documenti dicono che è supportato, ma non ne sono così sicuro .. perché dicono anche * "Se passi la chiave attuale, devi anche passare la IV effettiva." *. Dato che la BCE non usa un 'iv' che non ha senso .. Nessuna grande perdita, dal momento che CBC è comunque migliore. – Leigh

Problemi correlati