2013-01-11 4 views
8

ОКОНЧАТЕЛЬНЫЙ РЕДАКТИРОВАНИЕ: РЕШЕНЫЙ, модернизация локального разработчика на рельсо 3.3.4.003 разрешала проблему.Различные выходные данные от toBase64() в CFML на двух разных машинах


Я должен RC4 шифровать некоторые строки и иметь их в формате base64, и я бегу в ситуации, когда тот же вход будет генерировать различные выходы на 2-х разных Дев установок.

Например, если у меня есть строка [email protected]
На одной машине (DEV-1) я получаю: DunU+ucIPz/Z7Ar+HTw=
и на другой (DEV-2) это будет: DunU+ucIlZfZ7Ar+HTw=

Во-первых, я rc4 шифруя его через function found here. Далее я кормлю его до: toBase64(my_rc4_encrypted_data, "iso-8859-1")

Насколько я могу судить, выход шифрования rc4 одинаковый на обоих (или я чего-то не хватает). Ниже приведены переменные SERVER с обеих машин, а также функция шифрования.

Это что-то, с чем нам просто нужно будет жить, или есть что-то, что я могу сделать, чтобы «справиться с ним должным образом» (из-за отсутствия лучшего слова). Я обеспокоен тем, что в будущем это укусит меня и удивит, что его можно предотвратить.

редактировать 1: Выход из my_rc4_encrypted_data.getBytes() возвращает: 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 

(без кодирования не передается getBytes())

DEV-1 (удаленный)

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 (локальная) функция

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

Только для тестирования вы можете переключить их как на одну версию JVM, так и на то, чтобы это изменилось. Это простая переменная, которую можно устранить. Следующим было бы попробовать ту же версию Railo, если там есть diff. –

+0

Кажется странным. Функция RC4 должна обеспечивать один и тот же выход с одним и тем же входом. Я бы попробовал кодировку Base64 на обеих машинах. Я вижу, что у вас разные архитектуры, а Base64 кодирует двоичное представление в строку, поэтому я не знаю, может ли это вызвать разницу. –

+0

Имеет смысл, но к сожалению, это из-за моей «юрисдикции». Лучшее, что я смогу сделать, это поднять «цепочку команд». – vector

ответ

2

Ли писал:

Но обязательно использовать ту же кодировку в тесте т.е. String.getBytes (кодирование) (Edit) Если его опустить, то по умолчанию JVM является используется.

Leigh права - RAILO-1393 привело к change к toBase64, связанным с кодировкой кодировок в 3.3.0.017, который находится между 3.3.2.002 и 3.2.2.000 версией, которую вы используете.

0

Насколько я могу сказать, выход шифрования RC4 то же самое на обоих (или я чего-то не хватает). Ниже приведены переменные SERVER на обеих машинах, а также функция шифрования.

Я бы предложил сохранить вывод в двух файлах, а затем сравнить размер файла или, что еще лучше, инструмент сравнения файлов. Base64 кодирование является стандартным подходом к преобразованию двоичных данных в строковые данные.

Предполагая, что ваши двоичные файлы одинаковы на 100% одинаково, на обоих серверах попробуйте преобразовать данные на базу 64, а затем обратно в двоичную. Я бы предсказал, что только один (или ни один) из серверов может снова преобразовать данные обратно в двоичные файлы. В этот момент вы должны иметь представление о том, какой сервер вызывает вашу проблему, и может выкопать дальше.

Если они оба могут отменить базовые 64 данных в двоичные, а двоичные файлы верны на обоих серверах ... ну, я не уверен.