Ошибка в шифровании кода C # при расшифровке! - PullRequest
0 голосов
/ 31 марта 2011

Немного дополнительной информации, как было предложено: Я заканчиваю веб-приложение CMS Intranet, где мне нужно использовать API продуктов (на основе ASP.NET). Из-за нехватки времени и проблем, связанных с аутентификацией Windows, мне нужен другой способ гарантировать, что сотрудникам не нужно будет повторно входить в систему при каждом посещении сайта для просмотра персонализированного контента. Это работает так: когда пользователь входит в систему (имя пользователя / пароль), генерируется идентификатор сеанса, в котором хранится новое значение контекста безопасности, которое используется для отображения персонализированного контента. Вызванный метод входа API использует имя пользователя и пароль в качестве параметров. Единственный способ автоматически войти в систему при следующем посещении сайта сотрудниками - сохранить пароль в зашифрованном cookie-файле и проверить его наличие при посещении сайта, а затем вызвать метод входа API с использованием имени пользователя и расшифрованного пароля. значения cookie.

Любые другие идеи в качестве альтернативы приветствуются.

Мо

Привет, Я использую некоторый код, найденный в сети, для шифрования и дешифрования строки пароля. Он прекрасно шифруется, но когда он вызывает приведенный ниже код для расшифровки строки, он выдает ошибку " Длина данных для расшифровки недопустима " Как я могу решить эту проблему?

Заранее спасибо.

Мо

System.Text.Encoding enc = System.Text.Encoding.ASCII;
            byte[] myByteArray = enc.GetBytes(_pword);


            SymmetricAlgorithm sa = DES.Create();
            MemoryStream msDecrypt = new MemoryStream(myByteArray);
            CryptoStream csDecrypt = new CryptoStream(msDecrypt, sa.CreateDecryptor(), CryptoStreamMode.Read);
            byte[] decryptedTextBytes = new Byte[myByteArray.Length];
            csDecrypt.Read(decryptedTextBytes, 0, myByteArray.Length);
            csDecrypt.Close();
            msDecrypt.Close();

            string decryptedTextString = (new UnicodeEncoding()).GetString(decryptedTextBytes);

Ответы [ 4 ]

3 голосов
/ 31 марта 2011

Несколько вещей здесь ...

  1. Обычно вы не должны шифровать пароли. Вы должны хэш их.

Если вы решите продолжить шифрование ..

  1. Вы используете алгоритм DES. Это считается небезопасным и ошибочным. Я бы порекомендовал посмотреть на алгоритм AES.
  2. В зависимости от объема данных, с которыми вы работаете, CryptoStream может быть излишним.
  3. Использование кодировки ASCII может привести к потере данных, которые не являются ASCII, например кириллицы. Рекомендуемое исправление - использовать что-то еще, например, UTF8.

Вот пример:

string text = "Hello";
using (var aes = new AesManaged())
{
    var bytes = System.Text.Encoding.UTF8.GetBytes(text);
    byte[] encryptedBytes;
    using (var encrypt = aes.CreateEncryptor())
    {
        encryptedBytes = encrypt.TransformFinalBlock(bytes, 0, bytes.Length);
    }
    byte[] decryptedBytes;
    using (var decrypt = aes.CreateDecryptor())
    {
        decryptedBytes = decrypt.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
    }
    var decryptedText = System.Text.Encoding.UTF8.GetString(decryptedBytes);
    Console.Out.WriteLine("decryptedText = {0}", decryptedText);
}

Это будет использовать случайный ключ каждый раз. Вполне вероятно, что вам нужно будет зашифровать некоторые данные, а затем расшифровать их позже. Когда вы создаете объект AesManaged, вы можете сохранить свойства Key и IV. Вы можете повторно использовать один и тот же ключ, если хотите, но разные данные всегда должны быть зашифрованы с использованием другого IV (вектора инициализации). Где вы храните этот ключ, зависит от вас. Вот почему хэширование может быть лучшей альтернативой: ключа нет, и не нужно беспокоиться о безопасном хранении ключа.

Если вы хотите пойти по пути хеширования, вот небольшой пример:

var textToHash = "hello";
using (SHA1 sha = new SHA1Managed())
{
    var bytesToHash = System.Text.Encoding.UTF8.GetBytes(textToHash);
    var hash = sha.ComputeHash(bytesToHash);
    string base64hash = Convert.ToBase64String(hash);
}

При этом используется алгоритм SHA1, который должен хорошо работать для паролей, однако вы можете рассмотреть SHA256.

Концепция проста: хеш будет генерировать (в основном) уникальный вывод для входа, однако вывод не может быть преобразован обратно во вход - это разрушительно. Всякий раз, когда вы хотите проверить, должен ли пользователь проходить аутентификацию, проверьте хэш пароля, который он вам дал, и проверьте его на соответствие хэшу правильного пароля. Таким образом, вы не храните ничего чувствительного.

0 голосов
/ 31 марта 2011

DES является блочным шифром - допустимы только определенные длины буферов.Если я правильно помню, размер блока для DES составляет 64 бита, поэтому вам нужно убедиться, что ваш байтовый массив кратен длине 8 байт.

(Это должно решить вашу непосредственную проблему, но я бы сослалсясовет других людей здесь - вам действительно не следует использовать DES для какого-либо нового кода, а для паролей обычно более уместно хешировать, чем шифровать).

0 голосов
/ 31 марта 2011

Сравните байты, использованные для создания строки _pword (в методе шифрования), с байтами, полученными с помощью GetBytes.Вероятно, вы заметите изменение данных там.

Для хранения зашифрованных байтов, я думаю, вам следует использовать Convert.ToBase64String и Convert.FromBase64String, чтобы превратить зашифрованный пароль в / из строки.

Я также не вижу код, в котором вы установили Ключ и IV.Поэтому я предполагаю, что вы используете другой ключ для шифрования и дешифрования пароля.

Если текущее свойство Key имеет значение null, вызывается метод GenerateKey для создания нового случайного ключа.Если текущее свойство IV имеет значение null, вызывается метод GenerateIV для создания нового случайного значения IV.

0 голосов
/ 31 марта 2011

Я уже имел эту ошибку раньше, и мне потребовалось 3 дня, чтобы найти решение. Проблема заключается в том, что ключ машины, который вам нужен для расшифровки, должен быть зарегистрирован на самой машине.

Полностью ознакомьтесь с шифрованием DES, оно работает с помощью ключа приложения и ключа машинного уровня. Вероятно, вы получаете ошибку из-за отсутствия ключа машины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...