C# TripleDescrypto сохранил и извлечен из SQL. Не работает

StackOverflow https://stackoverflow.com/questions/4830969

  •  27-10-2019
  •  | 
  •  

Вопрос

Привет, так в базе данных MSSQL, которую я сохраняю и получаю с использования хранимых процедур. Я пытаюсь зашифровать некоторые данные в форме C# Windows перед тем, как быть размещенным, а затем, конечно, расшифровываю их, когда я оттягиваю их. Все шифрование обрабатывается на стороне C#. Я использую пример кода для шифрования и дешифрования. класс Microsoft TripledCryptoService (версия памяти, 2 -й пример). Значения зашифруются и отправляются в базу данных, но при получении ее ошибки «плохие данные». Образец вызова шифрования ...

TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
byte[] tempByte = new byte[100];
tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);
txt_Last_Name.Text = System.Text.ASCIIEncoding.ASCII.GetString(tempByte);

txt_last_name отправляется в базу данных, и я вижу, что в базе данных есть что -то. В базе данных фамилия имеет тип varchar (20)

Образец вызова зашифрования ...

TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
string lastName = dr.GetString(dr.GetOrdinal("Last Name"));
if (isEncrypted)
{
     byte[] toDecrypt = new ASCIIEncoding().GetBytes(lastName);
     lastName = decrypt(toDecrypt, tDESalg.Key, tDESalg.IV);                    
}
txt_Last_Name.Text = lastName;

Он бомб в функции расшифровки по адресу: «csdecrypt.read (fromentrypt, 0, fromentrypt.length);»; »; И я не понимаю, почему. Я не уверен, что он не хранится в базе данных правильно, или мои преобразования не правы.

Если это что-то значит, «данные», входящие в функцию расшифровки, имеют размер 16 и содержат ненулевые значения, но «байт [] from Encrypt»-это массив размера 16, содержащий все нули.

Спасибо за помощь!

Это было полезно?

Решение

РЕДАКТИРОВАТЬ: Хорошо, у нас есть нижняя часть этого ... хотя проблема ASCII тоже укусилась.

Каждый раз, когда вы создаете новый TripleDESCryptoServiceProvider И спросите его для ключа/iv, он генерирует новый. Вам нужно где -то хранить это, так как это необходимо для расшифровки данных. В противном случае у вас нет «секрета», так что это не на самом деле шифрование ...


Это ужасная идея:

txt_Last_Name.Text = System.Text.ASCIIEncoding.ASCII.GetString(tempByte);

У вас произвольные двоичные данные в tempByte. Не Предположим, что это действительный текст ASCII. Это почти наверняка, где вы теряете данные.

Использовать Convert.ToBase64String а также Convert.FromBase64String безопасно кодировать непрозрачные двоичные данные как текст.

Кроме того, это плохая идея:

byte[] tempByte = new byte[100];
tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);

Какой смысл создать байтовый массив, если вы тогда будете игнорировать его? Использовать

byte[] tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV);

вместо. Ох, и попытаться следовать .NET .NET соглашения об именах :)

Сказав все это, если ваше шифрование всегда возвращает байтовый массив из 16 нулей, это почти уверен, что ваш encrypt Метод сломлен. Мы не можем действительно помочь там, пока вы не опубликуете код для этого метода.

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

(Примечание: даже если вы делал хочу использовать этот код, я бы написал его как txt_Last_Name.Text = Encoding.ASCII.GetString(tempByte);. Анкет Использование директив - ваш друг, и ASCII является собственностью Encoding, нет ASCIIEncoding.)

Другие советы

Просто Чтение доктора... вы должны преобразовать свой байт [] в строку, используя Convert.ToBase64String().

Либо Convert.ToBase64String (), как рекомендовано Pascal, либо сохраните данные как двоичные в вашей базе данных вместо текста (предпочтительное решение, поскольку они будут использовать меньше места). В SQL Server для этой цели существует тип данных Varbinary (MAX).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top