Member 12986391 Ответов: 2

При прохождении Апострофа в названии компании "компания" выдает ошибку


Ошибка
Invalid length for a Base-64 char array or string.



public  string Decrypt(string dataToDecrypt)
       {

           byte[] data = Convert.FromBase64String(dataToDecrypt.Replace(' ', '+'));
           string decryptedData = string.Empty;

           try
           {
               //ReDim Preserve data(DataLen - 1)

               // The key and initialization vector : change them for your application
               byte[] _key = {
           132,
           42,
           53,
           124,
           75,
           56,
           87,
           38,
           9,
           10,
           161,
           132,
           183,
           91,
           105,
           16,
           117,
           218,
           149,
           230,
           221,
           212,
           235,
           64
       };
               byte[] _iv = {
           83,
           71,
           26,
           58,
           54,
           35,
           22,
           11,
           83,
           71,
           26,
           58,
           54,
           35,
           22,
           11
       };

               MemoryStream mStream = new MemoryStream(data, 0, data.Length);
               // instead of writing the decrypted text

               RijndaelManaged aes = new RijndaelManaged();

               CryptoStream cs = new CryptoStream(mStream, aes.CreateDecryptor(_key, _iv), CryptoStreamMode.Read);

               StreamReader sr = new StreamReader(cs);
               ASCIIEncoding ut = new ASCIIEncoding();
               string ab = sr.ReadToEnd();
               //UTF8Encoding
               decryptedData = ab;
               return ab;
           }
           catch (Exception ex)
           {
               throw ex;
           }
       }


Что я уже пробовал:

byte[] data = Convert.FromBase64String(dataToDecrypt);

2 Ответов

Рейтинг:
2

OriginalGriff

Здесь куча проблем:
1) Base64-это не метод шифрования , а метод перевода. Думая о нем (и ссылаясь на него) как о "шифровании", вы поощряете очень, очень ложное чувство безопасности, поскольку он может быть взломан обычным человеком за считанные секунды. Строки Base64 очень узнаваемы и легко реверсируются. Не используйте его для шифрования!
2) Апостроф не имеет ничего общего с сообщением об ошибке, которое вы показываете. Сообщение об ошибке подразумевает, что данные неверны, а не то, что Апостроф в названии компании является причиной.

Но ... эти два подразумевают гораздо худшее: для Апострофа, чтобы дать вам проблемы с вставкой данных в SQL, подразумевается, что вы объединяете строки для формирования команды SQL; что-то вроде этого:

string sql = "INSERT INTO MyTable (CompanyName) VALUES ('" + txtCompName.Text + "')";
Это плохо, очень, очень плохо. Это оставляет ваш код широко открытым для SQL-инъекций, а также вызывает проблемы с апострофами, и, вероятно, именно поэтому вы пытаетесь использовать Base64, чтобы обойти его и заставить работать. Вы всегда должны использовать параметризованные запросы для доступа к SQL, а не конкатенацию строк.
И использование конкатенации строк, вероятно, объясняет, почему ваши данные Base64 имеют неправильную длину - теперь вы делаете что-то вроде этого:
byte[] myDataInBase64 = ...
...
string sql = "INSERT INTO MyTable (CompanyName) VALUES ('" + myDataInBase64 + "')";
И это тоже не сработает, потому что реализация ToString по умолчанию для массива возвращает имя типа данных массива (например, "System.Byte []") вместо всего, что связано с его содержимым.

Опять же, исправление заключается в том, чтобы всегда использовать параметризованные запросы.


Рейтинг:
1

Patrice T

Цитата:
Недопустимая длина для массива символов Base-64 или строки.

Каждая длина строки в кодировке base64 кратна 4, потому что каждый фрагмент из 3 символов в строке кодируется до 4 символов base64, и если последний фрагмент короче, он дополняется до тех пор, пока длина не будет равна 3.
Base64-Википедия[^]
Показать содержание dataToDecrypt за дальнейшую помощь.

Цитата:
При прохождении Апострофа в названии компании "компания" выдает ошибку

Для решения проблемы Апострофа с SQL-запросом выполните следующее:
Никогда не создавайте SQL-запрос путем конкатенации с пользовательскими вводами, он называется "SQL-инъекция", он опасен для вашей базы данных и подвержен ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользовательский ввод типа "Брайан О'Коннер" может привести к сбою вашего приложения, то это уязвимость SQL-инъекции.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]