我写的这个关于DNN (Dot Net Nuke) authentication的答案应该可以解决问题。(假设 ACF 和 BD 之间没有差异)。本质上,.NET 和 CF 处理加密的方式几乎没有区别。主要区别是:
- 编码:
- .NET 使用
UTF-16LE
- CF 总是使用
UTF-8
. 在 ACF 中,这意味着您必须使用encryptBinary
而不是encrypt
. (我不确定 OBD)。
密钥格式:
- .NET 使用十六进制
- CF 通常使用 base64,因此您可能需要先转换密钥。
加密模式:
- .NET 默认为
CBC
模式(需要 IV)
- CF 默认为
ECB
(无需 IV)
如果另一个链接失效,这里是完整的例子。虽然它使用3DES
,但基本概念是相同的AES
。注意:在 Java 中,较大的密钥大小(即 192,256)只有在安装了 Sun Unlimited Strength Jurisdiction Policy Files 时才可用。
3DES 示例:
// sample valus
plainPassword = "password12345";
base64Salt = "x7le6CBSEvsFeqklvLbMUw==";
hexDecryptKey = "303132333435363738393031323334353637383930313233";
// first extract the bytes of the salt and password
saltBytes = binaryDecode(base64Salt, "base64");
passBytes = charsetDecode(plainPassword, "UTF-16LE" );
// next combine the bytes. note, the returned arrays are immutable,
// so we cannot use the standard CF tricks to merge them
// NOTE: If BlueDragon does not include "org.apache.commons...."
// just loop through the arrays and merge them manually
ArrayUtils = createObject("java", "org.apache.commons.lang.ArrayUtils");
dataBytes = ArrayUtils.addAll( saltBytes, passBytes );
// convert DNN hex key to base64 for ColdFusion
base64Key = binaryEncode(binaryDecode( hexDecryptKey, "hex"), "base64");
// create an IV and intialize it with all zeroes
// block size: 16 => AES, 8=> DES or TripleDES
blockSize = 8;
iv = javacast("byte[]", listToArray(repeatString("0,", blocksize)));
// encrypt using CBC mode
bytes = encryptBinary(dataBytes, base64Key, "DESede/CBC/PKCS5Padding", iv);
// result: WBAnoV+7cLVI95LwVQhtysHb5/pjqVG35nP5Zdu7T/Cn94Sd8v1Vk9zpjQSFGSkv
WriteOutput("encrypted password="& binaryEncode( bytes, "base64" ));