Az SHA-2 () kriptográfiai hashfüggvények csoportja, melyet az Egyesült Államok Nemzetbiztonsági Ügynöksége (NSA) tervezett és publikált 2002-ben. A publikált dokumentum az SHA-1 mellett három új függvényt definiált: SHA-256, SHA-384 és SHA-512 néven, ahol a számok a függvények lenyomatának a bitekben meghatározott hosszát jelölik. 2015 augusztusában az NSA a FIPS PUB 180-4 kiadványában bővítette a függvények számát, így a SHA-2 család hat hash függvényből áll: SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256.

Története Az Egyesült Államok Nemzetbiztonsági Ügynöksége (NSA) a Capstone projekt keretében kapott megbízást, hogy olyan biztonságos kriptográfiai algoritmusokat fejlesszen ki, amely megfelelnek az Egyesült Államokban 1987-ben elfogadott számítógép-biztonsági törvénynek (). Ennek eredménye a Secure Hash Algorithm (SHA), melynek leírását 1993-ban publikálta az amerikai Nemzeti Szabványügyi és Technológiai Intézet (NIST) a FIPS 180 elnevezésű dokumentumban. Az első specifikációban szereplő algoritmusra a szakmai körökben SHA-0 néven hivatkoznak. A szabványt 1995-ben az FIPS 180-1 elnevezésű leírásban felülbírálták, ez a SHA-1 nevű függvény első definícióját tartalmazta.

Az SHA-2 algoritmusok első ismertetője a 2002-ben kiadott FIPS 180-2 kiadványban szerepelt. A leírás a korábbi SHA-1 algoritmus mellett megfogalmazta az SHA-256, SHA-384 valamint SHA-512 függvényeket.

A FIPS 180-2 leírásból 2004-ben kiadtak egy újabb változatot, amely az SHA-2 családot bővítette az SHA-224 függvénnyel.

Algoritmusok összehasonlítása

Az SHA-2 szabványcsalád több, különböző paraméterekkel rendelkező algoritmust tartalmaz. Ezek mind ugyanazon elveken alapulnak, de eltérő hashhosszt és belső blokkstruktúrát alkalmaznak. Az SHA-1, amelyet korábban széles körben használtak, nem része az SHA-2 családnak, de azonos dokumentumban (FIPS PUB 180-2) szerepel.

Algoritmus Kimeneti hossz (bit) Bemeneti blokk (bit) Belső állapot (bit) Megjegyzés SHA-1 160 512 160 Ma már nem biztonságosnak tekintett SHA-224 224 512 256 SHA-256 módosított változata SHA-256 256 512 256 Legelterjedtebb változat SHA-384 384 1024 512 SHA-512 módosított változata SHA-512 512 1024 512 Nagyobb biztonság, 64 bites architektúrához optimalizált SHA-512/224 224 1024 512 SHA-512-ből származtatott rövidebb kimenet SHA-512/256 256 1024 512 SHA-512-ből származtatott rövidebb kimenet

SHA-1

Az SHA-1 (Secure Hash Algorithm 1) az SHA-0 továbbfejlesztett változata, amelyet az NSA fejlesztett ki, és az NIST szabványosított a FIPS PUB 180-1 dokumentumban 1995-ben. Bár az SHA-1 nem része az SHA-2 algoritmuscsaládnak, a két eljárás kapcsolódik egymáshoz, mivel az FIPS PUB 180-2 dokumentumban mindkettő szerepel, illetve az SHA-2 algoritmusok a felépítésükben hasonlítanak az SHA-1-re.

Az SHA-1 160 bites kivonatokat állít elő, és sokáig az egyik legelterjedtebb hash algoritmus volt. Azonban a 2000-es évek végétől kezdve több elméleti és gyakorlati törést publikáltak rá, köztük az első gyakorlati ütközést a Google és a CWI kutatói 2017-ben (SHAttered támadás).

Ma az SHA-1-et már nem tekintik biztonságosnak, és az olyan szabványosítási szervezetek, mint a NIST, nem javasolják a használatát.

SHA-224

Az SHA-224 az SHA-2 algoritmuscsalád egyik tagja, amely az SHA-256 rövidített változata. Ugyanazt a belső szerkezetet és blokkfeldolgozást használja, mint az SHA-256, de a kimenet hossza 224 bitre van levágva, és más kezdő hash értékekkel dolgozik.

