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 13:34] albert_palacios_jimenez |
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. | ||
| - | |||
| - | ... | ||
| - | |||
| - | 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:// | ||
| - | |||
| - | " | ||
| - | |||
| - | 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: | ||
| - | |||
| - | - [[https:// | ||
| - | |||
| - | - [[https:// | ||
| - | |||
| - | - [[https:// | ||
| - | |||
| - | 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 contrasenyes ==== | ||
| - | <code java> | ||
| - | 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(" | ||
| - | } | ||
| - | } | ||
| - | |||
| - | </ | ||