Convertir des HashBytes en VarChar
-
08-06-2019 - |
Question
Je souhaite obtenir le hachage MD5 d'une valeur de chaîne dans SQL Server 2005.Je fais cela avec la commande suivante :
SELECT HashBytes('MD5', 'HelloWorld')
Cependant, cela renvoie une valeur VarBinary au lieu d'une valeur VarChar.Si j'essaie de convertir 0x68E109F0F40CA72A15E05CC22786F8E6
dans un VarChar je reçois há ðô§*à\Â'†øæ
au lieu de 68E109F0F40CA72A15E05CC22786F8E6
.
Existe-t-il une solution basée sur SQL ?
La solution
J'ai trouvé la solution ailleurs où :
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
Autres conseils
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
Utiliser master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)
au lieu de master.dbo.fn_varbintohexstr
et puis substringing
le résultat.
En fait fn_varbintohexstr
appels fn_varbintohexsubstring
intérieurement.Le premier argument de fn_varbintohexsubstring
lui dit d'ajouter 0xF
comme préfixe ou non. fn_varbintohexstr
appels fn_varbintohexsubstring
avec 1
comme premier argument en interne.
Parce que tu n'as pas besoin 0xF
, appel fn_varbintohexsubstring
directement.
Contrairement à ce que David Chevalier dit, ces deux alternatives renvoient la même réponse dans MS SQL 2008 :
SELECT CONVERT(VARCHAR(32),HashBytes('MD5', 'Hello World'),2)
SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('MD5', 'Hello World'), 1, 0))
Il semble donc que le premier soit un meilleur choix, à partir de la version 2008.
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)
(1 pour convertir l'hexadécimal en chaîne)
convertissez-le en inférieur et supprimez 0x du début de la chaîne par sous-chaîne :
substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)
exactement la même chose que ce que nous obtenons en C# après avoir converti les octets en chaîne
Avec une expérience personnelle de l'utilisation du code suivant dans une procédure stockée qui a haché une variable SP, je peux confirmer, bien que non documentée, que cette combinaison fonctionne à 100 % selon mon exemple :
@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
Changer le type de données en varbinary semble fonctionner le mieux pour moi.