Elsősorban olyan rendszerekben használják, ahol a rövidebb hash elegendő biztonságot nyújt, de kisebb adattárolási igény vagy sávszélesség miatt előnyösebb.

Felhasználás

Az SHA-224-et például az IPsec protokollcsalád egyes implementációi használják, különösen olyan környezetekben, ahol hardveres gyorsítás korlátozott, és fontos a hash méretének minimalizálása. Ezen kívül támogatja több kriptográfiai könyvtár is, például az OpenSSL vagy a WolfSSL.

SHA-256

Az SHA-256 az SHA-2 algoritmuscsalád legismertebb és legszélesebb körben alkalmazott tagja. 256 bites kimenetet (32 bájt) állít elő, és 512 bites blokkokban dolgozik. Belső állapottömbje 256 bites, és 64 körös feldolgozási lépést alkalmaz.

Az SHA-256 az SHA-1 logikai felépítésén alapul, de több biztonsági megerősítéssel és hosszabb kimenettel. A legtöbb modern kriptográfiai protokollban és rendszerben alapértelmezettnek tekinthető.

Felhasználás Az SHA-256 szerepel a TLS protokollban (amely az HTTPS alapja), valamint PGP, SSH, IPsec és más biztonsági technológiákban is. Emellett a legismertebb alkalmazása a Bitcoin és sok más kriptovaluta rendszere, amelyek a tranzakciók hash-értékét SHA-256 segítségével számítják ki. Az algoritmus implementációja megtalálható minden jelentősebb kriptográfiai könyvtárban, például az OpenSSL, Bouncy Castle, libsodium és Python hashlib moduljában.

SHA-384

Az SHA-384 az SHA-2 algoritmuscsalád egyik nagyobb bitmélységű tagja. A 64 bites architektúrára optimalizált SHA-512 algoritmus módosított változata, amely eltérő kezdőértékekkel (initial hash value) dolgozik, és a kimenetet 384 bitre rövidíti.

Ez az algoritmus elsősorban olyan környezetekben előnyös, ahol megnövelt biztonsági szintre van szükség, de az 512 bites kimenet túl nagy lenne.

Felhasználás Az SHA-384-et gyakran használják a PKI rendszerekben tanúsítványok aláírására, például a X.509 tanúsítványokban. Alkalmazzák az IPsec egyes konfigurációiban, illetve az SSL/TLS protokollban is opcióként elérhető. A nagyvállalati szintű titkosítási modulok (pl. HSM) gyakran natívan támogatják.

SHA-512

Az SHA-512 az SHA-2 algoritmuscsalád egyik legerősebb és legnagyobb kimenetű tagja. 512 bites (64 bájtos) kivonatot állít elő, és 1024 bites bemeneti blokkokban dolgozik. Belső állapottömbje 512 bites, a feldolgozás 80 körben történik, 64 bites műveletekkel.

Az algoritmust kifejezetten a 64 bites számítógépes architektúrákhoz optimalizálták, így ilyen környezetekben gyorsabb lehet, mint az SHA-256. Nagyobb ellenállást nyújt az ütközési támadásokkal szemben, és magas biztonsági szintet képvisel.

Felhasználás Az SHA-512-t használják többek között a TLS protokollban, tanúsítvány-aláírási folyamatokban és kormányzati adatvédelmi rendszerekben. Népszerű választás olyan alkalmazásokban is, ahol hosszú távú kriptográfiai biztonság követelmény (pl. egészségügyi vagy pénzügyi rendszerek). Az OpenBSD operációs rendszer például az SHA-512-t alkalmazza a jelszó-hashelés alapértelmezett módszereként.

SHA-512/224 és SHA-512/256

Az SHA-512/224 és SHA-512/256 az SHA-2 algoritmuscsalád tagjai, amelyek az SHA-512 algoritmus feldolgozási struktúráját használják, de a végső kimenetüket rövidebbre vágják: 224, illetve 256 bit hosszúságúra. Mindkét algoritmus egyedi kezdő hash-értékekkel dolgozik, azaz nem egyszerű truncálásról van szó.

Céljuk, hogy a 64 bites rendszerekre optimalizált SHA-512 sebesség- és biztonsági előnyeit kombinálják a rövidebb hash értékek előnyeivel.

Felhasználás Ezek az algoritmusok kevésbé elterjedtek, de szerepelnek a FIPS PUB 180-4 szabványban, és támogatottak a legtöbb modern kriptográfiai könyvtárban. Alkalmazásuk olyan környezetekben lehet előnyös, ahol a 64 bites architektúra miatt az SHA-512 gyorsabb, mint az SHA-256, de a hosszabb kimenet nem szükséges.

