Ir al contenido principal

[SQL] - Encriptar y desencriptar contraseñas

Hay veces que nos complicamos la vida de una forma complicada e intentamos volver a inventar la pólvora, la rueda y todo a la vez.

La encriptación de contraseñas es una de esas cosas que la complicamos. Podemos usar las funciones que tiene SQL Server 2008 y posterior.



Para este ejemplo, vamos a usar las funciones ENCRYPTBYPASSPHRASE y DECRYPTBYPASSPHRASE. Para ello vamos a necesitar una palabra clave que es la que vamos a usar como patrón. Veamos como se las gasta esta función.

SELECT ENCRYPTBYPASSPHRASE('KurroSoftware','MyPassword')

Esta función esta usando la palabra KurroSoftware para su algoritmo de encriptación. El resultado es el siguiente:

0x01000000B8C73A18B8157E470A120864E04D58B8BB12C1E38B2C3BF36A5768883925821C64120CC0E5309A39

Esta claro, no?

Pues usando lo mismo pero en sentido contrario es como funciona la función DECRYPTBYPASSPHRASE, es decir, usa la palabra clave y el valor binario:

DECLARE @Var AS VARBINARY(8000)
SET @Var = 0x01000000B8C73A18B8157E470A120864E04D58B8BB12C1E38B2C3BF36A5768883925821C64120CC0E5309A39
SELECT CAST(DECRYPTBYPASSPHRASE('KurroSoftware',@Var) AS VARCHAR(MAX))


Esto nos devuelve, la clave desencriptada.
MyPassword

Pues ahora a jugar con estas funciones. Yo propongo las siguientes funciones de usuario.

CREATE FUNCTION [dbo].[fn_EncryptPassword(@Password AS VARCHAR(100))]
RETURNS VARBINARY(8000)
AS
BEGIN
    DECLARE @Encrypted AS VARBINARY(8000)
   
    SET @Encrypted = ENCRYPTBYPASSPHRASE('KurroSoftware',@Password)
   
    RETURN @Encrypted
END

CREATE FUNCTION [dbo].[fn_DecryptPassword(@Password AS VARBINARY(8000))]
RETURNS NVARCHAR(100)
AS
BEGIN
    DECLARE @Decrypted VARCHAR(100)

    SET @Decrypted = DECRYPTBYPASSPHRASE('KurroSoftware',@Password)
   
    RETURN @Decrypted
END


Si quieres mas información sobre estas dos funciones, usa los siguientes enlaces:
ENCRYPTBYPASSPHRASE - http://technet.microsoft.com/en-us/library/ms190357.aspx
DECRYPTBYPASSPHRASE - http://technet.microsoft.com/en-us/library/ms188910.aspx

