¿Has oído hablar del robo de datos? Oh, no es solo una trama para pelis de Hollywood. Las empresas pierden millones de euros por fugas de datos, y su reputación se cae como un castillo de naipes. Para que eso no pase, hay que proteger los datos sí o sí. Una de las formas más potentes es el cifrado.
El cifrado es un método para convertir datos en un "código secreto" que nadie puede entender sin tener la clave para descifrarlo. En PostgreSQL hay una extensión genial llamada pgcrypto que te facilita mucho el proceso de cifrar tus datos.
pgcrypto es una extensión de PostgreSQL que te da herramientas potentes para cifrar y descifrar datos, trabajar con hashes y generar datos aleatorios.
Funciones principales de pgcrypto:
- Cifrado simétrico (una sola clave) y asimétrico (par de claves: privada y pública).
- Hash de datos para su verificación (por ejemplo, contraseñas).
- Generación de datos aleatorios que puedes usar para crear tokens, claves y contraseñas.
Así es como puedes activar pgcrypto en tu base de datos. Si pensabas que la magia solo era cosa de magos de Hogwarts, deja que PostgreSQL te sorprenda.
-- Activar la extensión pgcrypto
CREATE EXTENSION IF NOT EXISTS pgcrypto;
Cifrado simétrico: Codificando tus secretos
Funciones para cifrar y descifrar:
pgp_sym_encrypt(data, key)— cifra datos usando una clave simétrica.pgp_sym_decrypt(data, key)— descifra datos cifrados con la misma clave.
Ejemplo: cifrado de texto simple
Supón que tienes una tabla users con una columna email y quieres cifrar las direcciones de correo electrónico.
-- Crear la tabla users
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email TEXT
);
-- Insertar datos
INSERT INTO users (email)
VALUES ('user1@example.com'), ('user2@example.com');
-- Cifrar los datos
UPDATE users
SET email = pgp_sym_encrypt(email, 'supersecretkey');
-- Comprobar el resultado
SELECT * FROM users;
Resultado: en la columna email ahora tienes texto cifrado que parece un montón de caracteres sin sentido.
Descifrado de datos
Cuando necesites volver a ver los datos originales, usa la función pgp_sym_decrypt.
-- Descifrar los datos
SELECT pgp_sym_decrypt(email::bytea, 'supersecretkey') AS original_email
FROM users;
Nota: no seas tacaño con las claves. Una clave tipo "123456" es como ponerle contraseña a la puerta y luego dejarla abierta. Usa claves largas y complicadas.
Hash de datos: protección de contraseñas a lo bestia
Guardar contraseñas en texto plano en la base de datos es como esconder tu diario debajo de la almohada en un piso compartido. ¡No lo hagas! Mejor usa hash.
Función para hacer hash: crypt(password, gen_salt('bf')) — crea un hash para la cadena password usando el algoritmo Blowfish.
-- Ejemplo de hash de contraseña
SELECT crypt('mi_contraseña', gen_salt('bf'));
El resultado se verá más o menos así: $2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi.
Para comprobar la contraseña, usa la misma función:
-- Comprobar la contraseña
SELECT crypt('mi_contraseña', '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi')
= '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi';
Resultado: true.
Consejo: nunca guardes contraseñas en texto plano. Aunque creas que tu base de datos es súper segura, usa siempre hashes.
Cifrado asimétrico: Dos claves mejor que una
El cifrado asimétrico usa dos claves:
- Clave pública (para cifrar).
- Clave privada (para descifrar).
Ejemplo: cifrado usando la clave pública
-- Crear un par de claves (para simplificar, las guardamos en variables)
DO $$
DECLARE
public_key TEXT;
private_key TEXT;
BEGIN
SELECT pgp_keygen_keys(1024, 'mi_frase_secreta')
INTO public_key, private_key;
RAISE NOTICE 'Clave pública: %', public_key;
RAISE NOTICE 'Clave privada: %', private_key;
END $$;
Uso del cifrado asimétrico
Los sistemas modernos suelen usar cifrado asimétrico para intercambiar datos, por ejemplo, en conexiones SSL.
Generación de datos aleatorios
Para crear tokens o claves aleatorias, usa la función gen_random_uuid o gen_random_bytes.
Ejemplo:
-- Generar un UUID aleatorio
SELECT gen_random_uuid();
-- Generar un array de bytes aleatorios
SELECT gen_random_bytes(16);
Esto es útil para crear identificadores únicos, tokens de acceso o contraseñas aleatorias.
Escenarios de uso de pgcrypto
- Cifrado de datos confidenciales:
- Números de tarjetas de crédito.
- Datos personales de clientes (por ejemplo, direcciones, números de teléfono).
- Registros médicos.
Hash de contraseñas: Asegúrate de que ni el admin de la base de datos pueda ver las contraseñas de los usuarios.
Transmisión segura de datos: Usar cifrado asimétrico para enviar información cifrada.
Generación de tokens: Crear tokens para autenticar usuarios de una API.
Errores típicos al trabajar con cifrado
Guardar claves en lugares accesibles. Nunca guardes las claves de cifrado en la base de datos en texto plano. Usa gestores de secretos para eso.
Usar claves débiles. Si la clave de cifrado es demasiado corta, te la pueden adivinar.
Cifrar sin necesidad. El cifrado consume recursos. Úsalo solo donde realmente haga falta.
Olvidar qué clave usaste. Si no tienes documentación, puedes acabar sin poder descifrar los datos.
El cifrado no es difícil, es más bien un paso lógico para proteger tus datos. Empieza a usar pgcrypto en tus proyectos y harás tus bases de datos no solo más seguras, sino también más cerca de los estándares que exige el mundo moderno. PostgreSQL te da todas las herramientas para convertir tus datos en una fortaleza inexpugnable.
GO TO FULL VERSION