2013-01-11 11 views
8

FINAL EDIT: SOLVATO, l'aggiornamento di dev locale su railo 3.3.4.003 ha risolto il problema.Output diverso da toBase64() in CFML su 2 macchine diverse


devo RC4 crittografare alcune stringhe e li hanno base64 e sto correndo in una situazione in cui lo stesso ingresso genererà uscite differenti su 2 differenti configurazioni dev.

Per esempio, se ho una stringa di [email protected]
su una macchina (DEV-1) Prendo: DunU+ucIPz/Z7Ar+HTw=
e dall'altra (DEV-2) sarà: DunU+ucIlZfZ7Ar+HTw=

In primo luogo, sono rc4 che lo crittografa attraverso un function found here. Successivo Sto alimentando a: toBase64(my_rc4_encrypted_data, "iso-8859-1")

Per quanto posso dire l'output di crittografia rc4 è lo stesso su entrambi (o mi manca qualcosa). Di seguito sono riportate le variabili SERVER di entrambe le macchine e la funzione di crittografia.

È qualcosa con cui dobbiamo semplicemente convivere o c'è qualcosa che posso fare per "gestirlo correttamente" (per la mancanza di una parola migliore). Sono preoccupato che in futuro questo mi morde e mi chiedo che possa essere evitato.

Edit 1: uscita da my_rc4_encrypted_data.getBytes() restituisce: dev-1:

Native Array (byte[]) 
14--23--44--6--25-8-63-63--39--20-10--2-29-60 

dev-2:

Native Array (byte[]) 
14--23--44--6--25-8-63-63--39--20-10--2-29-60 

(nessuna codifica passato alla getBytes())

DEV-1 (remoto)

server.coldfusion 
productname Railo 
productversion 9,0,0,1 

server.java 
archModel 64 
vendor Sun Microsystems Inc. 
version 1.6.0_26 

server.os 
arch amd64 
archModel 64 
name Windows Server 2008 R2 
version 6.1 

server.railo 
version 3.3.2.002 

server.servlet 
name Resin/4.0.18 

DEV-2 (locale) la funzione

server.coldfusion 
productname  Railo 
productversion 9,0,0,1 

server.java 
vendor Oracle Corporation 
version 1.7.0_01 

server.os 
arch x86 
name Windows 7 
version 6.1 

server.railo 
version 3.2.2.000 

server.servlet 
name Resin/4.0.18 

RC4:

function RC4(strPwd,plaintxt) { 
    var sbox = ArrayNew(1); 
    var key = ArrayNew(1); 
    var tempSwap = 0; 
    var a = 0; 
    var b = 0; 
    var intLength = len(strPwd); 
    var temp = 0; 
    var i = 0; 
    var j = 0; 
    var k = 0; 
    var cipherby = 0; 
    var cipher = ""; 

    for(a=0; a lte 255; a=a+1) { 
    key[a + 1] = asc(mid(strPwd,(a MOD intLength)+1,1)); 
    sbox[a + 1] = a; 
    } 

    for(a=0; a lte 255; a=a+1) { 
    b = (b + sbox[a + 1] + key[a + 1]) Mod 256; 
    tempSwap = sbox[a + 1]; 
    sbox[a + 1] = sbox[b + 1]; 
    sbox[b + 1] = tempSwap;  
    } 

    for(a=1; a lte len(plaintxt); a=a+1) { 
    i = (i + 1) mod 256; 
    j = (j + sbox[i + 1]) Mod 256;  
    temp = sbox[i + 1]; 
    sbox[i + 1] = sbox[j + 1]; 
    sbox[j + 1] = temp; 
    k = sbox[((sbox[i + 1] + sbox[j + 1]) mod 256) + 1];  
    cipherby = BitXor(asc(mid(plaintxt, a, 1)), k); 
    cipher = cipher & chr(cipherby);  
    } 
    return cipher; 
} 
+1

Solo per motivi di test, è possibile passare entrambi in esecuzione sulla stessa versione JVM e vedere se questo fa la differenza. È una variabile facile da eliminare. Il prossimo sarebbe provare la stessa versione di Railo, nel caso ci sia un diff lì. –

+0

Sembra strano. La funzione RC4 dovrebbe fornire lo stesso output dato lo stesso input. Vorrei provare Base64 codificare qualcosa di semplice su entrambe le macchine. Vedo che hai diverse architetture e Base64 codifica la rappresentazione binaria in una stringa quindi non so se questo potrebbe causare una differenza –

+0

Ha senso, ma sfortunatamente è fuori dalla mia "giurisdizione". Il meglio che potrò fare è dare un calcio alla "catena di comando". – vector

risposta

2

Leigh ha scritto:

Ma essere sicuri di utilizzare la stessa codifica nel test cioè String.getBytes (codifica) (Edit) Se si omette di esso, il valore di default JVM è utilizzato.

Leigh è giusto - RAILO-1393 determinato una change per toBase64 relative al charset codifiche in 3.3.0.017, che è tra le versioni 3.3.2.002 e 3.2.2.000 che si sta utilizzando.

0

Per quanto posso dire l'uscita di crittografia RC4 è lo stesso su entrambi (o mi manca qualcosa). Di seguito sono riportate le variabili SERVER di entrambe le macchine e la funzione di crittografia.

Suggerisco di salvare l'output in due file e quindi di confrontare le dimensioni del file o, ancora meglio, uno strumento di confronto dei file. La codifica Base64 è un approccio standard per convertire i dati binari in dati stringa.

Supponendo che i file binari siano entrambi esattamente al 100% uguali, su entrambi i server provare a convertire i dati nella base 64 e quindi di nuovo in binario. Prevedo che solo uno (o nessuno dei due) server sia in grado di convertire nuovamente i dati in binari. A quel punto, dovresti avere un indizio su quale server sta causando il tuo problema e puoi approfondire ulteriormente.

Se entrambi possono invertire i dati di base 64 in binario e il binario è corretto su entrambi i server ... beh, non ne sono sicuro.

Problemi correlati