Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia | ||
dam_mp09_uf1 [2022/11/16 11:16] albert_palacios_jimenez [Pàgines en aquesta wiki] |
dam_mp09_uf1 [2022/11/16 15:40] (actual) albert_palacios_jimenez s'ha restaurat una versió anterior 2021/09/29 09:40 |
||
---|---|---|---|
Línia 4: | Línia 4: | ||
#FpInfor #Dam #DamMp09 #DamMp09Uf1 # | #FpInfor #Dam #DamMp09 #DamMp09Uf1 # | ||
- | ===== Guardar contrasenyes de manera segura | + | ===== Pàgines en aquesta wiki ===== |
{{topic> | {{topic> | ||
- | ==== LOPD (Ley Orgánica de protección de Datos) ==== | ||
- | |||
- | [[https:// | ||
- | |||
- | Artículo 93. Identificación y autenticación. | ||
- | |||
- | 1. El responsable del fichero o tratamiento deberá adoptar las medidas que garanticen la correcta identificación y autenticación de los usuarios. | ||
- | |||
- | 2. El responsable del fichero o tratamiento establecerá un mecanismo que permita la identificación de forma inequívoca y personalizada de todo aquel usuario que intente acceder al sistema de información y la verificación de que está autorizado. | ||
- | |||
- | 3. Cuando el mecanismo de autenticación se base en la existencia de contraseñas existirá un procedimiento de asignación, | ||
- | |||
- | 4. El documento de seguridad establecerá la periodicidad, | ||
- | |||
- | |||
- | ==== Contrasenyes ininteligibles ==== | ||
- | |||
- | Com que la llei ens diu que no es pot guardar la contrasenya tal com l’escriu l’usuari, s’ha de guardar un codi que representa a la contrasenya però que fa impossible saber quin valor té realment. Això es fa amb una funció anomenada [[https:// | ||
- | |||
- | "Codi en plà" > Funció HASH > " | ||
- | |||
- | Tradicionalment el HASH que s’ha fet servir és MD5, però està en desús perquè __s’ha demostrat que no és fiable__ 100% | ||
- | |||
- | |||
- | ==== HASH vs Encriptació ==== | ||
- | |||
- | **Hash**, és un camí d’una direcció: pretén fer imposible recuperar el valor original a partir del valor generat. | ||
- | |||
- | **Encriptació**, | ||
- | |||
- | |||
- | ==== Millorar la seguretat, Salting & Peppering ==== | ||
- | |||
- | **Salting**, | ||
- | |||
- | Es tracta d’una cadena de text generada aleatòriament, | ||
- | |||
- | Protegeix als usuaris perquè evita que els atacants puguin provar contrasenyes habituals i comparar-les amb el HASH generat. | ||
- | |||
- | **Peppering**, | ||
- | |||
- | Es tracta d’una cadena de text generada aleatòriament, | ||
- | |||
- | Protegeix als usuaris perquè encara que es tingui accés a la base de dades, no es pot desencriptar HASH sense aquesta clau privada. | ||
- | |||
- | |||
- | ==== Quines dades cal guardar? ==== | ||
- | |||
- | Cada usuari té associades les següents dades: | ||
- | |||
- | **Salt**: | ||
- | |||
- | - Cadena de text generada aleatòriament al crear l’usuari | ||
- | - Està en una taula i base de dades diferent a la taula d’usuaris i també la de “Pepper” | ||
- | |||
- | **Pepper**: | ||
- | |||
- | - Cadena de text generada aleatòriament al crear l’usuari | ||
- | - Està en una taula i base de dades diferent a la taula d’usuaris i també la de “Salt” | ||
- | |||
- | **Hash**: | ||
- | |||
- | - Cadena de text generada segons la contrasenya, | ||
- | - Es guarda a la taula d’usuaris | ||
- | |||
- | **Nota**: Amb aquest mètode la contrasenya de cada usuari **NO** es guarda mai enlloc | ||
- | |||
- | |||
- | ==== On es guarden les dades? ==== | ||
- | |||
- | Les dades es guarden en 3 bases de dades diferents: | ||
- | |||
- | - Base de dades d’usuaris, | ||
- | |||
- | - Base de dades de “Salt”, valors Salt | ||
- | |||
- | - Base de dades de “Pepper”, | ||
- | |||
- | **Nota**: Idealment, cada base de dades està en un servidor (màquina) diferent | ||
- | |||
- | |||
- | ==== Argon2 i Password4J (alternativa al antic MD5) ==== | ||
- | |||
- | **Argon2** és un algorisme dedicat únicament a l’encriptació de contrasenyes. | ||
- | |||
- | Es pot configurar per evitar atacs més o menys sofisticats, | ||
- | |||
- | Va guanyar la competició mundial “Password Hashing” al 2015, i des d’aleshores és l’algorisme recomanat. | ||
- | |||
- | |||
- | **Password4J** és una llibreria Java, permet generar HASH amb Argon2 per després, poder validar contrasenyes de manera segura. | ||
- | |||
- | ==== Password4J, llibreries i configuració ==== | ||
- | |||
- | Per fer anar “Password4J” calen les següents llibreries: | ||
- | |||
- | - password4j-1.6.2.jar | ||
- | |||
- | - slf4j-simple-1.6.1.jar | ||
- | |||
- | - slf4j.api-1.6.1.jar | ||
- | |||
- | I l’arxiu de configuració “psw4j.properties” amb el següent contingut: | ||
- | < | ||
- | ### Argon2 | ||
- | hash.argon2.memory=4096 | ||
- | hash.argon2.iterations=20 | ||
- | hash.argon2.length=128 | ||
- | hash.argon2.parallelism=4 | ||
- | hash.argon2.type=id | ||
- | hash.argon2.version=19 | ||
- | |||
- | global.pepper=FinePepper | ||
- | global.banner=false | ||
- | </ | ||
- | ==== Exemple de generar Hash i validar codis ==== | ||
- | |||
- | import com.password4j.Password; | ||
- | |||
- | < | ||
- | class Main { | ||
- | public static void main(String[] args) { | ||
- | |||
- | // Contrasenya que volem definir o validar | ||
- | String pwd0 = " | ||
- | String pwd1 = " | ||
- | |||
- | // Valor " | ||
- | // al crear l' | ||
- | // diferent a la que conté les dades d' | ||
- | String pwdSalt = " | ||
- | |||
- | // Valor " | ||
- | // al crear l' | ||
- | // diferent a la que conté les dades d' | ||
- | String pwdPepper = " | ||
- | |||
- | // Generar el HASH, quan l' | ||
- | // contrasenya es guarda a la taula d' | ||
- | // enlloc de la contrasenya "en clar" | ||
- | // Per generar el HASH cal: | ||
- | // - La contrasenya que defineix l' | ||
- | // - El salt d' | ||
- | // - El pepper d' | ||
- | String hash = Password.hash(pwd0).addSalt(pwdSalt).addPepper(pwdPepper).withArgon2().getResult(); | ||
- | System.out.println(" | ||
- | |||
- | // Imaginem que guardem el valor anterior a | ||
- | // la base de dades i que quan el llegim el | ||
- | // guardem a la variable " | ||
- | String pwdHash = " | ||
- | |||
- | // Per validar si la contrasenya és correcta o no: | ||
- | // - La contrasenya que es vol validar | ||
- | // - El hash que correspon a aquest usuari | ||
- | // - El salt d' | ||
- | // - El pepper d' | ||
- | boolean verified0 = Password.check(pwd0, | ||
- | boolean verified1 = Password.check(pwd1, | ||
- | |||
- | // Mostrar si el codi és vàlid per aquesta contrasenya | ||
- | System.out.println(" | ||
- | System.out.println(" | ||
- | } | ||
- | } | ||
- | |||
- | </ |