bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


dam_mp09_uf1

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

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 #DamMp09Uf01 #FpInfor #Dam #DamMp09 #DamMp09Uf1 #DamMp09Uf01
  
-===== Guardar contrasenyes de manera segura =====+===== Pàgines en aquesta wiki =====
  
 {{topic>  #DamMp09Uf1 #DamMp09Uf01 }} {{topic>  #DamMp09Uf1 #DamMp09Uf01 }}
  
  
-==== LOPD (Ley Orgánica de protección de Datos) ==== 
- 
-[[https://www.boe.es/buscar/act.php?id=BOE-A-2008-979|Enllaç]] al BOE que regula la gestió de contrasenyes, i diu: 
- 
-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, distribución y almacenamiento que garantice su confidencialidad e integridad. 
- 
-4. El documento de seguridad establecerá la periodicidad, que en ningún caso será superior a un año, con la que tienen que ser cambiadas las contraseñas que, mientras estén vigentes, __se almacenarán de forma ininteligible__. 
- 
- 
-==== 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://en.wikipedia.org/wiki/Hash_function|HASH]]. 
- 
-"Codi en plà" > Funció HASH > "dc647eb645e15858" 
- 
-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ó**, és un camí de dues direccions: s’ha de poder recuperar el text original a partir del valor encriptat 
- 
- 
-==== Millorar la seguretat, Salting & Peppering ==== 
- 
-**Salting**, posar-hi sal: 
- 
-Es tracta d’una cadena de text generada aleatòriament, que s’afegeix a la contrasenya original.  
- 
-Protegeix als usuaris perquè evita que els atacants puguin provar contrasenyes habituals i comparar-les amb el HASH generat. 
- 
-**Peppering**, posar-hi pebre: 
- 
-Es tracta d’una cadena de text generada aleatòriament, que fa de clau privada i permet encriptar el HASH.  
- 
-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, la Salt i la Pepper 
-- 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, valors Hash 
- 
-- Base de dades de “Salt”, valors Salt 
- 
-- Base de dades de “Pepper”, valors 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, i té en compte els atacs amb GPU més actuals. 
- 
-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: 
-<code> 
-### 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 
-</code> 
-==== Exemple de generar Hash i validar codis ==== 
- 
-import com.password4j.Password; 
- 
-<code> 
-class Main { 
-    public static void main(String[] args) { 
- 
-        // Contrasenya que volem definir o validar 
-        String pwd0 = "hola"; 
-        String pwd1 = "adeu"; 
- 
-        // Valor "Salt" que es genera automàticament 
-        // al crear l'usuari en una taula i base de dades 
-        // diferent a la que conté les dades d'usuaris 
-        String pwdSalt = "ac4re21"; 
- 
-        // Valor "Pepper" que es genera automàticament 
-        // al crear l'usuari en una taula i base de dades 
-        // diferent a la que conté les dades d'usuaris 
-        String pwdPepper = "pepperCool"; 
- 
-        // Generar el HASH, quan l'usuari defineix una  
-        // contrasenya es guarda a la taula d'usuaris 
-        // enlloc de la contrasenya "en clar" 
-        // Per generar el HASH cal: 
-        // - La contrasenya que defineix l'usuari 
-        // - El salt d'aquest usuari 
-        // - El pepper d'aquest usuari 
-        String hash = Password.hash(pwd0).addSalt(pwdSalt).addPepper(pwdPepper).withArgon2().getResult(); 
-        System.out.println("Hash generat: " + hash); 
- 
-        // Imaginem que guardem el valor anterior a  
-        // la base de dades i que quan el llegim el  
-        // guardem a la variable "pwdHash" 
-        String pwdHash = "$argon2id$v=19$m=4096,t=20,p=4$YWM0cmUyMQ$+Tr/FOiVJSR2nJqJ3eC9nHsngWdNf+tFEHqmKiCO6b3Qafq+P6bs1FPMhxx9mwCSCL0zpWPsDpXBAjvZYjQarOhWOdHeNRFALM//Q4CJNHytZxi9x8yxpHENLqlwdQrpW3WKolHaxnxIEWfY6yKZl2DFPedZYLEoInpMsP/RRa4"; 
- 
-        // 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'aquest usuari 
-        // - El pepper d'aquest usuari 
-        boolean verified0 = Password.check(pwd0, pwdHash).addSalt(pwdSalt).addPepper(pwdPepper).withArgon2(); 
-        boolean verified1 = Password.check(pwd1, pwdHash).addSalt(pwdSalt).addPepper(pwdPepper).withArgon2(); 
- 
-        // Mostrar si el codi és vàlid per aquesta contrasenya 
-        System.out.println("Password '" + pwd0 + "' is " + (verified0 ? "valid" : "invalid")); 
-        System.out.println("Password '" + pwd1 + "' is " + (verified1 ? "valid" : "invalid")); 
-    } 
-} 
- 
-</code> 
dam_mp09_uf1.1668597404.txt.gz · Darrera modificació: 2022/11/16 11:16 per albert_palacios_jimenez