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

У меня есть 2 веб-сайта: один написан на классическом asp, а другой на ASP.NET (1.1 framework). Оба приложения используют механизм входа в систему для проверки учетных данных пользователя на основе таблицы общей базы данных. До сих пор пароли хранятся в одностороннем хеше 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, но я не могу найти решение.

5.11.2009 09:14:37
Мы используем точно такой же код в устаревшей части нашего приложения Classic ASP (vbScript) для шифрования строк ... что, IMHO, больше похоже на запутывание, чем на шифрование. Я взглянул на версию Classic ASP, с моими ограниченными знаниями в криптографии, я думаю, что код вообще не использует IV. Если кто-то знает, можно ли использовать RijndaelManagedбез вектора инициализации (IV), я думаю, что это может очень помочь.
MaxiWheat 24.04.2012 22:33:44
Почему вы хотите расшифровать пароли? Почему бы просто не позволить пользователю создать новый пароль по своему выбору?
Nik Bougalis 8.02.2013 00:28:12
3 ОТВЕТА
РЕШЕНИЕ

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

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

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

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

0
6.11.2009 20:05:10
Спасибо Патрик, так что классическое решение для asp не совсем соответствует стандартному методу шифрования. Я думаю разработать dll в .NET, которая позаботится о шифровании и сделает эту dll вызываемую форму классическим asp.
Stief Dirckx 9.11.2009 08:37:52
Я не посмотрел так внимательно, но похоже, что классический asp просто выполняет AES, который сам по себе не очень полезен, но код выполняет то, что он говорит на жестяной панели ... вы можете добавить блочный режим самостоятельно, но .net делает все это для вас ...
Patrick 9.11.2009 11:25:29

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

0
5.11.2009 09:21:13
MD5 не проблема, это работает уже много лет как для классического ASP и ASP.NET. Но я хочу преобразовать все в шифрование Rijndael, чтобы пароли также можно было расшифровать.
Stief Dirckx 5.11.2009 09:26:19
То же самое относится: если эти два метода, по разным алгоритмам, результаты не совпадают, используйте тот же алгоритм, и они будут. ИЛИ вам нужно будет сделать сложный путь: проверить правильность реализации блочного шифра AES Rijndael Фила Фресле
Rubens Farias 5.11.2009 09:31:08

Фил Фресле предоставляет версию этого кода на 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 Gists:

4
8.09.2015 21:39:32
Использование пустого IV отрицательно сказывается на цели CBC и небезопасно.
SLaks 27.12.2013 15:31:31
Хорошая точка зрения. Проблема в том, что шифрование VB Script, используемое в вопросе OP, на самом деле использует пустой вектор инициализации. Для того, чтобы просто иметь версию .Net, совместимую с версией VB Script, требуется пустой IV. Благодарим Вас за то, что другие узнали о пустых подробностях IV.
Ryan Griffith 27.12.2013 18:07:06
Привет @cchamberlain, я создал Gist, который включает в себя оригинальную версию Фила вместе с приведенным выше кодом взаимодействия. gist.github.com/ryno1234/ea34415643d109974b6f
Ryan Griffith 8.09.2015 20:55:24
@cchamberlain, вы можете найти его здесь: gist.github.com/ryno1234/2fc83faff281babea7f8 , удачи!
Ryan Griffith 8.09.2015 21:40:00
@RyanGriffith - Большое спасибо. Я попробовал запустить версию C # в компоненте COM +, и это, кажется, работает отлично, поэтому мне не нужно было использовать классическую версию, но все равно приятно иметь запасной вариант (и, вероятно, поможет будущим людям обновить 20-летний код) ,
cchamberlain 9.09.2015 20:38:45