Шифрование / дешифрование паролей между классическим asp и ASP.NET

У меня есть 2 веб-сайта: один написан на классическом asp, а другой - на ASP.NET (инфраструктура 1.1). Оба приложения используют механизм входа в систему для проверки учетных данных пользователя на основе общей таблицы базы данных. До сих пор пароли хранятся в одностороннем хеш-коде MD5, что означает, что людям должен быть предоставлен новый сгенерированный пароль, если они потеряют старый. Теперь я хочу изменить это и сделать пароли дешифруемыми.

Я нашел этот код Rijndael для использования с классическим asp: http://www.frez.co.uk/freecode.htm#rijndael.

Но я не могу найти такое же решение для ASP.NET. Я пробовал это, но это дает мне разные результаты шифрования и дешифрования между классическим кодом asp и кодом ASP.NET:

        If Not String.IsNullOrEmpty(TextBox1.Text) And Not String.IsNullOrEmpty(TextBox2.Text) Then

        Dim password = TextBox1.Text
        Dim key = TextBox2.Text

        Dim keyGenerator = New Rfc2898DeriveBytes(key, 8)
        Dim r = New RijndaelManaged

        r.Mode = CipherMode.CBC
        r.Padding = PaddingMode.Zeros
        r.BlockSize = 256
        r.KeySize = 256
        r.FeedbackSize = 256

        r.IV = keyGenerator.GetBytes(CType(r.BlockSize / 8, Integer))
        r.Key = keyGenerator.GetBytes(CType(r.KeySize / 8, Integer))

        Dim transform As ICryptoTransform = r.CreateEncryptor()

        Dim encoded As Byte() = Encoding.ASCII.GetBytes(password)
        Dim target As Byte() = transform.TransformFinalBlock(encoded, 0, encoded.Length)

        TextBox3.Text = Encoding.ASCII.GetString(target)

    End If

Я думаю, что делаю что-то не так с генерацией ключа или iv, но не могу найти решения.


person Stief Dirckx    schedule 05.11.2009    source источник
comment
Мы используем тот же самый код в унаследованной части нашего приложения Classic ASP (vbScript) для шифрования строк ... что, IMHO, больше похоже на обфускацию, чем на шифрование. Я взглянул на версию Classic ASP, с моими ограниченными знаниями в области криптографии, я думаю, что код вообще не использует IV. Если кто-то знает, можно ли использовать RijndaelManaged без вектора инициализации (IV), я думаю, это может очень помочь.   -  person MaxiWheat    schedule 25.04.2012
comment
Зачем вам нужны дешифруемые пароли? Почему бы просто не позволить пользователю сгенерировать новый пароль по своему выбору?   -  person Nik Bougalis    schedule 08.02.2013


Ответы (3)


Я быстро взглянул на классические файлы asp, и в нем не упоминается используемый блочный режим, тогда как ваш код .net указывает режим CBC, а также заполнение. Далее в классической реализации говорится:

«3 апреля 2001 года: внизу добавлены функции для шифрования / дешифрования больших» массивов данных. Вся длина массива вставляется как первые четыре байта в начало первого блока результирующего массива байтов перед шифрованием.

Вы используете эти функции, если вы тоже шифруете байты размера.

Будьте уверены, что шифрование .net работает хорошо, я предполагаю, что ваша проблема в классическом решении, которое вы нашли. Если бы я был на вашем месте, я бы начал с упрощения и просто зашифровал бы отдельный блок каждым методом, а затем расширил бы его ... удачи

person Patrick    schedule 06.11.2009
comment
Спасибо, Патрик, так что классическое решение asp на самом деле не придерживается стандартного метода шифрования. Я думаю разработать dll в .NET, который позаботится о шифровании и сделает эту dll вызываемой формой классической asp. - person Stief Dirckx; 09.11.2009
comment
Я не смотрел так внимательно, но похоже, что классический asp просто выполняет AES, который сам по себе не очень полезен, но код делает то, что говорит на жестяной банке ... вы могли бы добавить режим блока самостоятельно, но .net делает это все для тебя ... - person Patrick; 09.11.2009

Фил Фресл предоставляет версию этого кода для C #, которую можно загрузить здесь: http://www.frez.co.uk/csharp.aspx. Реализация по-прежнему отличается от классической версии, поскольку принимает аргументы для вектора инициализации, а также размера блока и ключа.

