c # tripleDESCrypto сохранен и извлечен из SQL не работает - PullRequest
0 голосов
/ 28 января 2011

Привет! Итак, в базе данных msSQL, которую я сохраняю и извлекаю из хранимых процедур.Я пытаюсь зашифровать некоторые данные в форме окна C # перед размещением, а затем, конечно, расшифровывать их, когда я возвращаю их назад.все шифрование обрабатывается на стороне c #.Я использую пример кода для шифрования и расшифровки дословно из tripleDESCryptoService Class от Microsoft (версия памяти, 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 (fromEncrypt, 0, fromEncrypt.Length); "и я не понимаю почему.Я не уверен, правильно ли он хранится в базе данных или мои преобразования неверны.

если это что-то значит, «Данные», поступающие в функцию дешифрования, имеют размер 16 и содержат ненулевые значения, но «byte [] fromEncrypt» - это массив размера 16, содержащий все нули.

спасибо за любую помощь!

Ответы [ 3 ]

3 голосов
/ 28 января 2011

РЕДАКТИРОВАТЬ: Хорошо, мы дошли до сути ... хотя проблема 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:)

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

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

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

0 голосов
/ 28 января 2011

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

0 голосов
/ 28 января 2011

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

...