Aliñando contraseñas en base de datos, ¿desarrollas o enriqueces?
En el anterior post hablamos de contraseñas desde el punto de vista de un usuario, de la importancia que tiene tener una buena política para evitar que sean sencillas de descubrir tanto a nivel de imaginación como de procesamiento mediante fuerza bruta.
En esta entrada vamos a centrarnos en las formas que hay para tratarlas y almacenarlas poniéndonos en la piel del desarrollador de aplicaciones.
La prehistoria… ¿o no?
Hace años, las aplicaciones que necesitaban gestión de usuarios se creaban implementando acceso a una base de datos en la que se guardaba la habitual pareja “usuario – contraseña”. Cuando se realizaba el proceso de login en el que el usuario indicaba sus credenciales (<user, <password>), bastaba con preguntar algo del tipo:
select user from users where user = <user> and password = <password>
Si obteníamos respuesta, entonces el usuario era quien decía ser, así de sencillo.
Esto, que debería ser algo totalmente obsoleto, todavía lo podemos encontrar en muchas más aplicaciones webs y de escritorio de las que creeríamos…
A modo de ejemplo, el dump de una base de datos MySql de una conocida marca de… (la llamaremos “Acuario” para no dar su verdadero nombre) almacena las credenciales de sus usuarios en un sistema vulnerable a ataques SQL Injection tal que así:
No hace falta decir que almacenar nombre, apellidos, usuario y contraseña de esta forma no es lo correcto, el desarrollador no ha hecho bien los deberes.
Almacenamiento de hashes
El siguiente paso fue dejar de almacenar los dos valores para almacenar el usuario y “algo” relacionado con la contraseña. Ese algo es un hash.
Un hash es el equivalente a una huella digital. Se consigue realizando un proceso matemático que da un valor de salida determinado a un objeto de entrada (podemos hablar de un fichero, un texto, un número…). Es importante tener en cuenta que un proceso de hashing debe ser irreversible, lo que quiere decir que no debemos ser capaces de calcular el objeto de entrada a partir del objeto de salida (ahí reside su fuerza como algoritmo).
Aunque no vamos a entrar en ellos, los algoritmos de hashing habituales son SHA (Secure Hash Algorith) y MD5 (Message-Digest Algorithm 5).
El sentido de todo esto es almacenar hashes en lugar de contraseñas. Así, si alguien ve nuestro hash, no le servirá de nada ya que no podrá deshacerlo.
En este caso, se ha dado un paso más para complicarle la vida a un atacante. Suponiendo que ha conseguido el dump de nuestra base de datos de usuarios, ya no lo tendrá tan sencillo como antes (recordemos que solamente tenía que saber leer para conseguir las credenciales). Ahora tendrá que realizar un ataque de fuerza bruta para generar hashes e ir comparando hasta dar con el objeto de entrada que genera el hash de salida almacenado en la tabla.
Aquí enlazamos con la importancia de tener una buena política de contraseñas, ya que existe lo que se conoce como “tablas rainbow” que son tablas con hashes ya calculados para grandes cantidades de posibles contraseñas.
Cuanto más sencilla sea nuestra contraseña, más probabilidad habrá de que se encuentre en una de estas tablas y que el atacante consiga las credenciales.
El funcionamiento desde el punto de vista del desarrollo es sencillo, cuando ingresemos nuestras credenciales <user> y <password>, se calcula el hash de la contraseña introducida y se compara con el que hay en base de datos, algo como:
select user from users where user = <user> and hash = hash(<password>)
En este ejemplo podemos ver una base de datos de prueba en la que se han obtenido los nombres de usuario y los hashes. Mediante un ataque de fuerza bruta con diccionario incluso se han podido sacar algunas contraseñas en claro.
La práctica actual, “aliñando” el problema
Para atajar el problema de las tablas rainbow se ha optado por dar un paso más en complicar la vida al atacante. Surgen entonces los planteamientos con «salt & pepper» (sal y pimienta), que consisten en utilizar cadenas que se concatenan con la contraseña de usuario para convertir cualquier password débil en una password fuerte.
Imaginemos que tu contraseña es algo como “123456” (sólo números y longitud 6). El hash de esta contraseña va a estar en tablas rainbow, por lo que el atacante conseguiría credenciales casi al instante.
La aplicación podría añadirle el salt “f0Et%%kS*yJ@” y convertir tu pass en “123456_f0Et%%kS*yJ@”. Con este sencillo paso, tu clave débil se ha convertido en una clave fuerte, hemos conseguido una buena defensa frente a ese atacante.
Normalmente ese salt se almacena en la propia base de datos y se utiliza para realizar la consulta, que sería del tipo:
select user from users where user = <user> and hash = hash(<password>+salt)
Como alternativa o paso más, podríamos utilizar el pepper que es igual que salt, pero almacenado fuera de la base de datos.
¿ Con esto ya estamos seguros?
La seguridad absoluta es una quimera, en nuestro caso (recordad que tenemos puesto el casco de desarrollador ahora mismo) nuestra intención es que los datos que almacenamos sean lo más complejos de obtener en el caso hipotético de que un usuario malicioso haya llegado a ellos.
Debemos poner medidas externas para evitar que se pueda acceder a la base de datos, pero tomar este tipo de controles es una buena práctica que todo desarrollador debe tener en cuenta.
Pensad siempre que si alguien quiere entrar, es posible que lo consiga. Cuantas más piedras le pongamos en el camino, más probabilidad tendremos de aburrirle en su tarea y de que decida cambiar por otro objetivo más sencillo.
Pero sobre todo, a nivel de imagen, no podemos permitirnos que los datos personales de nuestros clientes sean publicados, es nuestro deber aplicar medidas preventivas como estas, sobre todo cuando son tan sencillas de implementar.
Espero haberte ayudado con esta visión de seguridad en contraseñas desde los perfiles de usuario y desarrollador. En cualquier caso, si ves algún error, no estás de acuerdo con lo que cuento o quieres hacer alguna aportación, no dudes en pasarte por los comentarios.
- GuardDuty: Un viaje a través del tiempo en AWS Security - 21 noviembre, 2023
- Webinar – Seguridad para familias - 11 enero, 2021
- SecurityInside Live: CISO Day 2020 - 17 septiembre, 2020
mexico pharmacies prescription drugs: mexico pharmacy – mexican pharmacy
reputable mexican pharmacies online: mexican online pharmacy – mexican border pharmacies shipping to usa
http://foruspharma.com/# medicine in mexico pharmacies
canadian pharmacy antibiotics buying drugs from canada canadapharmacyonline com
safe online pharmacies in canada: canadian drug pharmacy – canadian pharmacy reviews
indian pharmacy online: п»їlegitimate online pharmacies india – india pharmacy mail order
п»їbest mexican online pharmacies: pharmacies in mexico that ship to usa – mexican rx online
canadian medications: canadian pharmacy world reviews – canada pharmacy world
indian pharmacy paypal indian pharmacy online indian pharmacies safe
https://canadapharmast.online/# canadian drugs pharmacy
canadian pharmacy in canada: canadianpharmacymeds com – canadian pharmacy prices
pharmacy in canada thecanadianpharmacy certified canadian pharmacy
certified canadian pharmacy: canadian pharmacy 24h com – canadian pharmacy
http://indiapharmast.com/# top online pharmacy india
canadian drugstore online: best online canadian pharmacy – reliable canadian pharmacy reviews
canada pharmacy: canadian pharmacy service – canada pharmacy online
canada drugs online: canadian medications – canadian pharmacy review
escrow pharmacy canada canada drugs online online canadian pharmacy
canadian neighbor pharmacy: canada cloud pharmacy – canadian pharmacy tampa
mail order pharmacy india: world pharmacy india – buy prescription drugs from india
mexican mail order pharmacies reputable mexican pharmacies online buying prescription drugs in mexico online
canadian drugs online: canada rx pharmacy world – canadian pharmacy near me
http://foruspharma.com/# pharmacies in mexico that ship to usa
canadian pharmacy ratings: canadian discount pharmacy – safe reliable canadian pharmacy
india online pharmacy: buy medicines online in india – п»їlegitimate online pharmacies india
https://canadapharmast.com/# best canadian pharmacy
cheap canadian pharmacy online: canadian pharmacy 24h com – canadian pharmacy scam
top 10 pharmacies in india indian pharmacy online Online medicine home delivery
buying from online mexican pharmacy: purple pharmacy mexico price list – mexican pharmaceuticals online
mexico drug stores pharmacies mexican drugstore online medicine in mexico pharmacies
canadian pharmacy scam: canadian mail order pharmacy – reputable canadian pharmacy
buying prescription drugs in mexico: mexican pharmaceuticals online – reputable mexican pharmacies online
india pharmacy mail order: Online medicine order – indian pharmacy online
canadian pharmacy 24h com: ordering drugs from canada – canadian pharmacy phone number
http://foruspharma.com/# mexican pharmaceuticals online
purple pharmacy mexico price list: purple pharmacy mexico price list – buying prescription drugs in mexico online
mexican rx online: best online pharmacies in mexico – purple pharmacy mexico price list
http://indiapharmast.com/# indianpharmacy com
ciprofloxacin generic price: ciprofloxacin over the counter – buy cipro online
http://doxycyclinedelivery.pro/# doxycycline 40 mg india
https://clomiddelivery.pro/# cost generic clomid
buy cipro without rx: buy cipro without rx – ciprofloxacin generic
http://paxloviddelivery.pro/# п»їpaxlovid
cipro: buy cipro online without prescription – cipro online no prescription in the usa
http://doxycyclinedelivery.pro/# doxycycline pills cost
https://ciprodelivery.pro/# cipro 500mg best prices
buy doxycycline tablets 100mg: cost of doxycycline 50 mg – can you buy doxycycline over the counter uk
https://doxycyclinedelivery.pro/# doxycycline order online canada
paxlovid for sale: Paxlovid over the counter – п»їpaxlovid
http://ciprodelivery.pro/# cipro 500mg best prices
https://doxycyclinedelivery.pro/# doxycycline online for dogs
https://doxycyclinedelivery.pro/# doxycycline usa
medicine amoxicillin 500mg: amoxicillin generic brand – amoxicillin buy no prescription
paxlovid cost without insurance: Paxlovid over the counter – paxlovid pill
http://ciprodelivery.pro/# antibiotics cipro
http://ciprodelivery.pro/# buy cipro online canada
paxlovid cost without insurance: paxlovid price – buy paxlovid online
https://amoxildelivery.pro/# amoxicillin 250 mg price in india
http://doxycyclinedelivery.pro/# doxycycline buy no prescription
buy ciprofloxacin: п»їcipro generic – buy generic ciprofloxacin
http://amoxildelivery.pro/# over the counter amoxicillin
https://paxloviddelivery.pro/# paxlovid pill
can you buy doxycycline over the counter in nz: doxycycline online uk – doxycycline medicine in india
http://amoxildelivery.pro/# amoxicillin buy no prescription
cipro for sale: cipro ciprofloxacin – buy cipro online without prescription
https://clomiddelivery.pro/# how to get cheap clomid price
cost of generic clomid no prescription: clomid tablets – can you get generic clomid
can i purchase generic clomid without dr prescription: where buy generic clomid no prescription – can i get generic clomid no prescription
Paxlovid over the counter: paxlovid covid – paxlovid generic
how to buy generic clomid no prescription: generic clomid online – can you get generic clomid prices
Paxlovid buy online: paxlovid pharmacy – paxlovid india
order doxycycline 100mg without prescription: doxycycline capsule 100mg price – doxycycline 100mg capsules price in india