Derivazione di una chiave crittografica: differenze tra le versioni

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
Contenuto cancellato Contenuto aggiunto
Mr Wolf (discussione | contributi)
Revisiono voce - numerose modifiche
Riga 1: Riga 1:
{{F|crittografia|maggio 2012|Mancano del tutto le sezioni Note/Bibliografia/Collegamenti esterni}}
{{F|crittografia|maggio 2012|Mancano del tutto le sezioni Note/Bibliografia/Collegamenti esterni}}
Derivare una chiave crittografica significa ricavare una o più [[chiave crittografica|chiavi crittografiche]] da una chiave principale (in inglese detta solitamente ''master key'') o da altra informazione disponibile, ad esempio una [[password]] o una [[passphrase]]. <ref>{{cite book|author=Bezzi, Michele|chapter=Data privacy|editors=Camenisch, Jan|title=Privacy and Identity Management for Life|publisher=Springer|year=2011|isbn=9783642203176|pages=185–186|url=https://books.google.com/books?id=vYxzh3C6OPUC&pg=PA185|display-authors=etal|display-editors=etal}}</ref><ref>{{cite web|author=Kaliski, Burt|author2=[[RSA Laboratories]] |title=RFC 2898 – PKCS #5: Password-Based Cryptography Specification, Version 2.0|work=IETF|url=https://www.ietf.org/rfc/rfc2898.txt}}</ref> Ciò viene fatto in base ad una opportuna '''funzione di derivazione''' della chiave (in inglese ''Key derivation function'' o KDF) che ricava la chiave derivata a partire da dati noti. Una diffusa applicazione della derivazione di una chiave è in [[HMAC]].
Derivare una chiave crittografica significa definire una '''funzione di derivazione''' della chiave (in inglese ''Key derivation function'' o KDF) che fa derivare una o più [[chiave crittografica|chiavi segrete]] da informazioni segrete e/o altre informazioni, che invece sono note.
Un algoritmo di derivazione della chiave (v. ad esempio PBKDF2), a partire da un valore arbitrario in ingresso (una stringa o un array di larghe
dimensioni) deriva in modo ''crittograficamente sicuro'' (ovvero non è possibile abbreviare il calcolo con una qualche scorciatoia) una chiave di
dimensioni adatte alla cifratura.
Questo fa sì che sia possibile imporre un dato tempo computazionale per generare una chiave, nota la password (o una qualsivoglia informazione segreta), in modo che un attaccante che provi un [[metodo forza bruta|attacco a forza bruta]] o anche solo un [[attacco a dizionario]] si trovi rallentato (in modo non bypassabile) nelle operazioni.
Unendo alla password un valore pseudocasuale, che non ha bisogno di restare segreto (seed o salt), in ingresso alla funzione di derivazione della password si fa in modo che l'avversario non possa nemmeno precomputare le chiavi corrispondenti alle password più provabili, perché saranno diverse al cambiare del salt, e quindi diverse per ogni file cifrato.


Un algoritmo di derivazione della chiave (v. ad esempio PBKDF2), a partire da un valore arbitrario in ingresso (una stringa o un array di larghe dimensioni) calcola in modo ''crittograficamente sicuro'' (ovvero non è possibile abbreviare il calcolo con una qualche scorciatoia) una chiave di dimensioni adatte alla cifratura.
==Uso della derivazione di chiave==
Questo fa sì che sia possibile imporre un dato tempo computazionale per generare una chiave, nota la password (o una qualsivoglia informazione segreta), in modo che un attaccante che provi un [[metodo forza bruta|attacco a forza bruta]] o anche solo un [[attacco a dizionario]] si trovi rallentato (in modo non bypassabile) nelle operazioni.
Le funzioni di derivazione di chiave sono [[hash|funzioni di hash]] crittografiche, spesso usate in congiunzione con parametri non segreti per derivare una o più chiavi da una stessa informazione segreta. Un suo utilizzo può evitare che un attaccante che entri in possesso della chiave derivata apprenda informazioni sensibili sul valore segreto effettivamente in input. Una KDF può anche essere usata per assicurare che le chiavi derivate abbiano altre proprietà desiderabili, come ad esempio evitare [[chiave debole|chiavi deboli]] in alcuni specifici sistemi di [[crittografia]].
Unendo alla password un valore pseudocasuale, che non ha bisogno di restare segreto (seed o salt), in ingresso alla funzione di derivazione della password si fa in modo che l'avversario non possa nemmeno precalcolare le chiavi corrispondenti alle password più provabili, perché saranno diverse al cambiare del salt, e quindi diverse per ogni file cifrato.


==Usi della derivazione di chiave==
Le funzioni di derivazione di chiavi sono spesso usate come componenti di protocolli di [[key-agreement]] tra più parti.
* Le funzioni di derivazione di chiave sono [[Funzione crittografica di hash|funzioni di hash crittografiche]], spesso usate in congiunzione con parametri non segreti per derivare una o più chiavi da una stessa informazione segreta. Un suo utilizzo può evitare che un attaccante che entri in possesso della chiave derivata apprenda informazioni sensibili sul valore segreto effettivamente in input. Una KDF può anche essere usata per assicurare che le chiavi derivate abbiano altre proprietà desiderabili, come ad esempio evitare [[chiave debole|chiavi deboli]] in alcuni specifici sistemi di [[crittografia]].
Esempi di alcune funzioni di derivazione di chiavi includono KDF1, definito nello [[IEEE P1363]], e funzioni simili in ANSI X9.42.
* Le funzioni di derivazione di chiavi sono spesso usate come componenti di protocolli di [[key-agreement]] tra più parti. Esempi di alcune funzioni di derivazione di chiavi includono KDF1, definito nello [[IEEE P1363]], e funzioni simili in ANSI X9.42.
Funzioni di derivazione delle chiavi sono usate anche per derivare delle chiavi da una [[password]] segreta o una [[passphrase]]
* Funzioni di derivazione delle chiavi sono usate anche per derivare delle chiavi da una [[password]] segreta o una [[passphrase]].


===Funzioni di derivazione di chiave basate su password===
===Funzioni di derivazione di chiave basate su password===
Riga 34: Riga 31:
La prima funzione di derivazione di chiave basata su password, deliberatamente lenta dal punto di vista computazionale, fu chiamata "crypt" ("crypt(3)" nelle [[man (Unix)|pagine di manuale]] di [[Unix]]) e fu inventato da [[Robert Morris (hacker)|Robert Morris]] nel 1980 per criptare le password [[Unix]]. Tuttavia in quel periodo si verificava anche un aumento della velocità dei processori, che rendeva fattibile un [[metodo forza bruta|attacco di brute force]] contro crypt, inoltre l'aumento della capacità delle memorie rendeva inadeguato un salt a 12 bit. La funzione crypt limitava anche la password utente a 8 caratteri, limitando così anche la dimensione dello [[spazio delle chiavi]] e impedendo la definizione di passphrase "forti".
La prima funzione di derivazione di chiave basata su password, deliberatamente lenta dal punto di vista computazionale, fu chiamata "crypt" ("crypt(3)" nelle [[man (Unix)|pagine di manuale]] di [[Unix]]) e fu inventato da [[Robert Morris (hacker)|Robert Morris]] nel 1980 per criptare le password [[Unix]]. Tuttavia in quel periodo si verificava anche un aumento della velocità dei processori, che rendeva fattibile un [[metodo forza bruta|attacco di brute force]] contro crypt, inoltre l'aumento della capacità delle memorie rendeva inadeguato un salt a 12 bit. La funzione crypt limitava anche la password utente a 8 caratteri, limitando così anche la dimensione dello [[spazio delle chiavi]] e impedendo la definizione di passphrase "forti".


Le moderne funzioni di derivazione di chiave basate su password, come [[PBKDF2]] (specificata nell'[[Request for Comments|RFC]] 2898) utilizza una funzione di hash crittografica, come [[MD5]] o [[SHA1]], salt molto grandi (ad esempio su 64 bit) e un grande valore di iterazione (spesso 1000 o più). Ci sono state proposte per utilizzare algoritmi che richiedessero memorie molto grandi e altre risorse per la computazioni, in modo da ostacolare [[attacco custom hardware|attacchi custom hardware]].
Le moderne funzioni di derivazione di chiave basate su password, come [[PBKDF2]] (specificata nel [[Request for Comments|RFC]] 2898) utilizza una funzione di hash crittografica, come [[MD5]] o [[SHA1]], salt molto grandi (ad esempio su 64 bit) e un grande valore di iterazione (spesso 1000 o più). Ci sono state proposte per utilizzare algoritmi che richiedessero memorie molto grandi e altre risorse per la computazioni, in modo da ostacolare [[attacco custom hardware|attacchi custom hardware]].


==Note==
{{Reflist}}
==Voci correlate==
==Voci correlate==
* [[Chiave crittografica]]
* [[Chiave crittografica]]

Versione delle 18:47, 30 mag 2019

Derivare una chiave crittografica significa ricavare una o più chiavi crittografiche da una chiave principale (in inglese detta solitamente master key) o da altra informazione disponibile, ad esempio una password o una passphrase. [1][2] Ciò viene fatto in base ad una opportuna funzione di derivazione della chiave (in inglese Key derivation function o KDF) che ricava la chiave derivata a partire da dati noti. Una diffusa applicazione della derivazione di una chiave è in HMAC.

Un algoritmo di derivazione della chiave (v. ad esempio PBKDF2), a partire da un valore arbitrario in ingresso (una stringa o un array di larghe dimensioni) calcola in modo crittograficamente sicuro (ovvero non è possibile abbreviare il calcolo con una qualche scorciatoia) una chiave di dimensioni adatte alla cifratura. Questo fa sì che sia possibile imporre un dato tempo computazionale per generare una chiave, nota la password (o una qualsivoglia informazione segreta), in modo che un attaccante che provi un attacco a forza bruta o anche solo un attacco a dizionario si trovi rallentato (in modo non bypassabile) nelle operazioni. Unendo alla password un valore pseudocasuale, che non ha bisogno di restare segreto (seed o salt), in ingresso alla funzione di derivazione della password si fa in modo che l'avversario non possa nemmeno precalcolare le chiavi corrispondenti alle password più provabili, perché saranno diverse al cambiare del salt, e quindi diverse per ogni file cifrato.

Usi della derivazione di chiave

  • Le funzioni di derivazione di chiave sono funzioni di hash crittografiche, spesso usate in congiunzione con parametri non segreti per derivare una o più chiavi da una stessa informazione segreta. Un suo utilizzo può evitare che un attaccante che entri in possesso della chiave derivata apprenda informazioni sensibili sul valore segreto effettivamente in input. Una KDF può anche essere usata per assicurare che le chiavi derivate abbiano altre proprietà desiderabili, come ad esempio evitare chiavi deboli in alcuni specifici sistemi di crittografia.
  • Le funzioni di derivazione di chiavi sono spesso usate come componenti di protocolli di key-agreement tra più parti. Esempi di alcune funzioni di derivazione di chiavi includono KDF1, definito nello IEEE P1363, e funzioni simili in ANSI X9.42.
  • Funzioni di derivazione delle chiavi sono usate anche per derivare delle chiavi da una password segreta o una passphrase.

Funzioni di derivazione di chiave basate su password

Le funzioni di derivazione di chiave sono usate anche nelle applicazioni per derivare chiavi da password segrete oppure passphrase, che tipicamente non godono della proprietà di poter essere usate direttamente come chiavi crittografiche. In certe applicazioni, è generalmente raccomandato che la funzione di derivazione di chiave generi lentamente la chiave derivata, in modo da scoraggiare gli attacchi di brute-force o di dizionario sulla password o sulla passphrase in input.

Un particolare uso di una funzione di derivazione di chiave può essere il seguente:

dove:

  • è la chiave derivata
  • è la funzione di derivazione di chiave
  • è la chiave originale o la password
  • è un valore casuale che svolge il ruolo di salt crittografico
  • si riferisce al numero di iterazioni della funzione

La chiave derivata è usata al posto della chiave originale o della password, come chiave del sistema. Il valore del salt e il numero di iterazioni (se non è prefissato) sono memorizzati nel valore hash della password o inviati come testo in piano insieme al messaggio criptato.

La difficoltà di forzare la chiave con un attacco di brute-force aumenta all'aumentare del numero di iterazioni. Un limite pratico sul numero di iterazioni è la riluttanza degli utenti a tollerare un ritardo percepibile nell'effettuare il login nel sistema o nel vedere il messaggio decriptato. L'uso di un salt crittografico evita, come detto prima, di precomputare un dizionario di chiavi derivate.

La prima funzione di derivazione di chiave basata su password, deliberatamente lenta dal punto di vista computazionale, fu chiamata "crypt" ("crypt(3)" nelle pagine di manuale di Unix) e fu inventato da Robert Morris nel 1980 per criptare le password Unix. Tuttavia in quel periodo si verificava anche un aumento della velocità dei processori, che rendeva fattibile un attacco di brute force contro crypt, inoltre l'aumento della capacità delle memorie rendeva inadeguato un salt a 12 bit. La funzione crypt limitava anche la password utente a 8 caratteri, limitando così anche la dimensione dello spazio delle chiavi e impedendo la definizione di passphrase "forti".

Le moderne funzioni di derivazione di chiave basate su password, come PBKDF2 (specificata nel RFC 2898) utilizza una funzione di hash crittografica, come MD5 o SHA1, salt molto grandi (ad esempio su 64 bit) e un grande valore di iterazione (spesso 1000 o più). Ci sono state proposte per utilizzare algoritmi che richiedessero memorie molto grandi e altre risorse per la computazioni, in modo da ostacolare attacchi custom hardware.

Note

  1. ^ Bezzi, Michele, Data privacy, in Privacy and Identity Management for Life, Springer, 2011, pp. 185–186, ISBN 9783642203176.
  2. ^ Kaliski, Burt, RFC 2898 – PKCS #5: Password-Based Cryptography Specification, Version 2.0 (TXT), in IETF.

Voci correlate