Шифрование ColdFusion из таблиц членства.NET

У меня есть клиент, который реализует ZNode, который использует таблицу aspnet_Membership для хранения пароля. Эта таблица содержит зашифрованный пароль, соль пароля и использует "PasswordFormat" из 2. Из того, что я понял, "2" является восстанавливаемым зашифрованным паролем.

Сервер ColdFusion - это BlueDragon 9 Alpha. Если вы не знаете BD, не беспокойтесь, все, что поддерживает ColdFusion, "должно" сработать, и у меня есть CF 10 для его тестирования.

Если вы знаете лучший способ сделать это, я весь в ушах. Мне нужно иметь возможность создать пользователя / пароль и сохранить его в таблице членства ASP через ColdFusion. Кроме того, мне нужно иметь возможность проверить пользователя / пароль для входа в систему.

При просмотре файла 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. Заранее спасибо.

2 ответа

Я считаю, что таблицы.NET Password используют Triple-DES, а не AES. Попробуйте это вместо этого.

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

Этот ответ, который я написал о DNN (Dot Net Nuke), должен помочь. (При условии отсутствия различий между 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.

Пример 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" ));
Другие вопросы по тегам