Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2019, 19:34   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Ограничения для данных при кодировании в Base64

Здравствуйте.
На днях встал вопрос о хранении хешей паролей в базе. По определённым причинам было принято использовать SHA256.
После хеширования строка в чистом виде в любой кодировке нормально храниться в базе не может, получаются знаки вопроса.
Но, хеширование в SHA256 позволяет получать не строку, а массив байтов.
Код на C#:
Код:
System.Security.Cryptography.SHA256 hashFunc=System.Security.Cryptography.SHA256.Create();
byte[] passHash=hashFunc.ComputeHash(Encoding.Unicode.GetBytes(passwordStr)); // passwordStr приходит снаружи
Encoding.Unicode была выбрана как самая распространённая и обширная кодировка.
Дальнейшее преобразование массива passHash в обычную строку даёт эту самую строку в виде, не приспособленном для хранения в БД (MsSql, nvarchar все дела).
Я как человек неискушённый, тут же придумал следующий вариант для хранения:
Код:
string strPassHash=Convert.ToBase64String(passHash);
// а потом эту строку в БД
Но, мне сказали что Base64 "имеет какие-то ограничения по данным", и сказали обработать массив следующим образом:
Код:
private string sha256(string randomString) // код взят с какого-то сайта
{
    var crypt = new System.Security.Cryptography.SHA256Managed();
    var hash = new System.Text.StringBuilder();
    byte[] crypto = crypt.ComputeHash(Encoding.UTF8.GetBytes(randomString));
    foreach (byte theByte in crypto)
    {
        hash.Append(theByte.ToString("x2"));
    }
    return hash.ToString();
}
Но, что-то мне подсказывает, что преобразование theByte.ToString("x2") либо вообще не отвечает пониманию кодирования, либо имеет больше ограничений на данные, чем Base64.

Собственно, сюда я пришёл спросить ...
Какие такие ограничения у Base64 при том, что кодирую я массив байтов, а не строку ?
И что даст второй вариант того, что кодированием можно назвать только условно ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 06.02.2019, 19:54   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

преобразуй хеш в hex и храни в char(64). Кстати в сиквеле и функция есть для получения хеша, с 2012-го кажись
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.02.2019 в 19:57.
Аватар вне форума Ответить с цитированием
Старый 06.02.2019, 19:57   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
преобразуй хеш в hex и храни в char(64)
В смысле обойти байты с преобразованием каждого в HEX, и склеить в строку ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 06.02.2019, 20:04   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Хоть так или какая уже готовая есть функция для этого.

ЗЫ для базе64 нет ни каких ограничений на входные двоичные данные
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.02.2019, 09:18   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

По поводу хранения хеша-а в строковом поле таблицы сиквела. Спокойно храню двоичные данные в char или varchar в базе с кодировкой 1251. При отображении естественно фигвам, а зачем их отображать? В юникодной базе не знаю, возможно так и не получится
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
хочу сделать так чтоб ограничения у всех были,а вот на определенном логине ибо id не было ограничения опыта martin123 PHP 2 31.03.2017 16:31
Как сделать проверку в реализации алгоритма Хаффмана - при кодировании строки "kkkkkkk" выдавать ошибку о том, что дерево не может быть создано Smile189 Паскаль, Turbo Pascal, PascalABC.NET 7 17.11.2016 22:25
Ограничения на ввод-вывод данных Olga Sharik Помощь студентам 0 02.05.2012 11:49
Вопрос о кодировании PetrowD Общие вопросы Delphi 9 21.02.2012 19:13
Соглашение о кодировании .NET SunKnight Общие вопросы .NET 3 08.11.2009 19:01