最终编辑:已解决,将本地开发升级到railo 3.3.4.003已解决此问题。
我必须对RC4加密一些字符串并对它们进行base64编码,我遇到的情况是,相同的输入将在2个不同的开发设置上生成不同的输出。
例如,如果我有一个字符串test2@mail.com
在一台机器(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;
}
答案 0 :(得分:2)
Leigh写道:
但请务必在测试中使用相同的编码即 String.getBytes(encoding)(Edit)如果省略它,则jvm默认为 使用
Leigh是对的 - RAILO-1393导致与3.3.0.017中的字符集编码相关的change到toBase64,它位于您正在使用的3.3.2.002和3.2.2.000版本之间。
答案 1 :(得分:0)
据我所知,rc4加密输出在两者上是相同的(或者我遗漏了一些东西)。下面是来自两台机器的SERVER变量以及加密函数。
我建议将输出保存到两个文件,然后比较文件大小,或者更好的是文件比较工具。 Base64编码是将二进制数据转换为字符串数据的标准方法。
假设您的二进制文件完全100%相同,请在两台服务器上尝试将数据转换为base 64,然后再转换回二进制文件。我预测只有一个(或两个)服务器都无法再将数据转换回二进制数。此时,您应该知道哪个服务器导致了您的问题,并且可以进一步挖掘。
如果他们都可以将base 64数据反转为二进制,并且两个服务器上的二进制文件都是正确的......好吧,我不确定。