Générer une chaîne de hachage MD5 avec T-SQL

Réponses:

66

Utiliser HashBytes

SELECT HashBytes('MD5', '[email protected]')

Cela vous donnera 0xF53BD08920E5D25809DF2563EF9C52B6

-

SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', '[email protected]'),2)

Cela vous donnera F53BD08920E5D25809DF2563EF9C52B6

SQLMenace
la source
1
@Brendan, vous avez laissé le ", 2)" à la fin.
Ryan Elkins
1
@RyanElkins J'obtiens le même résultat que Brendan, et je suis certainement inclus dans le ", 2)" :(
Matthew
20

Solution:

SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5','your text')),3,32)
Dellas
la source
16

Aucune des autres réponses n'a fonctionné pour moi. Notez que SQL Server donnera des résultats différents si vous transmettez une chaîne codée en dur au lieu de l'alimenter à partir d'une colonne de votre jeu de résultats. Voici la magie qui a fonctionné pour moi pour donner une correspondance parfaite entre SQL Server et MySql

select LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', CONVERT(varchar, EmailAddress)), 2)) from ...
jmacinnes
la source
1
L'utilisation LOWER()n'est nécessaire que si elle est sensible à la casse.
T.Coutlakis
La première conversion s'avère importante. Cela donne un MD5Hash identique à la MD5()fonction de Postgresql. Je me demandais pourquoi les MD5hashs diffèrent de Pythonet Postgresql. Merci pour la recette ..
Ben
14

Pour les données jusqu'à 8000 caractères, utilisez:

CONVERT(VARCHAR(32), HashBytes('MD5', '[email protected]'), 2)

Demo

Pour les données binaires (sans la limite de 8000 octets), utilisez:

CONVERT(VARCHAR(32), master.sys.fn_repl_hash_binary(@binary_data), 2)

Demo

slartidan
la source
4

essaye ça:

select SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',  '[email protected]' )),3,32) 
Dellasavia
la source
0
declare @hash nvarchar(50)
--declare @hash varchar(50)

set @hash = '1111111-2;20190110143334;001'  -- result a5cd84bfc56e245bbf81210f05b7f65f
declare @value varbinary(max);
set @value = convert(varbinary(max),@hash);


select  
 SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5', '1111111-2;20190110143334;001')),3,32) as 'OK'
,SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5', @hash)),3,32) as 'ERROR_01'
,SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',convert(varbinary(max),@hash))),3,32) as 'ERROR_02'
,SUBSTRING(sys.fn_sqlvarbasetostr(sys.fn_repl_hash_binary(convert(varbinary(max),@hash))),3,32)
,SUBSTRING(sys.fn_sqlvarbasetostr(master.sys.fn_repl_hash_binary(@value)),3,32)
fernando yevenes
la source
Solution ... déclare @hash varchar (50) md5.gromweb.com/?string=1111111-2%3B20190110143334%3B001
fernando yevenes
0
SELECT CONVERT(
      VARCHAR(32),
      HASHBYTES(
                   'MD5',
                   CAST(prescrip.IsExpressExamRX AS VARCHAR(250))
                   + CAST(prescrip.[Description] AS VARCHAR(250))
               ),
      2
  ) MD5_Value;

travaille pour moi.

Gita
la source
0

Vous n'avez pas dit explicitement que vous vouliez que la chaîne soit hexadécimale; si vous êtes ouvert au codage de chaîne de base 64 plus efficace en termes d'espace et que vous utilisez SQL Server 2016 ou version ultérieure, voici une alternative:

select SubString(h, 1, 32) from OpenJson(
    (select HashBytes('MD5', '[email protected]') h for json path)
) with (h nvarchar(max));

Cela produit:

9TvQiSDl0lgJ3yVj75xStg==
N8allan
la source