两台不同机器上的CFML中toBase64()的输出不同

vec*_*tor 8 base64 railo rc4-cipher cfml

最终编辑:已解决,将本地开发升级到railo 3.3.4.003解决了这个问题.


我必须RC4加密一些字符串并让它们base64编码,我遇到了相同的输入将在2个不同的开发设置上生成不同输出的情况.

例如,如果我test2@mail.com
在一台机器(DEV-1)上有一个字符串,我会得到:DunU+ucIPz/Z7Ar+HTw=
另一台(DEV-2)它将是:DunU+ucIlZfZ7Ar+HTw=

首先,我是rc4通过这里找到函数加密它.接下来我将它喂给: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
Run Code Online (Sandbox Code Playgroud)

DEV-2:

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

(没有编码传递给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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ton 2

利写道:

但请确保在测试中使用相同的编码,即 String.getBytes(encoding) (编辑)如果省略它,则使用 jvm 默认值。

Leigh 是对的 - RAILO-1393导致与 3.3.0.017 中的字符集编码相关的 toBase64 发生更改,该更改位于您正在使用的 3.3.2.002 和 3.2.2.000 版本之间。