Está en la página 1de 3

ENCRIPTACIÓN POR FRASE

Si bien el almacenamiento de contraseñas en una base de datos puede ser una


práctica común, almacenarlas adecuadamente no suele ser tan común. Cuando
almacena una contraseña en una base de datos, básicamente tiene 3 opciones de
cómo va a hacerlo. Puede guardar la contraseña como:
Texto claro no encriptado que puede ser visto por cualquier persona con acceso de
lectura a la tabla
Texto encriptado que debe ser descifrado
Texto fuertemente encriptado que nunca necesitará ser descifrado
Establecimos que almacenar contraseñas como una cadena de texto claro no
encriptada es una idea muy, muy, muy mala.
Cifrado de texto que debe ser descifrado
En casos como este, ENCRYPTBYPASSPHRASE (disponible en SQL Server 2008 en
adelante) ofrece una de las maneras más simples para cifrar sus contraseñas de una
manera que también se puede descifrar (utilizando DECRYPTBYPASSPHRASE ).
En lo básico, ENCRYPTBYPASSPHRASE requiere dos argumentos obligatorios: una
frase de contraseña utilizada para generar la clave de cifrado y el texto que se va a
cifrar. Observe que especifica una frase de paso, no una palabra de paso. Como se
describe en la documentación ENCRYPTBYPASSPHRASE: Una frase de contraseña
es una contraseña que incluye espacios. La ventaja de utilizar una frase de contraseña
es que es más fácil recordar una frase o frase significativa que recordar una cadena de
caracteres comparativamente larga.
Muchas personas no se dan cuenta de que puede usar un espacio como un carácter
especial legítimo en la mayoría de las contraseñas. Al hacer esto, puede generar una
frase de contraseña mucho más segura en lugar de una sola palabra. Entonces, un
ejemplo de una frase de contraseña puede ser algo como "Mi perro tiene pulgas", o
"Me encantaría un helado", aunque su frase de contraseña realmente necesita ser
algo un poco más aleatoria). Para que quede claro, no se necesita espacio en su frase
de contraseña para ENCRYPTBYPASSPHRASE. Si desea utilizar un GUID para su
frase de contraseña, o una secuencia aleatoria como "RZgt9 $ ExYunZO8Zf% s8hxKV
@ lHPxz85CJ", podría hacerlo.
Para los ejemplos, voy a usar una frase de contraseña. "¡No voy a decirle cuál es mi
contraseña!". Esa es la frase de contraseña que usaremos.
Usando ENCRYPTBYPASSPHRASE
La sintaxis básica es:
ENCRYPTBYPASSPHRASE ('contraseña de cifrado', 'texto para encriptar')
Para este ejemplo simple solo estamos usando los dos argumentos obligatorios.
Para ver el valor cifrado de la contraseña "ABC123":
Esa instrucción SELECT devolverá un valor VARBINARIO tal
como: 0x0100000093EEC20B790EF208B1FB631F0AB3028E3A8C196643C4BD5785
28A0DFAE7AB45B
Es importante tener en cuenta que el valor VARBINARIO devuelto por
ENCRYPTBYPASSPHRASE no es determinista , lo que significa que incluso con la
misma entrada no generará el mismo resultado cada vez. Entonces puede ejecutar
exactamente la misma instrucción SELECT 3 veces, y obtener 3 resultados diferentes.

Afortunadamente, esta salida no influye en el uso de la función


DECRYPTBYPASSPHRASE. Siempre que tenga la frase de contraseña correcta,
DECRYPTBYPASSPHRASE descifrará con éxito cualquiera de esos resultados
VARBINARY en su valor original.
Almacenar un valor encriptado en una tabla
Ahora que sabemos cómo encriptar una cadena de contraseña, echemos un vistazo a
cómo almacenar ese valor encriptado en una tabla. Como el valor devuelto por
ENCRYPTBYPASSPHRASE es un tipo de datos VARBINARIO, así es como
queremos almacenarlo, ya que este también es el tipo de datos requerido por
DECRYPTBYPASSPHRASE.
Lo primero que debemos hacer es determinar el tamaño de nuestra columna de
contraseña cifrada. Los valores VARBINARIOS devueltos por
ENCRYPTBYPASSPHRASE pueden variar en tamaño, con un tamaño máximo de
8,000 bytes. El tamaño del valor devuelto dependerá del tamaño de la contraseña real
que se cifra. Por ejemplo, si comprobamos el DATALENGTH de nuestra declaración
SELECT anterior, veremos que la contraseña de 'ABC123' tiene una longitud de 36.
Sin embargo, si cambiamos la contraseña a 'ABC123456', el tamaño de nuestro valor
devuelto es 44. Y, con una contraseña de 'supercalifragilisticexpialidocious' (¡podría
suceder!) Obtenemos un tamaño de 92.
Como ya sabemos que nuestro valor de prueba tiene una longitud de 36, este es el
valor que voy a usar, porque realmente no quiero usar VARBINARY (8000) si no es
necesario. Si sabe cuál es la longitud máxima permitida de las contraseñas de sus
usuarios (¡y debería hacerlo!), Puede usar la respuesta en esta publicación DBA
StackExchange para calcular el tamaño de su salida ENCRYPTBYPASSPHRASE y
establecer el tamaño de columna de la tabla de contraseñas.
Aquí hay un ejemplo simple de almacenar nuestra contraseña encriptada:

Usando DECRYPTBYPASSPHRASE
Ahora que tenemos nuestra contraseña encriptada, necesitamos poder descifrarla
también. Esto se hace fácilmente mediante el uso de la función
DECRYPTBYPASSPHRASE con la misma frase de contraseña con la que ciframos
nuestra contraseña.

Y verá que obtiene un valor de contraseña devuelto de algo similar a


'0x4100420043003100320033000x410042004300310032003300'

Al igual que su contraparte ENCRYPTBYPASSPHRASE, DECRYPTBYPASSPHRASE


devuelve un valor VARBINARIO, que tendremos que convertir en una cadena
utilizable. Esto se puede hacer fácilmente agregando una función CONVERTIR a
nuestra instrucción SELECT.

Ahora debería ver su contraseña descifrada devuelta correctamente en texto claro.


Conclusión:
ENCRYPTBYPASSPHRASE ofrece una forma rápida y fácil de cifrar texto en SQL
Server, y puede ser útil para cifrar contraseñas si necesita poder descifrar las
contraseñas más adelante. Sin embargo, si no necesita descifrar las contraseñas, será
mucho mejor utilizar un hash, que veremos en una publicación posterior de esta
serie . Entonces, al usar ENCRYPTBYPASSPHRASE para encriptar sus contraseñas
puede que no sea la mejor opción, ¡es mejor que no hacer nada !

También podría gustarte