Passa al contenuto principale

3. Overview (Panoramica)

3. Overview (Panoramica)

In molte applicazioni della crittografia a chiave pubblica, la sicurezza dell'utente dipende in ultima analisi da uno o più valori di testo segreto o password. Poiché una password non è direttamente applicabile come chiave a nessun sistema crittografico convenzionale, tuttavia, è necessaria una certa elaborazione della password per eseguire operazioni crittografiche con essa. Inoltre, poiché le password sono spesso scelte da uno spazio relativamente piccolo, è necessaria una cura speciale in tale elaborazione per difendersi dagli attacchi di ricerca.

Un approccio generale alla crittografia basata su password, come descritto da Morris e Thompson [MORRIS] per la protezione delle tabelle delle password, consiste nel combinare una password con un salt per produrre una chiave. Il salt può essere visto come un indice in un grande insieme di chiavi derivate dalla password e non è necessario che sia mantenuto segreto. Sebbene possa essere possibile per un avversario costruire una tabella di password possibili (il cosiddetto "attacco a dizionario"), costruire una tabella di chiavi possibili sarà difficile, poiché ci saranno molte chiavi possibili per ogni password. Un avversario sarà quindi limitato a cercare tra le password separatamente per ogni salt.

Un altro approccio alla crittografia basata su password consiste nel costruire tecniche di derivazione delle chiavi che siano relativamente costose, aumentando così il costo della ricerca esaustiva. Un modo per farlo è includere un conteggio delle iterazioni nella tecnica di derivazione delle chiavi, indicando quante volte iterare una funzione sottostante mediante la quale vengono derivate le chiavi. Un numero modesto di iterazioni (diciamo, 1000) non è probabile che sia un onere per le parti legittime quando si calcola una chiave, ma sarà un onere significativo per gli avversari.

Il salt e il conteggio delle iterazioni formavano la base per la cifratura basata su password in PKCS #5 v2.0, e sono adottati qui anche per le varie operazioni crittografiche. Pertanto, la derivazione delle chiavi basata su password come definita qui è una funzione di una password, un salt e un conteggio delle iterazioni, dove le ultime due quantità non è necessario che siano mantenute segrete.

Da una funzione di derivazione delle chiavi basata su password, è semplice definire schemi di cifratura e autenticazione dei messaggi basati su password. Come in PKCS #5 v2.0, gli schemi di cifratura basati su password qui sono basati su uno schema di cifratura convenzionale sottostante, dove la chiave per lo schema convenzionale è derivata dalla password. Similmente, lo schema di autenticazione dei messaggi basato su password è basato su uno schema convenzionale sottostante. Questo approccio a due livelli rende le tecniche basate su password modulari in termini delle tecniche sottostanti su cui possono essere basate.

Si prevede che le funzioni di derivazione delle chiavi basate su password possano trovare altre applicazioni oltre agli schemi di cifratura e autenticazione dei messaggi definiti qui. Ad esempio, si potrebbe derivare un insieme di chiavi con una singola applicazione di una funzione di derivazione delle chiavi, piuttosto che derivare ogni chiave con un'applicazione separata della funzione. Le chiavi nell'insieme sarebbero ottenute come sottostringhe dell'output della funzione di derivazione delle chiavi. Questo approccio potrebbe essere impiegato come parte dello stabilimento delle chiavi in un protocollo orientato alla sessione. Un'altra applicazione è il controllo delle password, dove l'output della funzione di derivazione delle chiavi viene memorizzato (insieme al salt e al conteggio delle iterazioni) ai fini della successiva verifica di una password.

In tutto questo documento, una password è considerata una stringa di ottetti di lunghezza arbitraria la cui interpretazione come stringa di testo non è specificata. Nell'interesse dell'interoperabilità, tuttavia, si raccomanda che le applicazioni seguano alcune regole comuni di codifica del testo. ASCII e UTF-8 [RFC3629] sono due possibilità. (ASCII è un sottoinsieme di UTF-8.)

Sebbene la selezione delle password sia al di fuori dell'ambito di questo documento, sono state pubblicate linee guida [NISTSP63] che possono essere prese in considerazione.