Encriptar cadenas utilizando MD5, SHA o SHA1 en SQL Server

SQL Server encrypt
SQL Server encrypt

Nunca he sido muy amigo del motor de base de datos de microsoft.. MS SQL Server no es mi opción a elegir, pero la mayoría de las veces que trabajamos con la plataforma de .NET es casi un requisito forzoso tener que utilizarlo.

En este artículo escribiré un poco sobre como utilizar los métodos para encriptar cadenas utilizando MD5, SHA o SHA1 .. la verdad es que comparado con los otros motores de BD que conozco.. MS SQL Server es uno de los más feos para aplicar.. pero igualmente funcional.

Entonces el ejemplo para complementar de lo que hablo, va de la siguiente manera:

SELECT HashBytes('MD5','qbit.com.mx')
SELECT HashBytes('SHA','qbit.com.mx')
SELECT HashBytes('SHA1','qbit.com.mx')

Ahora, el problema común de utilizar este método es que retorna un tipo de dato VarBinary en lugar de VarChar por lo que para obtener la cadena correcta se necesita hacer una substracción de la parte que nos interesa.. y ello implica utilizar la función SUBSTRING…

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'qbit.com.mx'), 3, 32) AS MD5
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA', 'qbit.com.mx'), 3, 40) AS SHA
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA1', 'qbit.com.mx'), 3, 40) AS SHA1

Como verán si utilizo solamente la conversión SUBSTRING(HashBytes(‘MD5′,’qbit.com.mx’), 3,32) no extrae la cadena necesaria de forma correcta.. y es por esa razón que se necesita utilizar master.dbo.fn_varbintohexstr() .. para mi inquietud la función varbintohexstr no esta documentada así es que no estoy seguro del porque usarla 🙁

Estas funciones las he probado en el motor 9 de SQL Server .. en un par de días más lo estaré probando con versiones recientes y actualizaré este artículo..

Co-fundador de Qbit Mexhico, usuario de linux, Developer en tecnologías web.. Nicaragüense, centro en basketball, primer centro en rugby y pintor los fines de semana. Ortögrafo y ambientalista psicológico (de escritorio).. ese soy yo!

Si te ha servido compártelo y difunde nuestro blog..

Twitter LinkedIn Flickr YouTube 

9 thoughts on “Encriptar cadenas utilizando MD5, SHA o SHA1 en SQL Server

  1. SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes(‘MD5’, ‘qbit.com.mx’)), 3, 32) AS MD5

    fue adrede solo para probar que revisen el código.. gracias!!

    “fue adrede solo para probar que revisen el código.. gracias!!” jajaja que mamón!

    Y bn mamo 😛

  2. — The MD2, MD4, MD5, SHA, and SHA1 algorithms are not available under compatibility level 130 and above. Use SHA2_256 or SHA2_512 instead.
    — If you want a quoted string to be NVARCHAR (treated as Unicode), you need to prefix it with N

    declare @hash nvarchar(MAX)
    set @hash = ‘123456’

    SET @hash = ‘password5baa61e4c9b93f3f0682250b6’

    SELECT HASHBYTES(‘SHA1′, N’password5baa61e4c9b93f3f0682250b6’) AS NVARCHAR_INPUT,
    HASHBYTES(‘SHA1’, @hash) AS VARIABLE_INPUT

    –**************************************************************************

    SELECT HASHBYTES(‘MD5’, @hash ) as ‘MD5’
    , HASHBYTES(‘SHA1’, @hash ) as ‘SHA1’
    , HASHBYTES(‘SHA2_256 ‘, @hash ) as ‘SHA256 ‘
    , HASHBYTES(‘SHA2_512 ‘, @hash ) as ‘SHA512 ‘
    , HASHBYTES(‘MD4’, @hash ) as ‘MD4’

    SELECT lower(convert(varchar(200), HASHBYTES(‘MD5’, @hash ),1)) as ‘MD5’
    , lower(convert(varchar(200),HASHBYTES(‘SHA1’, @hash ),1)) as ‘SHA1’
    , lower(convert(varchar(200),HASHBYTES(‘SHA2_256 ‘, @hash ),1)) as ‘SHA256’
    , lower(convert(varchar(200),HASHBYTES(‘SHA2_512 ‘, @hash ),1)) as ‘SHA512’
    , lower(convert(varchar(200),HASHBYTES(‘MD4 ‘, @hash ),1)) as ‘MD4’

  3. Aquí voy hacer una aclaratoria, el MD5, SHA1, SHA256 no son métodos de encriptación, son métodos de reducción criptográfico, es decir, es como sería su huella dactilar en el mundo informático. Un archivo por ejemplo TRABAJO.DOC tiene una huella dactilar única en China, Pekín o en Marte si gustan y OJO no es por el nombre del archivo es el contenido que lo hace único. Para ENCRIPTAR o CIFRAR datos en SQL Server se usa EncryptByPassPhrase(‘clave’, ‘datos’) prueben y revisen. Cabe destacar que el resultado enviado por MD5, SHA1, SHA256 son llamados HASH. Saludos.
    PD:
    Tómese este comentario crítica CONSTRUCTIVA. No DESTRUCTIVA.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *