Я выполняю некоторые задачи шифрования на 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();
Если вам нужна дополнительная информация, дайте мне знать. Я просто не хочу слишком много говорить о моем точном алгоритме или его результатах.
спасибо.
Вы преобразовываете его в 'hex' или' base64' после хэша? –
Encoding.Default.GetString Is * not * как вы представляете произвольные байты в виде строки. Вам нужно использовать base-n, например hex (base-16) или base-64. Или лучше: сохраните его в столбце varbinary. BTW, хеширование! = Шифрование –
Oh и ASCIIEncoding.Default на самом деле не ASCII; это на самом деле статический Encoding.Default - кодовая страница ansi по умолчанию локальной системы. Но это не имеет значения, потому что вы не можете использовать ** любую ** Кодировку, чтобы делать то, что вы хотите здесь. –