Хранимая процедура, которая (не) возвращает хешированную строку - PullRequest
1 голос
/ 16 октября 2010

Я пытаюсь написать хранимую процедуру, которая получит строку, хеширует ее с помощью SHA1, а затем возвращает хеш.Я не могу заставить его вернуться @hashedString.Я признаю, что я полностью новичок в T-SQL.

Я пишу T-SQL прямо в БД.

Это то, что я получил до сих пор:

ALTER PROCEDURE dbo.ConvertToHash

 (
 @stringToHash nvarchar(256),
 @hashedString nvarchar(256) OUTPUT
 )

AS
 DECLARE @HashThis nvarchar(256);
 SELECT @HashThis = CONVERT(nvarchar(256), @stringToHash);
 SELECT @hashedString = HashBytes('SHA1', @HashThis);

Ответы [ 2 ]

3 голосов
/ 16 октября 2010

HashBytes возвращает VARBINARY результат, т.е.байтовый массив.Я настоятельно рекомендую вам сохранить этот тип, не конвертируйте его в строку.Если вам необходимо преобразовать его, используйте кодировку Base64.

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

ALTER PROCEDURE dbo.ConvertToHash
 (
 @stringToHash nvarchar(256),
 @hashedString binary(20) OUTPUT
 )
AS
 SET @hashedString = HashBytes('SHA1', @stringToHash);

Убедитесь, что вы сохранили хешированное значение как BINARY (20) везде в своем коде и используйте его как byte[] в своем клиенте.Никогда не конвертируйте хеш в строку (это относится ко всем языкам и платформам).

1 голос
/ 16 октября 2010

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

ALTER PROCEDURE dbo.ConvertToHash

 (
 @stringToHash nvarchar(256),
 @hashedString nvarchar(256) OUTPUT
 )

AS
 DECLARE @HashThis nvarchar(256);
 SELECT @HashThis = CONVERT(nvarchar(256), @stringToHash);
 SELECT @hashedString = HashBytes('SHA1', @HashThis);
 SELECT @hashedString 
...