Comentarios

  1. A muy Bueno eh!
    !me sirvio de MUcho Gracias !!

    ResponderEliminar
  2. Hice el ejercicio y me salió 慐獳潷摲㄰ en el decripted

    ResponderEliminar
    Respuestas
    1. Comprueba lo siguiente:
      Estas en la base de datos MASTER (ejecuta USE MASTER para estar seguro)
      El contenido de la variable @Var NO HA DE ESTAR ENTECOMILLADO, es un valor binario, no varchar.

      Eliminar
    2. hola, tengo un archivo inscriptado, tu me podrias ayudar?

      Eliminar
  3. A mi también 摡業⹮潲瑯, o parecido :v

    ResponderEliminar
    Respuestas
    1. Acabo de probarlo usando MS SQL Server 2008 R2 y la respuesta ha sido correcta.
      Comprueba lo siguiente:
      Estas en la base de datos MASTER (ejecuta USE MASTER para estar seguro)
      El contenido de la variable @Var NO HA DE ESTAR ENTECOMILLADO, es un valor binario, no varchar.
      Si sigue dando problemas, comentamos mas detalles.

      Eliminar
  4. Hola. Este ejemplo me funciona bien, pero cuando cambio el texto me sale lo mismo que a los demas "慍牵䕯敺畱敩l". Estoy usando Sql 2012 Express. Alguna solucion? Sigue funcionando igual en versiones mayores a 2008 R2? Gracias. Saludos

    ResponderEliminar
    Respuestas
    1. en vez de poner NVARCHAR(MAX) se debe poner VARCHAR(MAX) y se arregla

      Eliminar
    2. Gracias por la observación. Ya he corregido la entrada.

      Eliminar
  5. que tal, no puedo desencriptar un campo en sql, dicho campo no esta en varbinary,me pueden aydar???

    ResponderEliminar
  6. hola, estoy tratando de desencriptar por ejemplo este valor: 0x98042C22B4C190B41916A9278C3CB6740AFFF2BA98DB7D0016C8D7E87FA1318C

    y no tengo resultados, lo estoy haciendo de la siguiente forma:

    DECLARE @Var AS VARBINARY(8000)
    SET @Var = 0x98042C22B4C190B41916A9278C3CB6740AFFF2BA98DB7D0016C8D7E87FA1318C
    SELECT CAST(DECRYPTBYPASSPHRASE('TEst',@Var) AS VARCHAR(MAX))

    ResponderEliminar
  7. buenas este proceso se puede hacer en Sql server 2014

    ResponderEliminar
  8. buenas este proceso se puede hacer en Sql server 2014

    ResponderEliminar
  9. me ayudan estoy usando sql dumper (credit_card_num,char (32)),0x217e21) esta es la inscriptacion ayuda

    ResponderEliminar

Publicar un comentario

Si quieres comentar, criticar, aportar mas informacion o simplemente felicitar, inserta tu comentario a continuacion. Entre todos podemos hacer cosas grandes.

Entradas populares de este blog

[PB] - Convertir Numero en Letra

¿Alguna vez has necesitado crear un proceso que tenga que traducir números a letras? Por ejemplo, para un proceso de emisión de cheques. Pues esta es la rutina que necesitas En este caso, vamos a desarrollar un traductor en dos idiomas, es castellano y en catalán. Para ello vamos a usar la función GlobalReplace que viene con las PFC's, pero si no las usas, no importa porque la he extraído para este ejemplo. 1- Creamos un objeto de usuario no visual autoinstanciable, por ejemplo lo llamamos ncst_num2txt 2- Definimos las siguientes variables de instancia private String is_cifra[],is_centenas[] 3- Creamos las funciones de of_GloblalReplace y otra para sobrecargar por defecto la opción de IgnoreCase (Esto lo puedes encontrar en la PFCs) public function string of_GlobalReplace (string as_Source, string as_Old, string as_New, boolean ab_IgnoreCase); ////////////////////////////////////////////////////////////////////////////// // // Function:   of_GlobalRe...

[.NET] Convertir Latitud y Longitud en Grados - Minutos y segundos

Hola a todos. Esta es una función para convertir un número de posición geográfica en grados, minutos y segundos. Como algunos pocos recordarán,una posición geográfica esta definida por latitud (Norte / Sur) y longitud (Este / Oeste) teniendo como referencia para la longitud el meridiano de Greenwich (Meridiano 0) y para la latitud la linea del Ecuador (Paralelo 0). Por lo que siempre hablaremos de posición " Grados Norte ", o " Grados Este ". Ahora es cuando entra en juego las matemáticas y la trigonometría (he de admitir que me encantan :D ). El hemisferio norte o sur solo tendría 90° Norte o Sur. Por ejemplo, El polo norte está a 90° 0' 0'' N de latitud. La longitud podríamos considerar el 0° 0' 0'' (estamos en el polo norte, por lo que es un solo punto, no hay longitud). En cambio, si nos movemos alrededor de la tierra por la linea de Ecuador, la latitud será 0° 0' 0'' (ni al norte, ni al sur) pero de Este a Oeste nos m...