Michelle Anne Rigor Ответов: 2

Как преобразовать байт в читаемую строку в C#?


foreach (DataRow row in dt.Rows)
{
   username = row["USERNAME"].ToString();
   byte[] bytePassword = (byte[])row["PASSWORD"];
   decryptPassword = Encoding.Default.GetString(bytePassword, 0, bytePassword.Length-1);

   password = row["PASSWORD"].ToString();                    
}

string result = "This is my "+ username +" action..." + password + " : " + decryptPassword;
В результате получается
This is my TEST action...System.Byte[] : ‡½³wã.ç r…)©K‡n‰‚ò¹5y ÌE_0Ây™ âGâ)÷XXp@hdž‘,MÛÀy(ÓÊÕþB
Кажется, я не могу расшифровать пароль с помощью System.Text.Encoding

Мне нужно расшифровать пароль, а затем снова зашифровать его, чтобы он мог быть сохранен в базе данных.

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

stackoverflow.com
social.msdn.microsoft.com
stackoverflow.com

Gerry Schmitz

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

Michelle Anne Rigor

Как вы можете видеть в коде, когда я получаю пароль в БД, он отображается как System.byte[]. И существует серьезная проблема безопасности, когда пароль не зашифрован в БД.

2 Ответов

Рейтинг:
1

OriginalGriff

Что заставляет вас думать, что пароль зашифрован?
Этого не должно быть: это небезопасно, почти так же плохо, как хранить его в обычном тексте.
И System.Text.Encoding не имеет ничего общего с шифрованием - это перевод, вот и все.
Пароли должны быть хэшированы, а не зашифрованы - специально для того, чтобы они не могли быть "обращены" обратно к исходному входу.
Видеть здесь: Хранение паролей: как это сделать.[^]


Michelle Anne Rigor

Пароль зашифрован в SQL Server. Мне нужен был способ извлечь данные как есть и расшифровать их в коде C#.

OriginalGriff

Кто его зашифровал?

Dave Kreskowiak

Пароль никогда не должен быть зашифрован, только хэширован.

У вас есть байты из базы данных, но если вы не знаете, какие alogirthm(ы) использовались для шифрования паролей и любых ключей, участвующих в этом процессе, у вас нет никакой надежды на их расшифровку.

Использование шифратора не приведет к их магической расшифровке. Кодировка просто определяет, как байты интерпретируются для генерации строки из них.

OriginalGriff

Я подозреваю, что он хэширован: длина данных, которую он показывает, подозрительно близка к 512 битам, что может означать хэширование SHA512.
Почему я подозреваю здесь злой умысел? :смеяться:

Dave Kreskowiak

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

Michelle Anne Rigor

Именно здесь менеджер БД научился шифровать пароль: Как зашифровать Он сообщил мне, что использовал: Детерминистический

Dave Kreskowiak

Отличный. Только компонент database engine может расшифровать пароль, и это видео показывает вам, как именно это сделать, вы можете увидеть его в своем коде.

Michelle Anne Rigor

Я исследовал, что могу расшифровать пароль, но мне нужно получить хранилище сертификатов Windows из диспетчера БД, а затем установить этот сертификат на свою машину. Спасибо тебе за помощь, Тхо. :)

Dave Kreskowiak

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

Michelle Anne Rigor

Да, я действительно добавил "параметр шифрования столбца = включен" в строку подключения. Но я продолжаю получать эту ошибку после добавления ее в свой Web.config. Это ошибка: системе".Данных.Sqlclient как.Sqlexception в
HResult=0x80131904
Сообщение=не удалось расшифровать столбец "пароль".
Не удалось расшифровать ключ шифрования столбца с помощью поставщика хранилища ключей: 'MSSQL_CERTIFICATE_STORE'..."

Dave Kreskowiak

Теперь мы подходим к настоящей проблеме. Что говорится в остальной части сообщения об ошибке?

Michelle Anne Rigor

Это полное сообщение об ошибке:

Системы.Данных.Sqlclient как.Sqlexception в
HResult=0x80131904
Сообщение=не удалось расшифровать столбец "пароль".
Не удалось расшифровать ключ шифрования столбца с помощью поставщика хранилища ключей: 'MSSQL_CERTIFICATE_STORE'. Последние 10 байт ключа шифрования зашифрованного столбца: '13-83-2C-7F-9B-A6-B9-5F-77-FD'.
Сертификат с отпечатком большого пальца 'AD8B4BD5A471925308407A912D31E0FADFB8202E' не найден в хранилище сертификатов 'My' в папке сертификата 'CurrentUser'. Убедитесь, что путь сертификата в определении главного ключа столбца в базе данных правильный и сертификат был правильно импортирован в расположение/хранилище сертификатов.
Имя параметра: masterKeyPath
Source=.Net Поставщик Данных SqlClient
Трассировка стека:
<не удается оценить="" исключение="" стек="" трассировка=" " >

Внутреннее Исключение 1:
ArgumentException: сертификат с отпечатком большого пальца 'AD8B4BD5A471925308407A912D31E0FADFB8202E' не найден в хранилище сертификатов 'My' в местоположении сертификата 'CurrentUser'. Убедитесь, что путь сертификата в определении главного ключа столбца в базе данных правильный и сертификат был правильно импортирован в расположение/хранилище сертификатов.
Имя параметра: masterKeyPath

Dave Kreskowiak

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

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