Шифрование 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 обрабатывают шифрование. Основные различия:
- Кодировка:
- .NET использует
UTF-16LE
- CF всегда использует
UTF-8
, В ACF это означает, что вы должны использоватьencryptBinary
вместоencrypt
, (Я не уверен насчет OBD).
- .NET использует
Формат ключа:
- .NET использует шестнадцатеричное
- CF обычно использует base64, поэтому вам может понадобиться сначала преобразовать ключи.
Режим шифрования:
- .NET по умолчанию
CBC
режим (требуется IV) - CF по умолчанию
ECB
(IV не требуется)
- .NET по умолчанию
В случае смерти другой ссылки, вот полный пример. Пока он использует 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" ));