indietro

  • crypt TESTOINCHIARO,SEME

    Crea una stringa digest [riassunto, NdT] proprio come fa la funzione crypt(3) nella libreria C (assumendo che ce ne abbiate davvero una, che non sia stata estirpata quale potenziale armamento).

    crypt() è una funzione non invertibile. TESTOINCHIARO e SEME sono convertiti in una breve stringa, chiamata digest, che viene restituita. I medesimi TESTOINCHIARO e SEME restituiranno sempre la stessa stringa, ma non c'è nessun modo (conosciuto) per ottenere il TESTOINCHIARO dall'hash. Piccoli cambiamenti nel TESTOINCHIARO o nel SEME ha come risultato dei grandi cambiamenti nel digest.

    Non c'è una funzione di decifratura. Questa funzione non è per nulla utile alla crittografia (per questa cosa, date un'occhiata ai moduli Crypt sul vostro mirror CPAN più vicino) e il nome "crypt" [cripta, NdT] è un po' un termine improprio. Il suo uso principale È invece quello di controllare se due parti di testo sono le stessem senza dover trasmettere o immagazzinare il testo stesso. Un esempio è controllare se viene fornita una password corretta. È il digest della password ad essere immagazzinato e non la password stessa. L'utente digita una password che viene sottoposta a crypt() con il medesimo digest memorizzato quale seme. Se i due digest corrispondono, la password è corretta.

    Quando effetuate la verifica di una stringa digest esistente, dovreste usare il digest come seme (come crypt($chiaro, $digest) eq $digest). La parte SEME usata per creare il digest è visibile come parte del digest. Questo assicura che crypt() calcolerà l'hash della nuova stringa con lo stesso seme del digest. Questo fa sì che il vostro codice funzioni sia con la crypt standard che con implementazioni più esotiche. In altre parole, non presumete nulla sulla stringa restituita, o su quanti byte siano siano significativi nel digest.

    Tradizionalmente, il risultato è una stringa di 13 byte: i primi due sono il seme, e sono seguiti da 11 byte appartenenti all'insieme [./0-9A-Za-z], e solo i primi otto byte della stringa digest sono significativi; tuttavia, schemi di hashing alternativi (come MD5), schemi di sicurezza di livello più elevato (come C2) ed implementazioni su piattaforme non-UNIX, possono generare stringhe diverse.

    Quando scegliete un nuovo seme, create una stringa casuale di due caratteri, i quali devono appartenere all'insieme [./0-9A-Za-z] (come join '', ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64]). Questo insieme di caratteri è solo una raccomandazione; i caratteri permessi nel seme dipendono esclusivamente dalla vostra libreria crypt di sistema, e il Perl non può limitare i semi accettati da crypt().

    Ecco un esempio che ci assicura che chiunque faccia girare questo programma conosca la propria password:

        $pwd = (getpwuid($<))[1];
        system "stty -echo";
        print "Password: ";
        chomp($parola = <STDIN>);
        print "\n";
        system "stty echo";
        if (crypt($parola, $pwd) ne $pwd) {
            die "Spiacente...\n";
        } else {
            print "ok\n";
        }

    Chiaramente, scrivere la vostra password a chiunque ve la richieda non è saggio.

    La funzione crypt non è adatta per calcolare il valore di hash per grandi quantità di dati, non del tutto almeno, perché non potete ottenere le vostre informazioni di nuovo in chiaro. Date un'occhiata al modulo Digest per ulteriori robusti algoritmi.

    Se usate crypt() su una stringa Unicode (che potenzialmente contiene caratteri con codice superiore a 255), Perl cerca di dare un senso alla situazione cercando di riportare (una copia de) la stringa ad una stringa a otto bit prima di chiamare crypt() (su quella copia). Se ciò funziona, bene. Altrimenti, crypt() termina con Wide character in crypt [crypt su carattere esteso, NdT]