UNIVERSITÀ DI CATANIA DIPARTIMENTO DI MATEMATICA E INFORMATICA CORSO DI LAUREA IN INFORMATICA, SECONDO LIVELLO Progetto di Sicurezza Implementazione di una demo che permetta di eseguire crittografia con diversi algoritmi Oreste Delitala W82000025 Anno 2013/2014 JCA e JCE 2 Linguaggio Java Java Cryptography Architecture (JCA) Java Cryptography Extension (JCE) Oreste Delitala W82000025 Anno 2013/2014 Java Cryptography Architecture (JCA) 3 MessageDigest Signature KeyPairGeneration KeyFactory CertificateFactory KeyStore AlgorithmParameters AlgorithmParameterGenerator SecureRandom Oreste Delitala W82000025 Anno 2013/2014 Architettura JCA 4 Factory pattern getIstance() MessageDigest Engine (abstract) MessageDigestSPI SPI (abstract) Strategy pattern CSP1MD5 CSP2MD5 CSP2SHA1 Providers Oreste Delitala W82000025 Anno 2013/2014 Provider 5 Un provider è un insieme di implementazioni di vari algoritmi SUN MD5, SHA-1 DSA Creazioni di certificati X.509 Generazione di numeri random proprietaria Keystore proprietario Oreste Delitala W82000025 Anno 2013/2014 Java Crtptography Extension JCE 6 ha la stessa architettura di JCA È costituita da javax.crypto e sotto-package Classi principali Cipher KeyAgreement Mac SecretKey SecretKeyFactor Oreste Delitala W82000025 Anno 2013/2014 Principali Provider per JCE 7 Bouncy Castke Open Source Provider più completo SunJCE Open Source Non compatibile con altri Provider Non supporta RSA Oreste Delitala W82000025 Anno 2013/2014 Cifratura Simmetrica 8 Principali classi ed interfacce Javax.crypto.Cipher getInstance, init, update, doFinal Java.security.Key(interfaccia) Creato da: Javax.crypto.KeyGenerator Java.security.KeyFactory Javax.crypto.KeyGenerator getInstance, init, generateKey Oreste Delitala W82000025 Anno 2013/2014 La classe Cipher 9 getInstance(“algorithm/mode/padding”, “provider”) Algorithm DES DESede AES Mode CBC ECB Padding PKCS5Padding NoPadding Oreste Delitala W82000025 Anno 2013/2014 La classe Cipher 10 init(mode, key) Cipher.ENCRYPT_MODE Cipher.DECRYPT_MODE update(bytes) doFinal(bytes) Oreste Delitala W82000025 Anno 2013/2014 Modalità ECB 11 Oreste Delitala W82000025 Anno 2013/2014 Modalità CBC 12 Oreste Delitala W82000025 Anno 2013/2014 I passi della cifratura ECB 13 Creazione di una chiave 1. 2. 3. KeyGenerator keyGenerator = KeyGenerator.getIstance(“DES”); keyGenerator.init(64); SecretKey key = keyGenerator.generateKey(); Creazione ed inizializzazione di un cifrario 1. Chiper cipher = Cipher.getInstance(“DES/ECB/PKCS5Padding”); Oreste Delitala W82000025 Anno 2013/2014 I passi della cifratura ECB 14 Cifratura 1. 2. cipher.init(Cipher.ENCRYPT_MODE, key); byte[] cipherText = cipher.doFinal(stringToEncrypt.getBytes()); Decifratura 1. 2. cipher.init(Cipher.DECRYPT_MODE, key); byte[] plainText = cipher.doFinal(cipherText); Oreste Delitala W82000025 Anno 2013/2014 I passi della cifratura CBC 15 Creazione di una chiave 1. 2. KeyGenerator keyGenerator = KeyGenerator.getInstance(“DES”); SecretKey key = keyGenerator.generateKey(); Creazione ed inizializzazione di un cifrario 1. 2. 3. 4. 5. 6. 7. byte[] randomBytes = new byte[8]; //iv size = block size SecureRandom random = new SecureRandom(); random.nextBytes(randomBytes); IvParameterSpec ivparams = new IvParameterSpec(randomBytes); Cipher cipher = Cipher.getInstance(“DES/CBC/PKCS5Padding”); Cipher.init(Cipher.ENCRYPT_MODE, key, ivparams); // cifratura Cipher.init(Cipher.DECRYPT_MODE, key, ivparams); // decifratura Oreste Delitala W82000025 Anno 2013/2014 Generare una chiave da una Stringa 16 1. 2. 3. 4. 5. String password = “password”; byte[] desKeyData = password.getBytes(); DESKeySpec desKeySpec = new DESKeySpec(desKeyData); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey key = keyFactory.generateSecret(desKeySpec); Oreste Delitala W82000025 Anno 2013/2014 Sicurezza Cifratura Simmetrica 17 ECB CBC Proteggere l’IV DES Vulnerabile alla critto analisi Chiave a 64 bit vulnerabile all’attacco del compleanno DESede Chiave sicura a 192 bit Blocchi da 64 bit troppo piccoli AES Sicuro perché usa chiave e blocco di lunghezza 128 bit Oreste Delitala W82000025 Anno 2013/2014 Cifratura Asimmetrica 18 Generalmente usata per cifrare dati di “piccole” dimensioni (in bit) Per “grandi” dimensioni si utilizza la cifratura asimmetrica a chiave di sessione ( e, d) un public-private key pair P un “grande” payload K newSimmetricKey() M = [ Ek(P), Ee(K) ] Oreste Delitala W82000025 Anno 2013/2014 Cifratura Asimmetrica 19 Principali classi ed interfacce java.security.KeyPair getPublic(), getPrivate() java.security.PublicKey(interfaccia) javax.crypto.PrivateKey(interfaccia) Java.security.KeyPairGenerator genKeyPair() Oreste Delitala W82000025 Anno 2013/2014 La classe Cipher 20 getInstance(“algorithm/mode/padding”, provider) Algorithm RSA Mode ECB Padding NoPadding PKCS1Padding OAEPWithSHA-1AndMGF1Padding OAEPWithSHA-256AndMGF1Padding Oreste Delitala W82000025 Anno 2013/2014 La classe Cipher 21 init(mode, key) Cipher.ENCRYPT_MODE publicKey Cipher.DECRYPT_MODE privateKey update(bytes) doFinal(bytes) Oreste Delitala W82000025 Anno 2013/2014 OAEP 22 Oreste Delitala W82000025 Anno 2013/2014 I passi della cifratura 23 Creazione di una chiave 1. 2. 3. 4. 5. KeyPairGenerator generator = KeyPairGenerator.getIstance(“RSA”); keyGenerator.init(1024); KeyPair pair = generator.generateKeyPair(); Key pubKey = pair.getPublic(); Key privKey = pair.getPrivate(); Creazione ed inizializzazione di un cifrario 1. Chiper cipher = Cipher.getInstance(“RSA/ECB/PKCS1Padding”); Oreste Delitala W82000025 Anno 2013/2014 I passi della cifratura 24 Cifratura 1. 2. cipher.init(Cipher.ENCRYPT_MODE, pubKey); byte[] cipherText = cipher.doFinal(stringToEncrypt.getBytes()); Decifratura 1. 2. cipher.init(Cipher.DECRYPT_MODE, privKey); byte[] plainText = cipher.doFinal(cipherText); Oreste Delitala W82000025 Anno 2013/2014 Codifica e decodifica di chiavi (RSA) 25 Codifica: Chiave pubblica: X.509 Chiave privata: PKCS#8 Oreste Delitala W82000025 Anno 2013/2014 Codifica e decodifica di chiavi (RSA) 26 Decodifica Public key 1. 2. 3. KeyFactory keyFactory = KeyFactory.getInstance("RSA"); X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(keyBytes); PublicKey publicKey = keyFactory.generatePublic(publicKeySpec); Private key 1. 2. 3. KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(keyBytes); PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec); Oreste Delitala W82000025 Anno 2013/2014 Sicurezza Crittografia Asimmetrica 27 Problema della Fattorizzazione Oreste Delitala W82000025 Anno 2013/2014 HMAC 28 Oreste Delitala W82000025 Anno 2013/2014 HMAC 29 Classe Javax.crypto.Mac getInstance(“algorithm”, “provider”) Algorithm HmacSHA1 HmacSHA256 init(key) update(bytes) doFinal() Oreste Delitala W82000025 Anno 2013/2014 I passi di cifratura 30 Generazione di una chiave Creazione di un oggetto MAC Mac mac = Mac.getInstance(“HmacSHA1”); Inizializzazione del MAC KeyGenerator keygen = KeyGenerator.getInstance("HmacSHA1"); Key macKey = keygen.generateKey(); mac.init(macKey); Restituzione del MAC mac.update(text.getByte()) byte[] result = mac.doFinal(); Oreste Delitala W82000025 Anno 2013/2014 I passi di cifratura 31 Verifica del MAC si prende in input (message, mac) si calcola il mac di message con la chiave segreta si confrontano i 2 mac se sono uguali Oreste Delitala W82000025 Anno 2013/2014 Sicurezza HMAC 32 Attacchi Replay Soluzione Cifrare il Digest Simmetrica CBC Asimmetrica Valore segreto SAB condiviso HMAC(SAB||M) Non si ha sicurezza su chi ha eseguito l’HMAC tra mittente e ricevente Oreste Delitala W82000025 Anno 2013/2014 Firma Digitale 33 Classe principale java.security.Signature getInstance(“algorithm”,”provider”) Algorithm SHA1withDSA initSign(privKey), initVerify(pubKey) update(bytes) sign() verify(sign) Oreste Delitala W82000025 Anno 2013/2014 I passi di cifratura 34 Generazione di una coppia di chiavi 1. 2. 3. 4. KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN"); SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN"); keyGen.initialize(1024, random); KeyPair keyPair = keyGen.generateKeyPair(); Generazione di un Signature engine 1. Signature sig = Signature.getInstance("SHA1withDSA", "SUN"); Oreste Delitala W82000025 Anno 2013/2014 I passi di cifratura 35 Generazione della firma digitale 1. 2. 3. sig.initSign(privKey); sig.update(data); byte[] signBytes = sig.sign(); Verifica della firma digitale 1. 2. 3. 4. 5. 6. 7. sig.initVerify(pubKey); sig.update(data); try{ verified = sig.verify(signBytes); } catch(SignatureException e){ verified = false; } Oreste Delitala W82000025 Anno 2013/2014 Sicurezza Firma Digitale 36 Non repudiabilità Oreste Delitala W82000025 Anno 2013/2014