**SHA (Secure Hash Algorithm)** je klasa kriptografskih funkcija za sažimanje. U ovoj familiji kriptografskih funkcija najčešće korišćena funkcija je SHA-1, koja je našla primenu u velikom broju kriptografskih protokla kao što su TLS, SSL, PGP, SSH, S/MIME i IPSec. SHA-1 se može smatrati naslednikom čuvenog MD5 algoritma. SHA algoritmi su kreirani od američke agencije za sigurnost (NSA) i publikovan kao zvaničan standard vlade SAD.

Prvi član ove familije, publikovan je 1993. i zvanično nazvan SHA, ali se on često u literaturi naziva SHA-0, da bi se sprečila zabuna sa njegovim kasnijim naslednicima. Dve godine kasnije nastaje SHA-1, prvi naslednik SHA. Još četiri varijante ovog algoritma su publikovane i to SHA-224, SHA-256, SHA-384 i SHA-512 i oni se jednim imenom nazivaju SHA-2, a razlikuje ih samo dužina sažetka koji proizilazi iz njih.

SHA-0 i SHA-1 algoritmi se danas ne mogu smatrati bezbednim, jer postoje kriptografski napadi koji su sposobni da pronađu koliziju za relativno kratko vreme. Za sada nigde nije objavljeno da je izvršen uspešan kriptografski napad na neki od algoritam iz klase SHA-2, ali zbog sličnosti sa prethodnim generacijama, uskoro će i oni biti uspešno napadnuti.

SHA-0 i SHA-1
-------------

Originalne specifikacije algoritma su publikovane 1993. pod nazivom Hash Standard, FIPS PUB 180, od strane američke vladine agencije Nacionalnog instituta za standarde i tehnologiju (NIST), i ovaj algoritam je poznat kao SHA-0. Vrlo brzo posle publikacije SHA-0, NSA ga je povukla zbog pronađenih sigurnosnih propusta i umesto njega je u primenu ušao njegov unapređeni naslednik SHA-1, 1995. godine. NSA nikada nije objavila o kakvim se propustima radi i koji su ispravljeni u narednoj verziji. Na oba ova algoritma uočeno je više nedostataka, mada SHA-1 pruža daleko veću sigurnost.

SHA-0 i SHA-1 prvae sažetke dužine 160 bita, pri čemu maksimalna dužina teksta može biti 264, i u svojoj osnovi ovi algoritmi su bazirani na idejama profesora Ronalda Rivesta i njegovih MD4 i MD5 algoritama.

Duže varijante
--------------

Varijante sa dužim sažetkom nastatle su nešto kasnije i poznate su pod imenom SHA-2. U ovu grupu spadaju algoritmi SHA-224, SHA-256, SHA-384 i SHA-512 i oznake brojeva predstavljaju dužinu sažetka. Algoritmi SHA-256, SHA-384 i SHA-512 objavljeni su 2002. dok je varijanta SHA-224 objavljena 2004. godine. Ove duže varijante su znatno sigurnije u odnosu na SHA-0 i SHA-1, prvenstveno zbog dužine sažetka i određenih promena u algoritmu. Ove nove verzije koriste druge vrednosti pomeraja kao i dodatne konstante, ali u suštini nema značajnih promena u odnosu na prethodnike. I pored veće sigurnosti oni se i danas manje koriste u odnosu na SHA-1, koji predstavlja industrijski standard u kriptografiji.

Upoređenje
----------

| Algoritam | Veličina sažetka u bitima | Inicijalna veličina u bitima | Veličina bloka u bajtima |
| --- | --- | --- | --- |
| **SHA-0** | 160 |  |  |
| **SHA-1** | 160 | 160 | 64 |
| **SHA-224** | 224 | 256 | 64 |
| **SHA-256** | 256 | 256 | 64 |
| **SHA-384** | 384 | 512 | 128 |
| **SHA-512** | 512 | 512 | 128 |

SHA-1 sažeci
------------

Primer primene SHA-1 algoritma. Rečenicu u ASCII formatu „The quick brown fox jumps over the lazy dog" pustićemo kroz MD5 algoritam i dobićemo 160-bitni izlaz u heksadecimalnom obliku

```
SHA1("The quick brown fox jumps over the lazy dog") = 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
```

Čak i najmanja promena samo jednog slova u rečenici imaće kao rezultat promenu celokupnog heksadecimalnog izlaza. Na primer promenićemo d u c:

```
SHA1("The quick brown fox jumps over the lazy cog") = de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3
```

Izlaz SHA-1 funkcije u slučaju prazne niske biće:

```
SHA1("") = da39a3ee5e6b4b0d3255bfef95601890afd80709
```

Upoređenje MD5, SHA-1 i RIPEMD-160 algoritma
--------------------------------------------

Upoređenja SHA-1 algoritma sa MD5 algoritmom pokazuju da je SHA-1 algoritam sigurniji od MD5 algoritma.


|  | MD5 | SHA-1 | RIPEMD-160 |
| --- | --- | --- | --- |
| Dužina digesta | 128 bitova | 160 bitova | 160 bitova |
| Dužina bloka | 512 bitova | 512 bitova | 512 bitova |
| Broj koraka | 64 (4 x 16) | 80 (4 x 20) | 160 |
| Najveća dužina poruke | - | 2^64-1 bitova | 2^64-1 bitova |
| Primitivnih logičkih funkcija | 4 | 4 | 5 |
| Broj konstanti | 64 | 4 | 9 |
| Zapis bitova | Little endian | Big endian | Little endian |