Una funzione crittografica di hash associa a dati di lunghezza arbitraria (messaggio) una sequenza binaria di dimensione fissa. Questo valore di hash viene spesso indicato anche con il termine message digest (o digest). Una funzione crittografica di hash è progettata per essere unidirezionale (one-way), ossia una funzione difficile da invertire: l'unico modo per ricreare i dati di input dall'output di una funzione di hash ideale è quello di tentare una ricerca di forza-bruta di possibili input per vedere se vi è corrispondenza (match).
Con SHA (Secure Hash Algorithm) si indica una famiglia di funzioni crittografiche di hash sviluppate a partire dal 1993 dalla National Security Agency (NSA). Gli algoritmi della famiglia sono denominati SHA-1, SHA-224, SHA-256, SHA-384 e SHA-512: le ultime 4 varianti sono spesso indicate genericamente come SHA-2, per distinguerle dal primo. Il primo produce un digest del messaggio di soli 160 bit, mentre gli altri producono digest di lunghezza in bit pari al numero indicato nella loro sigla (ad esempio SHA-256 produce un digest di 256 bit). Nelle GNU Core Utilities sono disponibili i programmi (da shell) sha1sum, sha224sum, sha256sum, sha384sum e sha512sum che consentono di calcolare (e verificare) il digest associato ad un file. Una descrizione (con pseudocodice) degli algoritmi SHA sono disponibili ai seguenti link: link1, link2.
Non è possibile usare librerie C (o richiamare applicazioni) che computino i valori sha
Nel progetto occorre sviluppare l'applicazione shadb che consente di archiviare i valori dei digest associati ai diversi file in un file apposito allo scopo di verificare se un dato file è già presente o meno nel proprio archivio. Le informazioni raccolte dal programma vengono salvate all'interno di un file la cui struttura è la seguente:
<absolutepathtoafile_1>\r\n <shacode_1>\r\n <digest_1>\r\n ... <absolutepathtoafile_n>\r\n <shacode_n>\r\n <digest_n>\r\n
Il file di archivio contiene una sequenza (possibilmente vuota) delle informazioni raccolte durante le varie esecuzioni, dove per ogni file viene memorizzato:
<absolutepathtoafile_n>);