Seguretat i Criptografia - 1 Criptografia i java PDF
Document Details
Carles Franquesa
Tags
Summary
Aquest document proporciona una visió general sobre la seguretat i la criptografia en el context de la programació Java. S'expliquen conceptes clau com la criptografia i com es pot utilitzar a Java. El document inclou exemples de codi (fragments de codi/snippets).
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. 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 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. Seguretat i criptografia 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 Oficial de Protecció de Dades (LOPD) obliga a assegurar la informació preveient multes de fins centenars de milers d’euros pels casos més greus en els quals no es faci com cal. DAM2 M9 curs 24/25 Carles Franquesa Hi ha entorns on ni tan sols és possible implantar una aplicació sense garantir la seguretat de les dades tractades (hospitals, 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. 1 Criptografia i Java 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 vostre equip. D’altra banda, veureu com establir connexions segures a servidors d’Internet. 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 1.3.1 Generació de firma digital RSA DAM2 M9 curs 24/25 Carles Franquesa 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 Sistemes de xifrat simètric DAM2 M9 curs 24/25 Carles Franquesa 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 hi estiguin autoritzats. La criptografia (escriptura secreta, del grec kryptos, amagat o secret, i graphein, escriptura) és la disciplina matemàtica que s’encarrega d’estudiar com protegir la informació mitjançant la seva transformació, especialment mitjançant codis o xifrant. El paquet JCE (Java Cryptography Extension) és una biblioteca que ofereix Java per poder executar diferents algorismes de xifrat als vostres programes algorisme de xifrat DAM2 M9 curs 24/25 Carles Franquesa dades 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 conjunt de dades incomprensibles. DAM2 M9 curs 24/25 Carles Franquesa 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 l’alfabet, es torna a començar pel principi. exercici DAM2 M9 curs 24/25 Carles Franquesa 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 DAM2 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); sKey = kgen.generateKey(); DAM2 M9 curs 24/25 Carles Franquesa javax.crypto.SecretKey } catch (NoSuchAlgorithmException ex) { javax.crypto.KeyGenerator } System.err.println("Generador no disponible."); } 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 diferents. Un algorisme de hash, o resum (digest, en anglès), és una transformació criptogràfica que es pot aplicar a un conjunt de dades de manera que per molts elements que pugui tenir el conjunt de dades, la transformació tindrà una mida fixa. DAM2 M9 curs 24/25 Carles Franquesa SHA-1 (Secure Hash Algorithm 1) Argon2 160 bits. Insegur degut a l’excés de Per emmagatzemar col·lisions. contrasenyes, SHA-256 (256 bits) resistent als atacs Aplicacions de de força bruta. seguretat, incloent criptografia, blockchain Bcrypt (com Bitcoin) i MD5 (Message Digest Per emmagatzemar certificats digitals. Algorithm 5) contrasenyes. SHA-3 (2015) Molt usat abans, Inclou un factor de cost SHA-2 amb millores massa col·lisions per augmentar la en seguretat. dificultat de 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 claus try { simètriques basades en contraseya byte[] data = text.getBytes("UTF−8"); MessageDigest md = MessageDigest.getInstance("SHA−256"); byte[] hash = md.digest(data); byte[] key = Arrays.copyOf(hash, keySize/8); javax.crypto.SecretKey DAM2 M9 curs 24/25 Carles Franquesa sKey = new SecretKeySpec(key, "AES"); } javax.crypto.MessageDigest catch (Exception ex) { System.err.println("Error generant la clau:" + ex); } } return sKey; } 1 Criptografia i Java 1.1 Sistemes de xifrat simètric 1.1.3 Xifrat AES en mode ECB 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 DAM2 M9 curs 24/25 Carles Franquesa La identificació d’un algorisme consta de les tres dades l’ordre dels blocs no AES/ECB/PKCS5Padding s’encripta! 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 DAM2 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 public byte[] encryptData(SecretKey sKey, byte[] data) { paquet de Java per al xifrat byte[] encryptedData = null; d’informació try { 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); } return encryptedData; DAM2 M9 curs 24/25 Carles Franquesa } per desencriptar, seria DECRYPT_MODE 1 d’octubre de 2024 Sessió 2 DAM2 M9 curs 24/25 Carles Franquesa 1 Criptografia i Java 1.1 Sistemes de xifrat simètric 1.1.4 Xifrat AES en mode CBC 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 resultat del bloc anterior. DAM2 M9 curs 24/25 Carles Franquesa El procediment de xifrat i desxifrat resulta molt més costós. Cal disposar de tot el missatge per poder-se desxifrar. 1 Criptografia i Java 1.1 Sistemes de xifrat simètric 1.1.4 Xifrat AES en mode CBC 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) { System.err.println("Error xifrant les dades: " + ex); DAM2 M9 curs 24/25 Carles Franquesa } 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. Sistemes de xifrat asimètric DAM2 M9 curs 24/25 Carles Franquesa 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. DAM2 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 Una clau asimètrica (o sigui, un parell de claus pública-privada) ha de complir certes propietats matemàtiques. En l’RSA, la clau asimètrica és el producte de dos nombres primers molt grans. Habitualment, ocupen 256 bytes, o sigui 2048 bits. en Java, el long ocupa 8 bytes paquet de Java per generar public KeyPair randomGenerate(int len) { parells de claus asimètriques KeyPair keys = null; try { DAM2 M9 curs 24/25 Carles Franquesa KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); java.security.KeyPairGenerator keyGen.initialize(len); keys = keyGen.genKeyPair(); } catch (Exception ex) { PrivateKey getPrivate() PublicKey getPublic() System.err.println("Generador no disponible."); } 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. 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); encryptedData = cipher.doFinal(data); DAM2 M9 curs 24/25 Carles Franquesa } 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 C:\exercicis\dam2\uf1\rsa\prova_encriptada.txt DAM2 M9 curs 24/25 Carles Franquesa 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 imports) 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 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 desencriptada co public static int menu() { 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; } public static void main(String[] args) throws Exception { DAM2 M9 curs 24/25 Carles Franquesa 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, PublicKey Feu un programa k) encriptar en Java per throws Exception i desencriptar { de el contingut Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding","SunJCE"); C:\exercicis\dam2\uf1\rsa\prova.txt cipher.init(Cipher.ENCRYPT_MODE, k); El programa ha d’oferir les dues opcions. return cipher.doFinal(dades); 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 C:\exercicis\dam2\uf1\rsa\prova_encriptada.txt public I quan desencripti 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 desencriptada co keyGen.initialize(2048); 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; return k; while ((line = br.readLine()) != null) { DAM2 M9 curs 24/25 Carles Franquesa } 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 static el byte[] desencriptaDades(byte[] dades, PrivateKey clau) throws C:\exercicis\dam2\uf1\rsa\prova_encriptada.txt Exception { // Llegeix contingut del fitxer.der 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); byte[] bytescipher = new = Lògicament, el resultat final ha de ser que el contingut de la prova i de la prova desencriptada co Cipher.getInstance("RSA/ECB/PKCS1Padding"); byte[(int) file.length()]; 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 Desencriptar) KeyFactory f = KeyFactory.getInstance("RSA"); return f.generatePrivate(spec); } DAM2 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 DAM2 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 245 bytes DAM2 M9 curs 24/25 Carles Franquesa 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 del destinatari del missatge. Finalment, s’envia al destinatari el missatge i la clau xifrades, conjuntament. DAM2 M9 curs 24/25 Carles Franquesa Al procés d’encriptació 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); cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); DAM2 M9 curs 24/25 Carles Franquesa cipher.init(Cipher.WRAP_MODE, pub); byte[] encKey = cipher.wrap(sKey); encWrappedData = encMsg; encWrappedData = encKey; return encWrappedData; } Firma digital DAM2 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 un Evitar que l’autor Autenticació pugui negar que ell ha document ha estat Poder garantir quina generat el document. manipulat. Aquest és la identitat de El receptor pot servei no evita la l’autor del demostrar a un tercer manipulació, només fa document, evitant la identitat de qui ha possible que sempre que sigui suplantat. emès realment el pugui ser detectada pel receptor. missatge. DAM2 M9 curs 24/25 Carles Franquesa Permeten dur a terme intercanvis fiables de dades. 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 remplaçaven el contingut original. Ara s’hi afegeix. DAM2 M9 curs 24/25 Carles Franquesa 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.Signature s.initSign(k); DAM2 M9 curs 24/25 Carles Franquesa s.update(dades); return s.sign(); } 1 Criptografia i Java 1.3 Firma digital 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.Signature DAM2 M9 curs 24/25 Carles Franquesa 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 relatives Subject (identitat del propietari) a la informació continguda en un certificat digital estàndard x.509 Issuer (identitat de l’emissor del certificat) http://www.ietf.org/rfc/rfc2459.txt DAM2 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 DAM2 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 l’organització) http://www.ietf.org/rfc/rfc2459.txt DAM2 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? 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 parts. DAM2 M9 curs 24/25 Carles Franquesa 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. Gestió de claus DAM2 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. DAM2 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 emmagatzematge 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. A més, cal facilitar poder treballar amb moltes claus. Un magatzem de claus, keystore, és un repositori que emmagatzema DAM2 M9 curs 24/25 Carles Franquesa 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 cada entry. 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/keytool.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 a) Feu que es pugui executar l’eina keytool des de qualsevol directori del vostre DAM2 M9 curs 24/25 Carles Franquesa 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 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. 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 solució 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. DAM2 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. b) Consulteu el help. En el directori on tingueu els exercicis del M9, creeu un parell de solució 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* DAM2 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 magatzems El procés per poder interactuar amb un magatzem de claus mitjançant de claus amb JCE una instància d’aquesta classe són tres passes, sempre igual. javax.crypto.KeyStore public KeyStore loadKeyStore(String ksFile, String ksPwd) throws Exception { KeyStore ks = KeyStore.getInstance("JCEKS"); 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; DAM2 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 dos paràmetres: int size(): Quantes entrades té el magatzem. la ruta al fitxer i la contrasenya amb la qual es va protegir al ser creat. Key getKey(String alias, char[] pw): Retorna una SecretKey o una PrivateKey. 3. Un cop inicialitzat, ja es poden cridar lliurement els seus mètodes Certificate getCertificate(String alias): per consultar-ne el contingut. Retorna un Certificate desat amb l’alias.