Вы можете использовать эту реализацию для соответствия классической версии следующим образом:

// Convert the input values to byte[]'s representing ASCII encoding.
// This is what the classic version does
byte[] dataToEncrypt = ASCIIEncoding.ASCII.GetBytes("Ryno");
byte[] password = ASCIIEncoding.ASCII.GetBytes("Saurus");

// Encrypt the data into an array of types
// Notice the block size is 256 bits and the initialization vector is empty.
byte[] results = Rijndael.EncryptData(
    dataToEncrypt,
    password,
    new byte[] { },  // Initialization vector
    Rijndael.BlockSize.Block256,  // Typically 128 in most implementations
    Rijndael.KeySize.Key256,
    Rijndael.EncryptionMode.ModeEBC 
);

// Convert bytes into a HEX string representation
StringBuilder hex = new StringBuilder(results.Length * 2);
foreach (byte b in results)
    hex.AppendFormat("{0:x2}", b);

// FINAL OUTPUT: This matches output of classic ASP Rijndael encryption
string hexEncodedString= hex.ToString();

В большинстве реализаций по умолчанию используется размер ключа 128, 192 или 256 бит. Стандартный размер блока составляет 128 бит. Хотя некоторые реализации допускают размеры блока, отличные от 128 бит, изменение размера блока просто добавит еще один элемент в смесь, чтобы вызвать путаницу при попытке зашифровывать данные в одной реализации для правильного дешифрования в другой.

Надеюсь, это поможет.

Обновлять

Ссылка Фила больше недоступна, поэтому я создал 2 Гиста:

person Ryan Griffith    schedule 03.02.2013
comment
Использование пустого IV противоречит цели CBC и небезопасно. - person SLaks; 27.12.2013
comment
Хорошая точка зрения. Проблема в том, что шифрование VB Script, используемое в вопросе OP, фактически использует пустой вектор инициализации. Чтобы просто иметь версию .Net, совместимую с версией VB Script, требуется пустой IV. Спасибо, что сообщили другим о пустой детали IV. - person Ryan Griffith; 27.12.2013
comment
@RyanGriffith, не могли бы вы помочь мне с методом дешифрования, я создал здесь новый вопрос stackoverflow.com/questions/20801952/ - person sawe; 30.12.2013
comment
Похоже, ссылка на реализацию Фила Фресла не работает :(. - person cchamberlain; 08.09.2015
comment
Привет, @cchamberlain, я создал Gist, который включает оригинальную версию Фила вместе с приведенным выше кодом взаимодействия. gist.github.com/ryno1234/ea34415643d109974b6f - person Ryan Griffith; 08.09.2015
comment
Спасибо, @RyanGriffith! Я нигде не мог найти. Есть ли шанс, что у вас есть реализация VBScript? - person cchamberlain; 09.09.2015
comment
@cchamberlain, вы можете найти его здесь: gist.github.com/ryno1234/2fc83faff281babea7f8, хорошо удача! - person Ryan Griffith; 09.09.2015
comment
@RyanGriffith - Большое спасибо. У меня была попытка запустить версию C # в компоненте COM +, и она, похоже, отлично работает, поэтому в конечном итоге классическая версия не потребовалась, но в любом случае приятно иметь запасной вариант (и, вероятно, поможет будущим людям обновлять код 20-летней давности) . - person cchamberlain; 09.09.2015

Поскольку в классическом ASP нет встроенных хэш-функций, вам, вероятно, потребуется перенести код MD5 VBScript на язык .NET или использовать общий криптографический компонент из-за некоторой ошибки в устаревшем коде.

person Rubens Farias    schedule 05.11.2009
comment
MD5 не проблема, он работает уже много лет как для классического asp, так и для ASP.NET. Но я хочу преобразовать все в шифрование Rijndael, чтобы пароли также можно было расшифровать. - person Stief Dirckx; 05.11.2009
comment
То же самое применимо: если эти два метода, по разным алгоритмам, результаты не совпадают, используйте один и тот же алгоритм, и они будут. ИЛИ, вам придется проделать трудный путь: проверка реализации блочного шифра AES Rijndael Фила Фресла - person Rubens Farias; 05.11.2009