decrypt - sql server reverse md5 hash
Convierta HashBytes a VarChar (7)
Quiero obtener el hash MD5 de un valor de cadena en SQL Server 2005. Lo hago con el siguiente comando:
SELECT HashBytes(''MD5'', ''HelloWorld'')
Sin embargo, esto devuelve un VarBinary en lugar de un valor VarChar. Si intento convertir 0x68E109F0F40CA72A15E05CC22786F8E6
en VarChar, obtengo há ðô§*à/Â''†øæ
lugar de 68E109F0F40CA72A15E05CC22786F8E6
.
¿Hay alguna solución basada en SQL?
Al contrario de lo que dice David Knight , estas dos alternativas devuelven la misma respuesta en 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))
Por lo tanto, parece que la primera es una mejor opción, a partir de la versión 2008.
Cambiar el tipo de datos a varbinary parece funcionar mejor para mí.
Con la experiencia personal de usar el siguiente código dentro de un Procedimiento almacenado que tiene una variable SP hasheada, puedo confirmar, aunque no documentado, que esta combinación funciona al 100% según mi ejemplo:
@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes(''SHA2_512'', @SPvar)), 3, 128)
Encontré la solución en otro lugar donde:
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes(''MD5'', ''HelloWorld'')), 3, 32)
Utilice master.dbo.fn_varbintohexsubstring(0, HashBytes(''SHA1'', @input), 1, 0)
lugar de master.dbo.fn_varbintohexstr
y luego substringing
el resultado.
De hecho, fn_varbintohexstr
llama fn_varbintohexsubstring
internamente. El primer argumento de fn_varbintohexsubstring
le dice que agregue 0xF
como el prefijo o no. fn_varbintohexstr
llama a fn_varbintohexsubstring
con 1
como primer argumento internaly.
Como no necesita 0xF
, llame fn_varbintohexsubstring
directamente.
SELECT CONVERT(NVARCHAR(32),HashBytes(''MD5'', ''Hello World''),2)
convert(varchar(34), HASHBYTES(''MD5'',''Hello World''),1)
(1 para convertir hexadecimal a cadena)
conviértalo a más bajo y elimine 0x del comienzo de la cadena por subcadena:
substring(lower(convert(varchar(34), HASHBYTES(''MD5'',''Hello World''),1)),3,32)
exactamente lo mismo que lo que obtenemos en C # después de convertir bytes en cadena