Felhasználása A hash függvény olyan függvény, amely tetszőleges hosszúságú bemeneti üzenetből egy rögzített hosszúságú karakterláncot („ujjlenyomat”) hoz létre. A kriptográfiai hash függvények számos olyan tulajdonsággal rendelkeznek, amelyek alkalmassá teszik őket az üzenet integritásának ellenőrzésére és a digitális aláírási megoldások részeként történő használatra.

Az SHA-2 hash függvényeket számos biztonsági alkalmazásban és protokollban alkalmazzák, úgy mint a TLS, az SSL, a PGP, az SSH, az S/MIME és az IPsec.

A Bitcoin digitális fizetőeszköz és klónjai SHA-256 algoritmust használnak.

Megbízhatósága A kriptográfiai módszerek sebezhetőségeinek feltárásával a kriptoanalízis foglalkozik, célja a bennük elrejtett információ felfedése, támadási lehetőségeinek vizsgálata.

Egy hash függvénynél az előkép megszerzésére irányuló támadás esetén, ahol a kódolt hashben lévő bitek száma L, egy adott üzenet megtalálásához „nyers erővel” avagy brute force-támadással 2L kiértékelés elvégzésére van szükség. Ez a fajta módszer nagyban függ a felhasználható számítási kapacitástól, és így a variációk számának nagyságától függően a sikeresség elérése időben vagy pénzügyileg adott esetben kevésbé gazdaságos.

Egy másik támadási vektor az ütközések keresése (), amikor a cél hogy eltérő bemenetre ugyanazt a kimenetet generálja a függvény. Ennek a megoldásnak ugyan a brute force támadással ellentétben más a célja, de azt bizonyítja hogy lehetséges a függvény kompromittálása. A megoldásához L bitet tartalmazó kódolt hash esetében átlagosan 2L/2 kiértékelésre lehet szükség, ami nagyságrendekkel gazdaságosabban kivitelezhető mint a nyers erővel történő támadási formával.

SHA-1 esetében a Google kutatói 2017-ben publikáltak egy dokumentumot, amely két eltérő fájl esetében ugyanazon hash értéket előállítását mutatja be. A tanulmány szerint a megoldáshoz 263.1 műveletre volt szükség, aminek futtatására évre volna szükség egy processzorros (single-CPU) rendszerrel és 110 évig tartana ugyanez egy grafikai processzor (single-GPU) alkalmazásával. Ezzel szemben egy teoretikus brute force támadás évbe telne grafikai processzor (single-GPU) használatával.

2019-ben francia és szingapúri kutatók publikációjukban szintén az SHA-1 függvény sebezhetőségét állapították meg, amihez egy szabadon megválasztható a prefixű ütközéses támadást használtak.

SHA-2 esetében is több tanulmány készült a lehetséges támadási vektorokról.

Publikációk az SHA-2 támadásokról Publikáció Publikálás éve Támadási mód Támadás Változat Lépésszám Nehézség New Collision Attacks AgainstUp To 24-step SHA-2 2008 determinisztikus ütközés keresés SHA-256 24/64 228.5 SHA-512 24/80 232.5

Minta kimenetek Az SHA-2 függvények kimenete üres (nulla hosszúságú üzenet) bemenetek esetén:

0x d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f

0x e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

0x 38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b

0x cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e

0x 6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4

0x c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a

Még az üzenet egy kis változtatása is (nagy valószínűséggel) jelentősen eltérő eredményt ad a lavinahatás () következtében.

Például a következő esetben az üzenetek csak egyetlen karakterben térnek el (a szavak Hamming-távolsága egy), a kimenet mégis teljesen eltérő:

0x 56026d01f89f22ae2293833a736b5bcdc8cbee4852d3c3ab2067000f969d38fa

0x 390e091b2978c04af5258725d9ea52c98f7d6d3cec11981bf88e638daf870782

Pszeudokód SHA-256

h0 := 0x6a09e667 h1 := 0xbb67ae85 h2 := 0x3c6ef372 h3 := 0xa54ff53a h4 := 0x510e527f h5 := 0x9b05688c h6 := 0x1f83d9ab h7 := 0x5be0cd19

k[0..63] := 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2

begin with the original message of length L bits append a single '1' bit