Crittografia e Certificati
Crittografia Classica
La crittografia ha una storia millenaria.
Sicurezza della Crittografazione
Incondizionatamente Sicura
- Il testo cifrato non contiene abbastanza informazioni per determinare univocamente il testo in chiaro corrispondente, per qualsiasi quantità di testo in chiaro
- Solo One-Time-Pads
- Normalmente i testi lunghi crittografati con la stessa chiave aumentano la probabilità di successo di crittanalisi
Computazionalmente Sicura
- Il costo della decrittografazione è superiore al valore dell’informazione crittografata
- Il tempo richiesto per la decrittografazione supera la vita utile dell’informazione
Principio di Kerckhoffs
Legge di base della crittografia
“il faut qu’il puisse sans inconvénient tomber entre les mains de l’ennemi” - Auguste Kerckhoffs (1835-1903), Fiammingo (La cryptographie militaire, 1883)
“the enemy knows the system being used” - Shannon, 1949
Assumere che il nemico conosca gli algoritmi usati,
Contrario di: Security through Obscurity
Attacchi di Crittanalisi
Cifrario Perfetto
Cifrario perfetto se M e C sono indipendenti:
Prob (M=M’) = Prob (M=M’ | C=C’)
Lunghezza chiave > Lunghezza testo in chiaro
Modern Cryptography
Digitale e basata su due aspetti:
Algoritmi:
- Procedure matemetiche per la crittazione e decrittazione di dati
- Implementati come programmi, routines, funzioni
Tutti i maggiori algoritmi sono ben noti.
E' considerato sicuro un algoritmo noto se ha una implementazione Open Source. E' considerato insicuro un algoritmo proprietario e privato.
Chiavi:
- Sequenze di bit usati nella crittazione e decrittazione
- Configurate manualmente, note solo ai partecipanti
La sicurezza sta nelle chiavi.
Diffusione e Confusione
Diffusione:
- Dissipa la struttura statistica del testo in chiaro
- Il testo cifrato non ha strutture statistiche a corto raggio
- Cifra a blocchi binaria: permutazione + funzione (reversibile)
- Al cambiare di un bit del messaggio in chiaro cambiano in media il 50% dei bit del messaggio crittato
Confusione:
- Complica al massimo la relazione tra la statistica del testo cifrato e il valore della chiave di cifratura
- Al cambiare di un bit della chiave cambiano in media il 50% dei bit del messaggio crittato
Cifra di Feistel
Esempio di Rete a Sostituzione-Permutazione - (Substitution-Permutation Network SPN - Shannon).
Fondamento dei principali algoritmi moderni di crittografazione.
- Un blocco di testo in chiaro è diviso in due metà: Destra e Sinistra
- Vi sono più Sottochiavi, una per ciclo, derivate dalla Chiave primaria e tutte differenti
- N cicli, in ciascuno dei quali si ha:
- una Sostituzione sulla metà Sinistra:
- una Funzione di Ciclo sulla metà Destra, parametrizzata dalla Sottochiave di ciclo
- un OR esclusivo del risultante con la metà Sinistra
- una Permutazione: interscambio delle metà Destra e Sinistra
Tutti i maggiori algoritmi di crittografazione moderni sono derivati dai concetti di Cifra di Feistel
Gestione Chiavi
Chiavi Singole
Definizione: Chiave = Stringa di caratteri = Sequenza di Bit
- La stessa chiave K crittografa e decrittografa il messaggio
- Il messaggio non cambia di lunghezza da Chiaro a Crittografato
- L'algoritmo di crittografazione è relativamente veloce
La chiave deve transitare da mittente a destinazione. Il canale per le chiavi è diverso dal canale per i messaggi:
- più sicuro
- più costoso (es. Umano)
Non ne vale la pena per singoli messaggi.
Proprietà delle Chiavi
La crittografazione è un’algebra lineare.
Sia M:messaggio in chiaro, C:messaggio crittografato, E(K)[]:funzione di crittografazione con chiave K, D(K)[]:funzione di decrittografazione con chiave K
Si ha:
C=E(K)[M] M=D(K)[C] M=D(K)[E(K)[M]]
In un’algebra lineare la rappresentazione può usare funzioni lineari, matrici od operatori lineari.
Usando operatori lineari e confondendo crittografazione e decrittografazione, rappresentate con la sola chiave K (le sottochiavi sono invertite):
C=KM M=KC M=KKM
cioè KK=Identità
Interscambio Messaggi
Chiavi Doppie
Da una stringa casuale S un algoritmo genera due chiavi particolari dette:
- Chiave pubblica U
- Chiave priv*ata P
Algoritmi: RSA
, Diffie-Hellmann
, ...
Il messaggio è crittografato con una delle chiavi e può venir decrittografato solo con l’altra.
La chiave Pubblica viene inviata ad un Deposito Chiavi da cui tutti possono prelevarla oppure configurata nel software di comunicazione.
La chiave Privata viene mantenuta segreta e non circola mai in rete.
Confidenzialità del Messaggio
Spesso è desiderata la segretezza (riservatezza, confidenzialità) del messaggio.
Il messaggio viene crittografato dal mittente con la chiave pubblica del destinatario.
Solo chi è in possesso della chiave privata corrispondente, cioè il destinatario, può decrittografare il messaggio.
Assicurazione di Provenienza
Non sempre si desidera che il messaggio sia confidenziale, può essere necessario invece assicurarsi dell’identità del mittente.
In tal caso il mittente crittografa il messaggio in partenza con la propria chiave privata.
Tutti lo possono decrittografare avendo così l’assicurazione formale che solo il mittente l’abbia potuto inviare.
Confidenzialità ed Assicurazione di Provenienza possono ottenersi entrambi indipendentemente e simultaneamente.
Necessità di un Programma di gestione, p.es. PGP (Pretty Good Privacy).
In pratica l’uso delle chiavi doppie è troppo lento (10000 volte più delle chiavi singole);
- OK per commutazione di messaggio
- NO per commutazione di pacchetto
Ma: la lunghezza delle chiavi singole è ca. 128 bit
Quindi:
- Usare le chiavi doppie per interscambiare una chiave singola in modo sicuro
- Poi usare la chiave singola per crittografare il messaggio
Concetto di Chiave di Sessione
Chiave di Sessione
The sender initially encrypts a single key (session key) and sends it to the receiver The rest of the communication session is encrypted with that single key
Message Authentication Code
Message Authentication Code (MAC): checksum crittografico allegato al messaggio.
Lo schema di checksum non deve necessariamente essere reversibile.
Funzione di Hash
- Input: stream di bit di qualsiasi lunghezza
- Output: stream di bit di lunghezza fissa
- anche detto: Segnatura
- Collisione: due stream di input diversi che danno la stessa segnatura - computazionalmente impossibile
Proprietà:
- Funzione non invertibile
- Tipicamente usa iterazione di passi con compressione dei risultati intermedi
- Attacchi di forza bruta: dipendono dalla lunghezza della segnatura
- Alternativamente metodi crittanalitici complessi
- Reperire collisioni nei passi intermedi
Firma Elettronica
Mittente:
- Calcolare una funzione di hash del messaggio
- Crittarla con chiave privata e appenderla al messaggio
Ricevente:
- Estrarre la funzione di hash e decrittarla con chiave pubblica del mittente
- Applicare la funzione di hash al messaggio
- Se coincidono la firma è verificata
Non repudiabilità dei messaggi firmati.
Definizioni Italiane
Definizioni giuridiche un po' imprecise dal punto di vista tecnico:
- Firma elettronica (FE)
- Metodo per identificare l'autore di un'operazione informatica o di un documento informatico
- Firma elettronica avanzata (FEA)
- FE che consente il controllo esclusivo del mezzo di firma da parte del firmatario, e permette di verificare l'integrità del documento firmato
- Firma elettronica qualificata (FEQ)
- FEA basata su un certificato qualificato e realizzata mediante un dispositivo sicuro per la creazione della firma
- Firma digitale (FD)
- FEA basata su un certificato qualificato e realizzata con la tecnica della crittografia asimmetrica
Non esistono al momento tecnologie di firme qualificate che non siano digitali.
Il dispositivo di firma della FEQ è opzionale, poichè FEQ ed FD producono i medesimi effetti giuridici.
Dispositivo di Firma
Apparato elettronico in grado di generare firme digitali e di fornire autenticazione on line tramite certificato.
Formato tipico: Card simile a carta di credito.
- Anche su chiavi USB
- Ospita un chip avanzato crittografico
- Necessario l'apposito lettore e software
- Conserva a bordo la chiave privata dell'utente
- Obbligatorio per Firma Qualificata ma non per Firma Digitale
- Non è clonabile
Un'altra soluzione moderna è di ospitare la chiave privata a bordo di uno Smartphone.
Il tentativo di accesso ai dati mediante apparati elettronici di violazione provoca di solito la perdita dei dati contenuti.
- Accesso tramite PIN
- Numero massimo di tentativi - blocco card o programma
- Sbloccare con PUK (personal unlock code)
NOTA
Il fallimento di accesso, avaria o perdita del dispositivo di firma rende inverificabili tutti i documenti firmati con tale dispositivo
Certificati
Identità e Fiducia
In un Deposito Chiavi una chiave necessita di un identificativo univoco del possessore:
- Indirizzo di posta elettronica
Problemi:
- Come si può essere certi che la chiave appartiene alla persona indicata?
- Come si può essere certi dell'identità di un corrispondente nel mondo informatico?
- Come ci si può fidare della verità delle asserzioni di un documento informatico?
Soluzione:
- Trasferimento della fiducia dal soggetto finale ad altri:
- Più enti arzialmente fidati: raccomandazioni
- Singolo ente completamente fidato: certificazioni
Verifica: Scenario Possibile
In Pratica
Il deposito chiavi non esiste:
- Qualche eccezione: MIT Key Server
- Sarebbero troppi, problemi di sicurezza e di privacy
- Soprattutto problemi politici (affrontabili tecnicamente)
- es: Planetary Citizen Registry (1971)
L'utente vuole potersi fidare in assenza dell'ente di verifica o di connessione.
- Necessaria la chiave pubblica del soggetto, non modificata
Struttura di un certificato soggetto:
E' necessaria anche la chiave privata del certificatore. per decrittare il certificato:
La chiave privata è di solito precaricata sul SW dell'utente.
Certificati Speciali
Certificate Chain:
Self-signed Certificate (Root CA):
Uso del Certificato
Esempio della situazione con SSL/TLS.
Standard X509
Standard della ITU-T sui Certificati.
- Basato su crittografia a chiave doppia e firma elettronica
- Definisce i tracciati record dei Certificati
- 3 versioni principali
- Prevede Liste di Revoca dei Certificati
Imposta unastruttura gerarchica degli enti di certificazione
- Certifying Authority (CA)
- Public Key Infrastructure (PKI)
Public Key Infrastructure
Per PKI s’intende l’infrastruttura necessaria per consentire un uso appropriato ed efficiente di una serie di funzionalità legate alla crittografia a chiave pubblica quali la firma digitale, l’autenticazione, la cifratura/decifratura e la marcatura temporale dei documenti.
PKI è una infrastruttura per la gestione di chiavi pubbliche e non una infrastruttura pubblica per la gestione chiavi.
OpenSSL
E' un toolkit Open Source robusto, sicuro e completo per la gestione di protocolli Transport Layer Security (TLS) e Secure Sockets Layer (SSL).
E' anche una libreria generica con molte utility crittografiche.
openssl
OpenSSL> help
Standard commands
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dhparam
dsa dsaparam ec ecparam
enc engine errstr gendsa
genpkey genrsa help list
nseq ocsp passwd pkcs12
pkcs7 pkcs8 pkey pkeyparam
pkeyutl prime rand rehash
........
openssl comando opzioni argomenti
Certificate Request
Creazione di una nuova Chiave Privata e Certificate Signing Request:
openssl req -out geekflare.csr -newkey rsa:2048 -nodes -keyout geekflare.key
Generating a RSA private key
............
writing new private key to 'geekflare.key'
-----
You are about ....
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:NSW
Locality Name (eg, city) []:Sydney
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:Development
Common Name (e.g. server FQDN or YOUR name) []:geekflare.com
Email Address []:boss@geekflare.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []:GeekFlare
Self-Signed Certificate
Creazione di un Self-Signed Certificate per una Root CA:
openssl req -x509 -sha256 -nodes -newkey rsa:2048 -keyout gfselfsigned.key -out gfcert.pem
Generating a RSA private key
..........
writing new private key to 'gfselfsigned.key'
-----
You are about to be asked ...
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:Washington
Locality Name (eg, city) []:Seattle
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Microsoft
Organizational Unit Name (eg, section) []:World Control
Common Name (e.g. server FQDN or YOUR name) []:world.ms.com
Email Address []:galacticboss@ms.com
Configurazione di CA
Creare un file minimo di configurazione per una CA:
vim ca.conf
[ ca ]
default_ca = ca_default
[ ca_default ]
dir = ./ca
certs = $dir
new_certs_dir = $dir/ca.db.certs
database = $dir/ca.db.index
serial = $dir/ca.db.serial
RANDFILE = $dir/ca.db.rand
certificate = $dir/ca.crt
private_key = $dir/ca.key
default_days = 365
default_crl_days = 30
default_md = md5
preserve = no
policy = generic_policy
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = optional
emailAddress = optional
Infrastruttura CA
Creare la directory di database del CA ed alcune altre directory e file necessari, che manterranno informazioni sui certificati emessi:
mkdir ca
cd ca
mkdir ca.db.certs
touch ca.db.index
echo "1234" > ca.db.serial
cd ..
Copiare il certificato autofirmato (root CA certificate) e chiave privata alla directort CA.
cp gfcert.pem ca/ca.crt
cp gfselfsigned.key ca/ca.key
Generare un Certificato
Firmare una Certificate Request e generare un certificato:
openssl ca -config ca.conf -out certificate.pem.crt -infiles geekflare.csr
Using configuration from ca.conf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'AU'
stateOrProvinceName :ASN.1 12:'NSW'
localityName :ASN.1 12:'Sydney'
organizationName :ASN.1 12:'Internet Widgits Pty Ltd'
organizationalUnitName:ASN.1 12:'Development'
commonName :ASN.1 12:'geekflare.com'
emailAddress :IA5STRING:'boss@heekflare.com'
Certificate is to be certified until Sep 8 09:19:15 2022 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Altre Operazioni
Verificare il file CSR:
openssl req -noout -text -in geekflare.csr
Da in output il contenuto ASCII della richiesta.
Creare una chiave privata RSA:
openssl genrsa -out private.key 2048
Verificare una chiave privata:
openssl rsa -in private.key --check
Verificare la Certificate Signer Authority:
openssl x509 -in certificate.pem.crt -noout -issuer -issuer_hash
issuer=C = US, ST = Washington, L = Seattle, O = Microsoft,
OU = World Control, CN = world.ms.com,
emailAddress = galacticboss@ms.com
2f06f056
Controllare il valore hash di un certificato:
openssl x509 -noout -hash -in certificate.pem.crt
c414604e
HTTPS Server in Docker
Preparare la directory di progetto:
mkdir -p ~/docker/08nginx-cert
cd ~/docker/08nginx-cert
Preparare un Self Signed Certificate:
openssl req -x509 -nodes -days 365 \
-subj "/C=CA/ST=QC/O=Example Inc./CN=example" \
-addext "subjectAltName=DNS:example.com" \
-newkey rsa:2048 -keyout server.key \
-out server.crt
Run del server col certificato:
docker run -d -v $PWD:/etc/ssl/private/ -v $PWD:/etc/ssl/certs/ \
-e CRT=server.crt -e KEY=server.key \
-p 80:80 -p 443:443 --name one mpineault/nginx-alpine-ssl
Collegarsi con un browser a https://localhost