[successivo] [precedente] [inizio] [fine] [indice generale] [parte]


Capitolo 13.   Generazione di una password casuale

La sicurezza dei dati, una volta cifrati, viene garantita dalla non ripetibilità dei generatori di numeri casuali. La funzione rand garantisce la non ripetibilità solo per un numero limitato di combinazioni fino a 232. Utilizzare uno stesso seme di partenza produce la stessa sequenza di numeri casuali. Il seme di partenza è impostato con la funzione srand.

Una funzione più sicura, ma sempre insufficiente per un uso con modelli di cifratore, è random; quest'ultima consente di cambiare e modificare lo stato interno del generatore di numeri casuali aumentandone l'efficienza. Il seme di partenza è impostato con la funzione srandom. Lo stato del generatore con le funzioni initstate e setstate.

13.1   File di dispositivo /dev/random

Le operazioni interne compiute da un sistema operativo presentano un ambiente ideale per la generazione di numeri casuali. Un maleintenzionato difficilmente è in grado di scoprire lo stato del computer e prevedere l'esatta sequenza di una serie di numeri casuali.

La sorgente di questi numeri casuali arriva dalla combinazione di più eventi contemporanei legati all'attività dei dispositvi, come gli Interrupt e altri eventi non deterministici o molto difficili da individuare per un osservatore esterno.

Il kernel GNU/LiNUX dispone di due file di dispositivo /dev/random e /dev/urandom per garantire una sorgente di numeri sicuramente casuali.

La prima sorgente garantisce solo un numero esiguo di byte, tuttavia questi sono sfruttabili per chiavi brevi e sicuramente non ripetibili. La seconda sorgente non soffre di questo limite, e restituisce il numero di byte richiesto dalla applicazione. Seppure più debole come algoritmo, è sufficiente per molte applicazioni di cifratura.

In listato 13.1 un generatore di password casuali.

Listato 13.1. Generatore di password casuali.

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <assert.h>

int main ()
{

        char* str = (char*)malloc (8 * sizeof (char) + 1); // chiave

        int i, fd;

        assert (str != NULL);

        // apre un descrittore al file di dispositivo
        if ((fd = open ("/dev/random", O_RDONLY)) == -1) {
                printf ("Errore nell'apertura nel file di dispositivo.\n");
                goto error;
        }

        printf ("Chiave\t\t: ");

        // legge una stringa casuale
        for (i = 0; i < 8; i++) {
                read (fd, str, 1);
                printf ("%02x", *str++);
        }

        printf ("\n");

        close (fd);

error:
        free (str);

        exit (EXIT_SUCCESS);
}

Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome generazione_di_una_password_casuale.html

[successivo] [precedente] [inizio] [fine] [indice generale]