Una pregunta que se repite bastante frecuentemente es la siguiente: ¿se pueden encriptar las columnas de una tabla en Firebird? Y si la respuesta es afirmativa ¿cómo hacerlo?

Bueno, esas preguntas tienen dos respuestas contradictorias: sí se puede y no se puede.

¿Por qué eso?

Porque se puede muy fácilmente encriptar el contenido de una columna usando la función HASH() pero no se puede conocer cual era el valor original.

Por ejemplo, si escribimos:

Listado 1.

SELECT
   HASH('WALTER')
FROM
   RDB$DATABASE
 Esto será lo que obtendremos:
ENCRIPTAR1
Captura 1. Si haces clic en la imagen la verás más grande

Pero viendo el resultado del hash (es decir, el número: 95.819.938) es imposible saber que el texto original era ‘WALTER’, simplemente hagas lo que hagas con el resultado de un hash no podrás obtener de regreso el texto original.

¿Y entonces, para qué te puede servir la función HASH() si es que no puedes obtener el texto original?

Para guardar contraseñas. Guardas en tu tabla el hash de la contraseña, luego cuando un usuario escribe su contraseña, le efectúas el hash a la contraseña que él escribió y comparas el hash de su contraseña con el hash que habías guardado en tu tabla. Si son idénticos podrás saber que es una contraseña legítima, o sea:

Contraseña legítima —> HASH() —> se guarda el resultado en una tabla

Contraseña escrita por el usuario —> HASH() —> se compara con la guardada en la tabla. Si son idénticas, está todo ok.

Este método es muy ventajoso porque como nunca se guarda la contraseña en la tabla sino el hash de la contraseña, jamás un curioso podrá averiguar cual es la contraseña legítima. Lo único que podría hacer es probar con millones y millones de contraseñas con la esperanza de que alguna de ellas sea la correcta y así los hash coincidan.

¿Pero y si se necesita desencriptar la columna para volver a tener el texto original?

Pues en ese caso lamentablemente el Firebird no te provee de alguna herramienta.

¿Y cuál es la solución, si necesito encriptar y desencriptar un texto?

Que la encriptación y la desencriptación la hagas en tu lenguaje de programación (Visual FoxPro, Visual Basic, Delphi, C, C++, Java, etc.) y no en Firebird. En tu Base de Datos solamente guardarás el texto encriptado, pero la desencriptación de ese texto la realizarás en tu lenguaje de programación.

¿Y no podría tener una UDF para encriptar y desencriptar texto?

Sí, claro que podrías, pero en ese caso la UDF será llamada desde dentro de tu Base de Datos y el curioso potencial podría saber como utilizarla para leer el texto original. O sea que no te servirá y además te dará una falsa sensación de seguridad, por lo tanto sería muy mala idea usarla.

Artículos relacionados:

La función HASH()

Un stored procedure para encriptar y desencriptar datos

El índice del blog Firebird21

El foro del blog Firebird21