2010-10-16 13 views
1

J'essaie d'écrire une procédure stockée qui va recevoir une chaîne, la hacher avec SHA1 et ensuite retourner le hachage. Je n'arrive pas à le faire renvoyer @hashedString. Je vais admettre que je suis un débutant avec T-SQL. Je suis en train d'écrire le T-SQL directement dans le DB.Procédure stockée qui ne renvoie pas la chaîne hachée

C'est ce que j'ai eu jusqu'à présent

 
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); 

Répondre

1

Votre instruction de sélection finale attribue la valeur plutôt que de la renvoyer. Vous pouvez soit émettre une autre instruction select sur la variable pertinente (code modifié inclus ci-dessous pour votre référence), soit incorporer des paramètres OUTPUT dans votre conception de procédure stockée, comme suggéré par 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 
3

HashBytes renvoie un résultat VARBINARY, par exemple. un tableau d'octets. Je vous suggère fortement de garder ce type, ne le convertissez pas en chaîne. Si vous devez le convertir, utilisez l'encodage Base64.

À l'heure actuelle, votre procédure convertit le hachage en chaîne Unicode, mais cela est incorrect car toutes les combinaisons d'octets ne sont pas valides dans Unicode et le hachage peut également affecter les caractères Unicode non valides.

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

Assurez-vous de conserver la valeur hachée comme BINARY (20) partout dans votre code, et l'utiliser comme byte[] dans votre client. Ne jamais convertir le hachage en une chaîne (ceci s'applique à toutes les langues et plates-formes).

+0

Merci pour le heads up. Je m'en souviendrai. – Phil

+0

Cette procédure stockée que vous avez fournie ne renvoie pas de valeur, du moins pas lorsque je l'exécute à partir de l'éditeur. Suis-je censé ajouter quelque chose? – Phil

+2

La procédure stockée ne renvoie pas les valeurs. Ils utilisent les paramètres 'OUTPUT', vous devez donc fournir un paramètre de sortie:' set @hash binary (20); exec dbo.ConvertToHash ('somestring', @hash SORTIE); sélectionnez @hash; ' –