L'hashing è una funzione che va da una stringa di bit (di solito di lunghezza variabile) a un'altra stringa di bit (di solito più piccola e di lunghezza fissa).
L'hashing viene utilizzato nei database per il recupero dei dati e in strutture dati di memoria chiamate tabelle hash. Ci consente di ridurre dati arbitrari, come una stringa di caratteri o un oggetto complicato con molti campi, a un numero binario che può quindi essere utilizzato direttamente come indice in un array sparso per recuperare i dati associati (con alcuni dettagli per la gestione dell'hash collisioni).
Le funzioni di hashing usate nel modo precedente sono "cugine" delle funzioni di hashing crittografiche. Sono progettati per esigenze diverse. Devono essere veloci da calcolare e ottenere una buona distribuzione.
Nell'elaborazione sicura, gli hash crittografici vengono utilizzati per digerire i dati in una piccola stringa di bit rappresentativa. Le funzioni crittografiche hanno requisiti diversi. Sono progettati per essere difficili da invertire (per essere "botola" o funzioni "unidirezionali"). Non solo, ma un requisito importante è che deve essere difficile trovare, per un dato testo in chiaro e valore hash, un altro testo in chiaro che produca lo stesso hash.
L'hashing può essere utilizzato non solo per le password, ma come checksum per verificare l'integrità dei dati e come parte dell'implementazione delle firme digitali. Per firmare digitalmente un documento di grandi dimensioni, dobbiamo semplicemente eseguire l'hash del documento per produrre un "digest" (un nome utilizzato per l'output di una funzione di hashing, quando viene eseguito l'hashing di qualcosa di molto lungo). Quindi solo questo digest viene inserito nel sistema crittografico a chiave pubblica per produrre una firma. Puoi vedere la debolezza lì: cosa succede se un attaccante riesce a produrre un documento che ha lo stesso digest? Quindi sembra che la firma originale prodotta sul documento autentico sia in realtà una firma di un documento contraffatto: una falsificazione del trapianto di firma è stata effettivamente perpetrata.
L'hashing della password consente ai sistemi di non memorizzare la versione in testo normale di una password, ma consente loro di verificare se l'utente che cerca di ottenere l'accesso conosce quella password. L'hashing non solo consente ai sistemi di non memorizzare le password in testo normale (che dovrebbero essere custodite con molta attenzione), ma consente la possibilità che anche se gli hash sono esposti pubblicamente, le password sono comunque sicure (analogamente a come crittografia della chiave pubblica i sistemi sono in grado di rivelare le chiavi pubbliche). Sebbene in pratica, gli hash siano comunque protetti dall'accesso pubblico: ad esempio i file / etc / shadow
su sistemi Unix-like, integrando i file / etc / passwd
leggibili da tutti.
La funzione di hashing è tutt'altro che casuale. Tuttavia, la randomizzazione viene utilizzata per contrastare gli aggressori che creano grandi dizionari di password e hash, che consentono loro di cercare un codice hash e recuperare la password corrispondente.
Per hash una password in modo più sicuro, possiamo semplicemente aggiungere alcuni bit casuali ad esso chiamati "sale". Sali diversi aggiunti alla stessa password, ovviamente, portano a hash diversi (si spera con poche o nessuna collisione).
Se il salt casuale è, diciamo, largo 32 bit, significa che, in teoria, una password può eseguire l'hashing in oltre quattro miliardi di modi diversi, il che rende molto poco pratico avere un dizionario precalcolato di tutti gli hash possibili di un gran numero di password.
Ovviamente, quando l'utente viene autenticato, non sa nulla di questo sale. Va bene perché il sale viene memorizzato insieme all'hash nel profilo dell'utente (spesso, combinato con l'hash in una singola stringa di bit compatta). Quando l'inserimento della password dell'utente viene convalidato, il sale viene aggiunto a qualsiasi password inserita, in modo che l'hashing venga eseguito con il sale corretto. Se la password è corretta, l'hash corrisponderà, poiché anche il sale utilizzato è quello giusto, essendo stato estratto dal profilo dell'utente.
Ecco come la casualità viene incorporata nell'hashing delle password, pur permettendogli di funzionare.
Ciò che rende gli hash difficili da decifrare è che sono costruiti da funzioni "trap door" o "one way" . In matematica, ci sono molti esempi di queste cose. Ad esempio, una semplice aggiunta è una botola. Se aggiungiamo alcuni numeri interi per produrre una somma, è impossibile recuperare i numeri originali, conoscendo solo la somma.
Gli hash delle password non sono password crittografate. Se un utente malintenzionato ha l'hash e il sale di una password e le capita di indovinare la password, può facilmente confermarlo, esattamente nello stesso modo in cui lo fa il software di autenticazione del login: esegue la password più il sale attraverso la funzione di hashing e vede che emerge l'hash corretto.