0

我有一个正在实现 ZNode 的客户端,它使用 aspnet_Membership 表来存储密码。该表包含一个加密密码,密码 salt 并使用 2 的“PasswordFormat”。据我所知,“2”是一个可恢复的加密密码。

ColdFusion 服务器是 BlueDragon 9 Alpha。如果您不了解 BD,不用担心,ColdFusion 支持“应该”的任何东西都可以工作,我也有 CF 10 来测试它。

如果您知道更好的方法来做到这一点,我会全力以赴。我需要能够创建用户/密码并通过 ColdFusion 将其存储在 ASP 成员表中。此外,我需要能够检查登录用户/密码。

查看 Web.config 文件时,ZnodeMembershipProvider 是“System.Web.Security.SqlMembershipProvider”类型。

machineKey 入口是这样的:(取出两个键值)

<machineKey decryption="AES" 
     decryptionKey="[64 character string]" 
     validation="SHA1" 
     validationKey="[128 character string]"/>

如果我尝试这样的事情:

Encrypt('myPassword', '[64 character string]', 'AES', 'Base64')

它说“指定的密钥不是该算法的有效大小。”

我对加密或 .NET 不是很了解。提前致谢。

4

2 回答 2

0

我相信 .NET 密码表使用 Triple-DES,而不是 AES。试试这个。

Encrypt('myPassword', '[64 character string]', '3DES', 'Base64')
于 2013-08-15T17:08:58.677 回答
0

我写的这个关于DNN (Dot Net Nuke) authentication的答案应该可以解决问题。(假设 ACF 和 BD 之间没有差异)。本质上,.NET 和 CF 处理加密的方式几乎没有区别。主要区别是:

  1. 编码
    • .NET 使用UTF-16LE
    • CF 总是使用UTF-8. 在 ACF 中,这意味着您必须使用encryptBinary而不是encrypt. (我不确定 OBD)。

  2. 密钥格式

    • .NET 使用十六进制
    • CF 通常使用 base64,因此您可能需要先转换密钥。

  3. 加密模式

    • .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" ));
于 2013-08-15T17:35:41.647 回答