2013-12-10 3 views
0

Я использую эту хранимую процедуру для хэша и записываю пароль в таблицу SQL Server.Запись значений VARBINARY в столбец NVARCHAR в SQL Server 2008

DECLARE @PassWord as nvarchar(2000) = 'PSW' 
... 

DECLARE @MD5Password nvarchar(2000); 
SELECT @MD5Password = CONVERT(nvarchar(2000),@Password); 
SELECT HASHBYTES('MD5', @MD5Password); 
SET @MD5Password = HASHBYTES('MD5', @MD5Password) 

INSERT INTO [MyDataBase].[MyDatatable] (Column1) 
VALUES (@MD5Password) 

Тип Column1 является nvarchar(2000).

Когда я использую этот код для написания пароля в MyDatatable, результат не тот, который я ожидал, он написан как китайские иероглифы.

Я знаю, что это потому, что преобразование из varbinary (типа @MD5Password) для nvarchar, но я не знаю, как я должен сделать, чтобы написать хорошие значения в Mydatatable?

Вы можете помочь с этим!

+3

Могу ли я спросить, почему вы не делаете колонку varbinary? –

+0

Hi, @Aaron. Потому что столбец был создан другим софт, которому нужен nvarchar для этого столбца. – Chalumeau

+1

Ну, другое программное обеспечение не должно читать пароль, не обращая внимания на его преобразование в обычный текст, прежде чем делать это. Какой смысл хешировать его, если вы собираетесь конвертировать его в строку и передать ее в приложение? Приложение должно взять пароль, предоставленный пользователем, хэш, и сравнить его с хешированным паролем, который вы сохранили. После того, как он будет сохранен, не должно быть абсолютно никакой причины, по которой кто-либо должен был преобразовать его обратно в обычный текст. То, что вы пытаетесь сделать, звучит как очередной фиаско Adobe, ожидающее своего появления. –

ответ

1

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

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

In SQL Server 2005 and onward, you can use xquery to accomplish this:

DECLARE @Password NVARCHAR(20) = 'PSW' 

DECLARE @Hash VARBINARY(16) 
DECLARE @HashString VARCHAR(34) 

SET @Hash = HASHBYTES('MD5', @Password); 
SET @HashString = '0x' + CAST('' AS XML).value('xs:hexBinary(sql:variable("@Hash"))', 'VARCHAR(32)'); 

SELECT @Hash 
SELECT @HashString 

До SQL Server 2005, вы должны полагаться на недокументированные системные хранимые процедуры, но это не рекомендуется, как Paul White describes in this answer.

+0

Спасибо @MichealFredrickson. Фактически я заблокирован в конкретной реализации безопасности. Благодарим вас за понимание и ваш ответ. Это работа, как я ожидал. – Chalumeau

0

Как указано в документации, хэш-элементы возвращают двоичное значение. Почему не ваша varbinary столбца? И позвольте мне спросить, почему вы все равно хотите прочитать хешированный пароль?

Если вам нужно это таким образом просто использовать CAST

DECLARE @Valor VARBINARY(20) 
SET @Valor = CAST('1235667' AS VARBINARY(20)) 
SELECT @Valor, CAST(@Valor AS VARCHAR(20)) 
+0

Я знаю, что HASHBYTES возвращает значение varbinary. Я объясняю в своем последнем комментарии, почему я могу изменить тип столбца. Я хочу, чтобы читаемый хешированный пароль для другого soft мог читать значение столбца. – Chalumeau

+0

Я начал писать до того, как появятся комментарии и отредактирован ответ после него. – jean

+0

Это не будет работать при использовании вывода из 'HASHBYTES'. Он не преобразуется в желаемую шестнадцатеричную строку и вместо этого возвращает 'îuzR^Qû} HP =

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