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]