Seguretat i Criptografia - 1. Criptografia i Java UF1 (AM2 M9)
Document Details
Uploaded by GlowingCornett
2024
Carles Franquesa
Tags
Summary
Aquestes notes de classe tracten sobre criptografia en Java per a ús en desenvolupament d'aplicacions. Explica conceptes fonamentals i com aplicar-los en l'àmbit de la seguretat. L'assignatura és de nivell de grau (AM2 M9).
Full Transcript
Les aplicacions processen grans quantitats d’informació que pot ser molt diversa: les propietats dels personatges d’un videojoc, d’un document de text enriquit o del conjunt de cel·les d’un full de càlcul. Qualsevol tipus d’informació en format digital pot ser tractada per un ordinador. Per acabar d...
Les aplicacions processen grans quantitats d’informació que pot ser molt diversa: les propietats dels personatges d’un videojoc, d’un document de text enriquit o del conjunt de cel·les d’un full de càlcul. Qualsevol tipus d’informació en format digital pot ser tractada per un ordinador. Per acabar de posar la cirereta al pastís, l’auge d’Internet ha multiplicat aquest avantatge, permetent l’intercanvi d’informació entre aplicacions, o l’accés pels usuaris. UF1 Com a resultat, cal convertir tota la informació a format digital. Ara bé, això obre una problemàtica molt important. Què succeeix quan algunes d’aquestes dades que tracten les aplicacions estan vinculades a aspectes sensibles, i no s’hauria de poder accedir a elles lliurement? Com les dades d’una declaració de la renda, la llista d’afiliats a un partit polític, o l’historial clinic d’un pacient. Exemples menys extrems, simplement una fotografia una mica compromesa que heu pujat a una xarxa social, només per riure amb els vostres amics i ningú més. No pot ser que qualsevol persona dins l’organització que gestiona aquestes dades hi tingui lliure accés. Només les persones autoritzades haurien de poder Seguretat i accedir-hi. Idealment, ni tan sols un treballador amb accés físic a les màquines, l’administrador de sistemes, hauria de poder veure-les. Com a futurs desenvolupadors d’aplicacions, fins i tot pot ser d’obligació per llei. Des de la seva implantació l’any 1999, la Llei criptografia Oficial de Protecció de Dades (LOPD) obliga a assegurar la informació preveient multes de fins centenars de milers d’euros pels AM2 M9 curs 24/25 Carles Franquesa casos més greus en els quals no es faci com cal. Hi ha entorns on ni tan sols és possible implantar una aplicació sense garantir la seguretat de les dades tractades (hospitals, 1 Criptografia i Java ajuntaments, bancs, etc). Garantir la seguretat és una necessitate. Per assolir-ho, en aquesta unitat s’estudien eines per quan programeu en Java, poder garantir la seguretat de les dades. Tot seguit s’introdueix un concepte fonamental per la seguretat de la informació dins d’una aplicació: la criptografia. En qualsevol llenguatge de programació hi ha eines per això. Aquí estudiarem les del Java, la JCE (Java Cryptography Extension), que ofereix el conjunt de classes per encriptar les dades. Un cop establerts els coneixements bàsics sobre criptografia en Java, es mostra com resoldre problemes comuns a l’hora de crear programari que es distribueix o necessita connectar-se Internet. Per una banda, com garantir qui és el propietari d’una biblioteca que us heu descarregat i com garantir que no farà res dolent en el ra fi a i J a v a 1 Cri ptog 1.1 Sistemes de xifrat simètric 1.1.1 Generació de claus simètriques 1.1.2 Claus simètriques basades en contrasenya 1.1.3 Xifrat AES en mode ECB 1.2 Sistemes de xifrat asimètric 1.1.4 Xifrat AES en mode CBC 1.2.1 Generació de claus privades i públiques 1.2.2 Xifrat RSA directe 1.2.3 Xifrat RSA amb clau embolcallada 1.3 Firma digital AM2 M9 curs 24/25 Carles Franquesa 1.3.1 Generació de firma digital RSA 1.3.2 Validació de firma digital RSA 1.3.3 Certificats digitals 1.3.4 Emissió de certificats 1.4 Gestió de claus 1.4.1 L’eina Keytool 1.4.2 Accés a un magatzem a través de codi Java 1.1 AM2 M9 curs 24/25 Carles Franquesa Sistemes de xifrat simètric 1 Criptografia i Java 1.1 Sistemes de xifrat simètric La privadesa de les dades (data privacy, en anglès) és el servei de seguretat que garanteix que certes dades no puguin ser accedides lliurement. Només han de poder ser accedides per aquells individus que La criptografia hi estiguin (escriptura secreta, del grec kryptos, amagat o secret, i graphein, escriptura) autoritzats. és la disciplina matemàtica que s’encarrega d’estudiar com protegir la informació mitjançant la seva transformació, El paquet JCE (Java Cryptography Extension) és especialment mitjançant codis o xifrant. una biblioteca que ofereix Java per poder executar AM2 M9 curs 24/25 Carles Franquesa algorisme de xifrat diferents dades algorismes de xifrat als vostres programes en clar dades xifrades 1 Criptografia i Java 1.1 Sistemes de xifrat simètric Usat des de la invenció de la criptografia en temps pretèrits. La clau és compartida entre qui hagi de ser capaç de llegir les dades. Es donarà una còpia de la clau a qui es vulgui que pugui obrir el cofre. L’algorisme de xifrat combina les dades originals en clar amb la clau per generar com a resultat un bm! es uesn ose vbon conjunt de zsl vwluhtwkm jnw gs, AM2 M9 curs 24/25 Carles Franquesa Egzhksth dades incomprensibles. Per recuperar el missatge original i desfer el procés d’ofuscació cal aplicar l’algorisme de desxifrat usant una còpia de la clau usada durant el procés de xifrat. 1 Criptografia i Java 1.1 Sistemes de xifrat simètric Xifratge Cèsar És el sistema de xifrat simètric més fàcil possible. A partir d’una clau que és un nombre enter k entre 1 i 26, se substitueix cada lletra del missatge original per la k-èsima posterior. Si) en = la transformació se surt de cesar(“zoo” “ hola” ,1 ,3) = l’alfabet, es cesar(“ab”,5) = “fg c e sa r( “ crr” ” b ” torna a començar pel principi.“ipm AM2 M9 curs 24/25 Carles Franquesa exercici Desxifreu el missatge xifrat amb el xifratge Cèsar (haureu de descobrir la clau): Egzhksthgs, zsl vwluhtwkm jnw es uesn ose vbonbm! Quina clau utilitza? 1 Criptografia i Java 1.1 Sistemes de xifrat simètric Algorismes AES Advanced Encription Standard (2001) DES Data Encription Standard AM2 M9 curs 24/25 Carles Franquesa TripleDES 1 Criptografia i Java 1.1 Sistemes de xifrat simètric 1.1.1 Generació de claus simètriques Una clau simètrica no és més que una seqüència aleatòria de bits d’una mida determinada. Les mides vàlides vindran donades pel tipus d’algorisme que es vol executar. public SecretKey keygenKeyGeneration(int keySize) { SecretKey sKey = null; classes de la JCE per la generació if ((keySize == 128)||(keySize == 192)||(keySize == 256)) { de claus simètriques try { KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(keySize); AM2 M9 curs 24/25 Carles Franquesa sKey = kgen.generateKey(); javax.crypto.Secret } catch (NoSuchAlgorithmException ex) { Key javax.crypto.KeyGene System.err.println("Generador no disponible."); } rator } return sKey; } 1 Criptografia i Java 1.1 Sistemes de xifrat simètric 1.1.2 Claus simètriques basades en contrasenya És freqüent utilitzar contrasenyes per generar claus simètriques. Pel cas de l’AES, les claus han de tenir una mida concreta, 128, 192 o 256 bytes. A partir de la contrasenya, s’ha de generar una seqüència d’una d’aquestes longituds. És vital evitar col·lisions, que per cada contrasenya possible doni seqüències Un algorisme de hash, o resum (digest, en anglès), és una transformació criptogràfica diferents. que es pot aplicar a un conjunt de dades de manera que per molts elements que pugui tenir el conjunt de dades, AM2 M9 curs 24/25 Carles Franquesa SHA-1 (Secure Hash la transformació tindrà una mida fixa. Argon2 Algorithm 1) Per 160 bits. Insegur degut a emmagatzemar l’excés de col·lisions. SHA-256 (256 contrasenyes, bits) resistent als Aplicacions de atacs de força seguretat, incloent bruta. Bcrypt criptografia, MD5 (Message Per emmagatzemar blockchain (com Digest Algorithm contrasenyes. Bitcoin) i certificats 5) Inclou un factor de digitals. SHA-3 (2015) Molt usat abans, cost per augmentar SHA-2 amb millores massa col·lisions la dificultat de en seguretat. desxifrar. 1 Criptografia i Java 1.1 Sistemes de xifrat simètric 1.1.2 Claus simètriques basades en contrasenya public SecretKey passwordKeyGeneration(String text, int keySize) { SecretKey sKey = null; if ((keySize == 128)||(keySize == 192)||(keySize == 256)) { classes de la JCE per la generació de try { claus byte[] data = text.getBytes("UTF−8"); simètriques basades en contraseya MessageDigest md = MessageDigest.getInstance("SHA−256"); byte[] hash = md.digest(data); AM2 M9 curs 24/25 Carles Franquesa byte[] key = Arrays.copyOf(hash, keySize/8); javax.crypto.Secret sKey = new SecretKeySpec(key, "AES"); } Key javax.crypto.MessageDig catch (Exception ex) { System.err.println("Error generant la clau:" + ex); est } } return sKey; } 1 Criptografia i Java 1.1 Sistemes de xifrat simètric 1.1.3 Xifrat AES en mode ECB atge l e de xifr i si b i tat indiv un L’AES és un algorisme de xifrat en bloc, amb blocs de 16 bytes. Només pot xifrar de bloc en bloc. S’afegeix un padding fins els 16 bytes a l’últim bloc. Electronic Code Book Dos modes d’operació Cyclic Block Chaining AM2 M9 curs 24/25 Carles Franquesa La identificació d’un algorisme consta de les tres dades l’ordre dels blocs no AES/ECB/ s’encripta! PKCS5Padding 1 Criptografia i Java 1.1 Sistemes de xifrat simètric 1.1.3 Xifrat AES en mode ECB Problema d’inseguretat Podem eliminar blocs Vulnerabilitat AM2 M9 curs 24/25 Carles Franquesa Blocs iguals s’encripten en blocs resultants iguals 1 Criptografia i Java 1.1 Sistemes de xifrat simètric 1.1.3 Xifrat AES en mode ECB n i c C ode Advanced Encription Electro Standar Bo ok public byte[] encryptData(SecretKey sKey, byte[] data) { paquet de Java per al byte[] encryptedData = null; xifrat try { d’informació Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, sKey); encryptedData = cipher.doFinal(data); } javax.crypto.Cipher catch (Exception ex) { System.err.println("Error xifrant les dades: " + ex); } AM2 M9 curs 24/25 Carles Franquesa return encryptedData; } per desencriptar, seria DECRYPT_MODE 1 d’octubre de 2024 Sessió 2 AM2 M9 curs 24/25 Carles Franquesa 1 Criptografia i Java 1.1 Sistemes de xifrat simètric ck C h ai n 1.1.4 Xifrat AES en mode CBC Bl o Cyclic El procés de xifrat depen no només de la clau, sinó també del resultat de processar el bloc anterior. Pel cas del primer bloc s’utilitza el vector d’inicialització com a AM2 M9 curs 24/25 Carles Franquesa resultat del bloc anterior. El procediment de xifrat i desxifrat resulta molt més costós. Cal disposar de tot el missatge per poder-se desxifrar. C ha i n 1 Criptografia i Java 1.1 Sistemes de xifrat simètric 1.1.4 Xifrat AES en mode CBC B l o ck Cyclic public static final byte[] IV_PARAM = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; public byte[] encryptDataCBC(SecretKey sKey, byte[] data) { byte[] encryptedData = null; try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec iv = new IvParameterSpec(IV_PARAM); cipher.init(Cipher.ENCRYPT_MODE, sKey, iv); encryptedData = cipher.doFinal(data); } catch (Exception ex) { AM2 M9 curs 24/25 Carles Franquesa System.err.println("Error xifrant les dades: " + ex); } return encryptedData; } Al desxifrar caldrà garantir que el vector d’inicialització és exactament el mateix que es va usar per xifrar. En cas contrari, no obtindreu el text en clar original encara que la clau sigui correcta. 1.2 AM2 M9 curs 24/25 Carles Franquesa Sistemes de xifrat asimètric 1 Criptografia i Java 1.2 Sistemes de xifrat asimètric Qui vol rebre missatges secrets dona la seva clau pública (que és l’única que encaixa amb la seva clau privada) a les persones de les quals vulgui rebre missatges. AM2 M9 curs 24/25 Carles Franquesa clau pública RSA És l’estàndard de facto dels algorismes de xifrat asimètric. Rivest, Shamir i Adleman, 1977. clau privada 1 Criptografia i Java 1.2 Sistemes de xifrat asimètric 1.2.1 Generació de claus privades i públiques que una seqü èn ci a a le a tò ri a de bits d’una mid a a n o és mé s Una clau simètric Una clau asimètrica (o sigui, dete un rminad a. parell de claus pública-privada) ha de complir certes propietats En l’RSA, matemàtiques. la clau asimètrica és el producte de dos nombres primers molt grans. al tindria... en Java, el er go, el valor en decim Habitualment, ocupen 256 bytes, o sigui 2048 bits. tes xifres? long ocupa quan 8 bytes paquet de Java per public KeyPair randomGenerate(int len) { generar parells de claus KeyPair keys = null; AM2 M9 curs 24/25 Carles Franquesa asimètriques try { KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); java.security.KeyPair keyGen.initialize(len); keys = keyGen.genKeyPair(); Generator } catch (Exception ex) { PrivateKey PublicKey System.err.println("Generador no disponible."); getPrivate() getPublic() } return keys; } 1 Criptografia i Java 1.2 Sistemes de xifrat asimètric 1.2.2 Xifrat RSA directe Usem la mateixa classe que pel simètric, Cipher. si aquí diu Pub licKey... Per xifrar usem la clau pública, per desxifrar, la privada. public byte[] encryptData(byte[] data, PublicKey pub) { byte[] encryptedData = null; try { Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding","SunJCE"); cipher.init(Cipher.ENCRYPT_MODE, pub); AM2 M9 curs 24/25 Carles Franquesa encryptedData = cipher.doFinal(data); } catch (Exception ex) { System.err.println("Error xifrant: " + ex); } return encryptedData; }...llavors aquí ha de dir ENCRYPT_MODE 1 Criptografia i Java 1.2 Sistemes de xifrat asimètric 1.2.2 Xifrat RSA directe exercici Feu un programa en Java per encriptar i desencriptar el contingut de C:\exercicis\dam2\uf1\rsa\prova.txt El programa ha d’oferir les dues opcions. Quan encripti, ha de guardar la clau en un arxiu anomenat C:\exercicis\dam2\uf1\rsa\private_key.der i ha de guardar el resultat a l’arxiu AM2 M9 curs 24/25 Carles Franquesa C:\exercicis\dam2\uf1\rsa\prova_encriptada.txt I quan desencripti ha d’usar la mateixa clau, i ha de deixar el resultat a C:\exercicis\dam2\uf1\rsa\prova_desencriptada.txt Lògicament, el resultat final ha de ser que el contingut de la prova i de la prova desencriptada coincideixin. 1 Criptografia i Java 1.2 Sistemes de xifrat asimètric 1.2.2 Xifrat RSA directe exercici Feu un programa en Java per encriptar i desencriptar el contingut de C:\exercicis\dam2\uf1\rsa\prova.txt El programa ha d’oferir les dues opcions. solució Quan encripti, ha de guardar la clau en un arxiu anomenat C:\exercicis\dam2\uf1\rsa\private_key.der i ha de guardar el resultat a l’arxiu public class RSA { (sense C:\exercicis\dam2\uf1\rsa\prova_encriptada.txt private static Scanner sc; I quan desencripti ha d’usar la mateixa clau, i ha de deixar el resultat a imports) public final static String root = "C:\\exercicis\\dam2\\m9\\uf1\\rsa\\"; C:\exercicis\dam2\uf1\rsa\prova_desencriptada.txt Lògicament, el resultat final ha de ser que el contingut de la prova i de la prova desen public static int menu() { coincideixin. System.out.println("1. Encriptar"); System.out.println("2. Desencriptar"); int n; System.out.print("Introdueix un número enter: "); n = sc.nextInt(); sc.nextLine(); return n; } AM2 M9 curs 24/25 Carles Franquesa public static void main(String[] args) throws Exception { sc = new Scanner(System.in); int opcio = menu(); while (opcio == 1 || opcio == 2) { if (opcio == 1) encripta(); if (opcio == 2) desencripta(); opcio = menu(); } sc.close(); } } exercici public static byte[] encriptaDades(byte[] dades, Feu un PublicKey programa en Javak)perthrows encriptar Exception i desencriptar el contingut de { C:\exercicis\dam2\uf1\rsa\prova.txt Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding","SunJCE"); El programa ha d’oferir les dues opcions. cipher.init(Cipher.ENCRYPT_MODE, k); Quan encripti, ha de guardar la clau en un arxiu anomenat C:\exercicis\dam2\uf1\rsa\private_key.der return cipher.doFinal(dades); i ha de guardar el resultat a l’arxiu } C:\exercicis\dam2\uf1\rsa\prova_encriptada.txt I quan desencripti public static KeyPair novaClau() throws Exception { ha d’usar la mateixa clau, i ha de deixar el resultat a C:\exercicis\dam2\uf1\rsa\prova_desencriptada.txt System.out.println("Generant nova clau..."); KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); Lògicament, el resultat final ha de ser que el contingut de la prova i de la prova desen keyGen.initialize(2048); coincideixin. KeyPair publick class = keyGen.genKeyPair(); Encripta { FileOutputStream fos = new FileOutputStream(root + "private_key.der"); System.out.println("\tGuardant la clau public static void encripta() a l'arxiu throws Exception private_key.der..."); { PrivateKey System.out.println("Encriptant privada = k.getPrivate(); el contingut de l'arxiu prova.txt..."); fos.write(privada.getEncoded()); // Escriu la clau en FileReader(root BufferedReader br = new BufferedReader(new format DER + "prova.txt")); System.out.println("\t...guardada."); StringBuilder fitxer = new StringBuilder(); System.out.println("...generada."); String line; AM2 M9 curs 24/25 Carles Franquesa return k; while ((line = br.readLine()) != null) { } System.out.println(line); fitxer.append(line); } byte[] bytes = fitxer.toString().getBytes(); KeyPair clau = novaClau(); byte[] brut = encriptaDades(bytes, clau.getPublic()); solució FileOutputStream fos = new FileOutputStream(root + "prova_encriptada.txt"); fos.write(brut); // Escriu les dades encriptades com a bytes System.out.println("...encriptat a l'arxiu prova_encriptada.txt."); (classe } Encriptar) } exercici static byte[] dades() throws Exception { Feu un programa en Java per encriptar i desencriptar el contingut de return Files.readAllBytes(new File(root + "prova_encriptada.txt").toPath()); C:\exercicis\dam2\uf1\rsa\prova.txt } El programa ha d’oferir les dues opcions. Quan encripti, ha de guardar la clau en un arxiu anomenat static PrivateKey clau() throws Exception { C:\exercicis\dam2\uf1\rsa\private_key.der i ha de guardar el resultat a l’arxiu C:\exercicis\dam2\uf1\rsa\prova_encriptada.txt static el // Llegeix byte[] desencriptaDades(byte[] contingut del fitxer.der dades, PrivateKey clau) throws Exception { I quan desencripti ha d’usar la mateixa clau, i ha de deixar el resultat a File file = // newObté una instància File(root de Cipher per RSA + "private_key.der"); C:\exercicis\dam2\uf1\rsa\prova_desencriptada.txt Cipher FileInputStream fiscipher; = new FileInputStream(file); cipher = Lògicament, el resultat final ha de ser que el contingut de la prova i de la prova desen Cipher.getInstance("RSA/ECB/PKCS1Padding"); byte[] bytes = new byte[(int) file.length()]; coincideixin. cipher.init(Cipher.DECRYPT_MODE, clau); fis.read(bytes); fis.close();return cipher.doFinal(dades); } // Crea una PKCS8EncodedKeySpec a partir del contingut del fitxer solució PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(bytes); (classe KeyFactory f = KeyFactory.getInstance("RSA"); return f.generatePrivate(spec); Desencriptar) } AM2 M9 curs 24/25 Carles Franquesa public static void desencripta() throws Exception { System.out.println("Desencriptant el contingut de l'arxiu prova_encriptada.txt..."); byte[] dades = dades(); PrivateKey clau = clau(); byte[] dades_desencriptades = desencriptaDades(dades, clau); // Escrivint les dades desencriptades en un fitxer FileOutputStream fos = new FileOutputStream(root + "prova_desencriptada.txt"); fos.write(dades_desencriptades); System.out.println("...dades desencriptades i guardades a l'arxiu prova_desencriptada.txt."); } 8 d’octubre de 2024 Sessió 3 AM2 M9 curs 24/25 Carles Franquesa 1 Criptografia i Java 1.2 Sistemes de xifrat asimètric 1.2.3 Xifrat RSA amb clau embolicada RSA sol encriptar en blocs que són gairebé de la mida de la clau. En l’RSA sempre s’hi afegeix padding, com a CRC, d’onze bytes. Més concretament, l’algorisme RSA només pot ser usat per xifrar dades de longitud:. longitud de les dades = (mida_clau RSA)/8 - 11 en bits! ergo, una clau de 2.048 bits només pot ser usada per xifrar fins a AM2 M9 curs 24/25 Carles Franquesa 245 bytes El problema: RSA és inviable per dades grans. A més, és un algorisme molt lent. La solució a tot plegat és fàcil: Enlloc de xifrar les dades amb clau asimètrica, les xifrem amb clau simètrica, i llavors xifrem amb clau asimètrica la clau simètrica usada, que són poques dades. 1 Criptografia i Java 1.2 Sistemes de xifrat asimètric 1.2.3 Xifrat RSA amb clau embolicada En un sistema de clau embolicada (wrapped key en anglès), les dades es xifren usant una clau simètrica d’un sol ús, generada a l’atzar. Aquesta clau llavors es xifra usant RSA amb la clau pública AM2 M9 curs 24/25 Carles Franquesa del destinatari del missatge. Finalment, s’envia al destinatari Alel missatge procés i la clau xifrades, d’encriptació conjuntament. de la clau simètrica l’anomenem embolicar, wrap, i al de desencriptació, unwrap. 1 Criptografia i Java 1.2 Sistemes de xifrat asimètric 1.2.3 Xifrat RSA amb clau embolicada public byte[][] encryptWrappedData(byte[] data, PublicKey pub) throws Exception { byte[][] encWrappedData = new byte[]; try { KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128); SecretKey sKey = kgen.generateKey(); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, sKey); byte[] encMsg = cipher.doFinal(data); AM2 M9 curs 24/25 Carles Franquesa cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.WRAP_MODE, pub); byte[] encKey = cipher.wrap(sKey); encWrappedData = encMsg; encWrappedData = encKey; return encWrappedData; } 1.3 Firma digital AM2 M9 curs 24/25 Carles Franquesa 1 Criptografia i Java 1.3 Firma digital Més enllà de la privadesa, ara requerim nous serveis en la seguretat. Integritat No-repudi Poder identificar si Evitar que l’autor un document ha Autenticació pugui negar que ell estat manipulat. Poder garantir ha generat el Aquest servei no quina és la document. El evita la identitat de l’autor receptor pot manipulació, només del document, demostrar a un fa possible que evitant que sigui tercer la identitat sempre pugui ser suplantat. de qui ha emès detectada pel realment el receptor. missatge. AM2 M9 curs 24/25 Carles Franquesa Permeten dur a terme intercanvis fiables de dades. nda de productes a ccions o la v e n d a telemàtica ment b anca en línia tz a r t r a ns ci ó d e la re r -v os a la reali fer la declara connecta... En definitiva, el que abans es feia amb firmes manuscrites, ara es resol amb tècniques criptogràfiques. La firma digital és el mecanisme criptogràfic que trasllada totes les propietats de la firma manuscrita del món físic a la informació en format digital. 1 Criptografia i Java 1.3 Firma digital Els sistemes de firma digital normalment es basen en un esquema de claus asimètriques. ssh-copy-id usuari@servidor_destí ssh-keygen -t rsa Però funcionen al revés. Abans la clau privada es feia servir per desencriptar, ara per encriptar. A més, abans la clau i el missatge encriptats AM2 M9 curs 24/25 Carles Franquesa remplaçaven el contingut original. Ara s’hi afegeix. JCE usa el mateix algorisme de xifrat per la firma digital, l’RSA. 1 Criptografia i Java 1.3 Firma digital 1.3.1 Generació de firma digital RSA Les claus per xifrar o firmar poden ser les mateixes. classe responsable de gestionar una firma digital public byte[] signaDades(byte[] dades, PrivateKey k) throws Exception { Signature s = Signature.getInstance("SHA1withRSA"); java.security.Signatur AM2 M9 curs 24/25 Carles Franquesa s.initSign(k); e s.update(dades); return s.sign(); } 1 Criptografia i Java Però funcionen al re vés. Abans la clau pr encriptar. ivada es feia servir 1.3 Firma digital per desencriptar, ar a per 1.3.2 Validació de firma digital RSA Les claus per xifrar o firmar poden ser les mateixes. classe responsable de validar una firma digital java.security.Signatur AM2 M9 curs 24/25 Carles Franquesa e public boolean validaSignatura(byte[] dades, byte[] firma, PublicKey k) throws Exception { Signature s = Signature.getInstance("SHA1withRSA"); s.initVerify(k); s.update(dades); return s.verify(firma); } 1 Criptografia i Java 1.3 Firma digital 1.3.3 Certificats digitals Un certificat digital és un document electrònic que estableix la identitat del propietari d’una clau pública clau pública del propietari normes Subject (identitat del propietari) relatives a la informació estàndard x.509 continguda en un certificat Issuer (identitat de l’emissor del digital http://www.ietf.org/rfc/rfc2459.txt certificat) AM2 M9 curs 24/25 Carles Franquesa data de caducitat firma digital, generada per l’emissor, de tota la informació continguda 15 d’octubre de 2024 Sessió 4 AM2 M9 curs 24/25 Carles Franquesa 1 Criptografia i Java 1.3 Firma digital 1.3.3 Certificats digitals El subject i l’issuer es codifiquen amb un distinguised name, DN, una estructura concreta que conté... CN common name O organització Components d’un DN DN OU departament (unitat de http://www.ietf.org/rfc/rfc2459.txt l’organització) AM2 M9 curs 24/25 Carles Franquesa L localitat CO codi país ST estat 1 Criptografia i Java 1.3 Firma digital 1.3.4 Emissió de certificats Qui genera els certificats digitals? = i ssuer ct subje Certificats autosignats, la identitat del propietari i l’emissor del certificat és la mateixa. El certificat està signat amb la clau privada de la pròpia clau pública continguda. Només és útil quan hi ha plena confiança entre les AM2 M9 curs 24/25 Carles Franquesa parts. ri nota Una autoritat de certificació, CA, és una tercera entitat capaç d’emetre certificats digitals. Entre els tràmits per obtenir una firma digital, hi ha la presencialitat, amb DNI davant la CA. CAT Ce r T t FNM 1.4 Gestió de claus AM2 M9 curs 24/25 Carles Franquesa 1 Criptografia i Java 1.4 Gestió de claus Generació Per generar un parell de claus des del sistema operatiu utilitzem la comanda C:\exercicis\DAM2\M9\UF1\ssh-keygen -t rsa -C "comentari qualsevol" Per defecte, crearà els arxius al directori C:\Usuaris\\.ssh. L’arxiu id_rsa (sense extensió) per la clau privada, i id_rsa.pub per la pública. AM2 M9 curs 24/25 Carles Franquesa Consulta De les claus públiques podem consultar el fingerprint i la randomart amb la comanda C:\Usuaris\\.ssh\ssh-keygen -lv -f id_rsa.pub 1 Criptografia i Java 1.4 Gestió de claus distribució En la gestió de les claus necessitem plena seguretat en diversos moments emmagatzemat ge Idealment, només les persones autoritzades podran accedir a claus secretes, ja siguin simètriques o privades. En la vida real, cal garantir almenys que fer-ho no sigui trivial. No es pot desar els bytes de la clau a un fitxer, ni guardar-los escrits en un paper. AM2 M9 curs 24/25 Carles Franquesa Un magatzem de claus, keystore, és un repositori que A més, cal facilitar poder treballar amb moltes claus. emmagatzema claus criptogràfiques i garanteix la protecció del contigut. En JCE, cada entry d’un arxiu *.jks s’identifica amb un àlies. Només es pot accedir aquestes claus des de Java. Un altre format admès és el *.jceks. Podem tenir una contrasenya per accedir al magatzem, i a més a més, una contrasenya específica per 1 Criptografia i Java 1.4 Gestió de claus 1.4.1 L’eina Keytool http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/k eytool.html. Keytool és un executable inclòs en el JDK, juntament amb el compilador i l’intèrpret. Permet gestionar magatzems de claus JKS i JCEKS desde línia de comandes. exercici AM2 M9 curs 24/25 Carles Franquesa a) Feu que es pugui executar l’eina keytool des de qualsevol directori del vostre ordinador. b) Consulteu el help. En el directori on tingueu els exercicis del M9, creeu un parell de claus amb àlies “claus_de_prova” amb l’algorisme RSA i mida de clau 2048, i guardeu-lo en un keystore anomenat magatzem_de_claus.jks exercici 1 Criptografia i Java 1.4 Gestió de claus 1.4.1 L’eina Keytool a) Feu que es pugui executar l’eina keytool des de qualsevol directori del vostre ordinador. b) Consulteu el help. En el directori on tingueu els exercicis del M9, creeu un parell soluci de claus amb àlies “claus_de_prova” amb l’algorisme RSA i mida de clau 2048, i guardeu-lo en un keystore anomenat magatzem_de_claus.jks ó a) Des de CMD (no persistent): 1. Consulteu la versió de Java que teniu instal·lada. 2. Averigüeu on teniu el JDK. 3. Consulteu el valor de la variable de sistema PATH. 4. Afegiu el directori on tingueu el JDK a la variable PATH. AM2 M9 curs 24/25 Carles Franquesa a) Des de GUI (persistent): Tauler de control > Sistema > Configuració avançada > Variables d’entornt > Path 1 Criptografia i Java 1.4 Gestió de claus 1.4.1 L’eina Keytool exercici a) Feu que es pugui executar l’eina keytool des de qualsevol directori del vostre ordinador. solució b) Consulteu el help. En el directori on tingueu els exercicis del M9, creeu un parell de claus amb àlies “claus_de_prova” amb l’algorisme RSA i mida de clau 2048, i guardeu-lo en un keystore anomenat magatzem_de_claus.jks b) Situeu-vos a la carpeta on tingueu els exercicis de DAM2\M9\UF1 C:\exercicis\DAM2\M9\UF1\ keytool -genkeypair -alias claus_de_prova -keyalg RSA -keysize 2048 - keystore magatzem_de_claus.jks -storepass Aa12345* AM2 M9 curs 24/25 Carles Franquesa 1 Criptografia i Java 1.4 Gestió de claus 1.4.2 Accés a un magatzem a través de codi Java classe per gestionar El procés per poder interactuar amb un magatzem de claus magatzems de claus amb JCE mitjançant una instància d’aquesta classe són tres passes, sempre igual. public KeyStore loadKeyStore(String ksFile, String ksPwd) throws Exception { javax.crypto.KeySt KeyStore ks = KeyStore.getInstance("JCEKS"); ore File f = new File (ksFile); if (f.isFile()) { 1. S’obté una FileInputStream in = new FileInputStream (f); instància del ks.load(in, ksPwd.toCharArray()); magatzem amb } getInstance() return ks; AM2 M9 curs 24/25 Carles Franquesa dient el tipus com } a paràmetre mètodes habituals: 2. S’inicialitza la instància mitjançant el mètode load(), de int size(): Quantes entrades té el magatzem. dos paràmetres: la ruta al fitxer i la contrasenya Key getKey(String alias, char[] pw): amb la qual es va protegir al ser Retorna una SecretKey o una PrivateKey. 3. Un cop inicialitzat, ja es creat. poden cridar lliurement els seus Certificate getCertificate(String alias): mètodes per consultar-ne el Retorna un Certificate desat amb l’alias.