2013-08-16 2 views
1

Я выполняю некоторые задачи шифрования на C# и сталкивался с проблемой, которую я не могу понять. Иногда я получаю очень сложные соленые строки хэша для паролей пользователей, и по какой-то причине эти строки не сохраняются в базе данных правильно.Зашифрованная строка не сохраняется в базе данных правильно

Я использую 8-байтовую соль, случайно генерируемую из класса RNGCryptoServiceProvider. Я использую класс SHA256Managed как мой HashAlgorithm. Я получаю строку для хранения из байтов, созданных с помощью метода ASCIIEncoding.Default.GetString(). Столбец, в котором хранятся эти значения, имеет тип (NVARCHAR(50), NULL). Я храню их, используя класс SqlCommand.

Я вижу точную строку штрафа при переходе через мой код и использовании непосредственного окна. Похоже, проблема возникает, когда я звоню cmd.ExecuteNonQuery(). Должен ли я делать это иначе, чем ниже?

string query = @"UPDATE User SET password = @password WHERE id = @userID"; 

cmd = new SqlCommand(query, conn); 
cmd.Parameters.AddWithValue("@password", encryptedPassword); 
cmd.Parameters.AddWithValue("@userID", userID); 

int rowsAffected = cmd.ExecuteNonQuery(); 

Если вам нужна дополнительная информация, дайте мне знать. Я просто не хочу слишком много говорить о моем точном алгоритме или его результатах.

спасибо.

+1

Вы преобразовываете его в 'hex' или' base64' после хэша? –

+1

Encoding.Default.GetString Is * not * как вы представляете произвольные байты в виде строки. Вам нужно использовать base-n, например hex (base-16) или base-64. Или лучше: сохраните его в столбце varbinary. BTW, хеширование! = Шифрование –

+1

Oh и ASCIIEncoding.Default на самом деле не ASCII; это на самом деле статический Encoding.Default - кодовая страница ansi по умолчанию локальной системы. Но это не имеет значения, потому что вы не можете использовать ** любую ** Кодировку, чтобы делать то, что вы хотите здесь. –

ответ

2

Попробуйте использовать Convert.ToBase64String() вместо этого для кодирования массива байтов в строку. Это должно решить вашу проблему.

+0

Woah! Благодаря! Это сделал трюк! Как это отличается от ASCIIEncoding.Default.GetString()? Это сработало, я просто не знаю, почему. – aladd04

+1

@ aladd04, потому что вы используете кодировку в неправильном направлении: см. Http://tiny.cc/io, где я обсуждаю эту (и другие темы) –

+0

Что вы подразумеваете под «кодировкой в ​​неправильном направлении»? Я проверю эту статью ... может быть, ответ есть там :) ха-ха. – aladd04

Смежные вопросы