SHA-2
Az SHA-2 (angolul: Secure Hash Algorithm 2) kriptográfiai hash-függvények csoportja, melyet az Egyesült Államok Nemzetbiztonsági Ügynöksége (NSA) tervezett és publikált 2002-ben.[1] 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.[2]
Története
[szerkesztés]Az Egyesült Államok Nemzetbiztonsági Ügynöksége (NSA) a Capstone projekt[3] 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 (angolul: Computer Security Act). 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.[4] 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.[5]
Az SHA-2 algoritmusok első ismertetője a 2002-ben kiadott FIPS 180-2 kiadványban szerepelt.[1] 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.[6]
Felhasználása
[szerkesztés]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
[szerkesztés]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 (angolul: collision attack), 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.[7] A tanulmány szerint a megoldáshoz 263.1 műveletre volt szükség, aminek futtatására 65 000 é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 12 000 000 é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.[8]
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
[szerkesztés]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 Against Up To 24-step SHA-2[9] |
2008 | determinisztikus | ütközés keresés | SHA-256 | 24/64 | 228.5 |
SHA-512 | 24/80 | 232.5 |
Minta kimenetek
[szerkesztés]Az SHA-2 függvények kimenete üres (nulla hosszúságú üzenet) bemenetek esetén:
SHA224("") 0x d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f SHA256("") 0x e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 SHA384("") 0x 38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b SHA512("") 0x cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e SHA512/224("") 0x 6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4 SHA512/256("") 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 (angolul: avalanche effect) 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ő:
SHA256("majom") 0x 56026d01f89f22ae2293833a736b5bcdc8cbee4852d3c3ab2067000f969d38fa SHA256("bajom") 0x 390e091b2978c04af5258725d9ea52c98f7d6d3cec11981bf88e638daf870782
Pszeudokód
[szerkesztés]SHA-256
[szerkesztés]Változók kezdőértékének a beállítása: h0 := 0x6a09e667 h1 := 0xbb67ae85 h2 := 0x3c6ef372 h3 := 0xa54ff53a h4 := 0x510e527f h5 := 0x9b05688c h6 := 0x1f83d9ab h7 := 0x5be0cd19 Konstansok értékének a beállítása: 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 Előfeldolgozás: begin with the original message of length L bits append a single '1' bit append K '0' bits, where K is the minimum number >= 0 such that L + 1 + K + 64 is a multiple of 512 append L as a 64-bit big-endian integer, making the total post-processed length a multiple of 512 bits such that the bits in the message are L 1 00..<K 0's>..00 <L as 64 bit integer> = k*512 total bits Az üzenet egymást követő 512-bites darabjaira a következő műveletek végrehajtása: break message into 512-bit chunks for each chunk create a 64-entry message schedule array w[0..63] of 32-bit words (A w[0..63] kezdőértékei nem számítanak, ezért sok implementáció kinullázza őket) copy chunk into first 16 words w[0..15] of the message schedule array Az első 16 darab 32 bites szó kiterjesztése 64 bitesre: for i from 16 to 63 s0 := (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) xor (w[i-15] rightshift 3) s1 := (w[i- 2] rightrotate 17) xor (w[i- 2] rightrotate 19) xor (w[i- 2] rightshift 10) w[i] := w[i-16] + s0 + w[i-7] + s1 A használni kívánt változók inicializálása az aktuális hash értékekre: a := h0 b := h1 c := h2 d := h3 e := h4 f := h5 g := h6 h := h7 Tömörítési funkció fő ciklusa: for i from 0 to 63 S1 := (e rightrotate 6) xor (e rightrotate 11) xor (e rightrotate 25) ch := (e and f) xor ((not e) and g) t1 := h + S1 + ch + k[i] + w[i] S0 := (a rightrotate 2) xor (a rightrotate 13) xor (a rightrotate 22) maj := (a and b) xor (a and c) xor (b and c) t2 := S0 + maj h := g g := f f := e e := d + t1 d := c c := b b := a a := t1 + t2 A tömörített darab hozzáadása az aktuális hash értékhez: h0 := h0 + a h1 := h1 + b h2 := h2 + c h3 := h3 + d h4 := h4 + e h5 := h5 + f h6 := h6 + g h7 := h7 + h A végső hash érték előállítása (big endianként): digest := hash := h0 append h1 append h2 append h3 append h4 append h5 append h6 append h7
SHA-224
[szerkesztés]Az SHA-224 szinte teljesen megegyezik az SHA-256 megoldásával, csupán a kezdeti h0 és h7 hash értékek eltérőek, és a kimenet a h7 hozzáfűzése nélkül áll össze.
SHA-224 kezdőértékek (big endianként):
h[0..7] := 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
SHA-512
[szerkesztés]Az SHA-512 esetében a számok 64 bit hosszúak, az üzenet 1024-bites darabokra van osztva, a k tömb pedig 80 elemű. A fő ciklus 64 helyett 80-szor fut le és a használt eltolási és forgatási bitek számai is eltérőek.
SHA-512 kezdőértékek (big endianként):
h[0..7] := 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,
0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179
SHA-512 konstansok:
k[0..79] := [ 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, 0x3956c25bf348b538,
0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, 0x12835b0145706fbe,
0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235,
0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,
0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, 0x983e5152ee66dfab,
0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725,
0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed,
0x53380d139d95b3df, 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,
0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218,
0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, 0x19a4c116b8d2d0c8, 0x1e376c085141ab53,
0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373,
0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,
0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, 0xca273eceea26619c,
0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, 0x0a637dc5a2c898a6,
0x113f9804bef90dae, 0x1b710b35131c471b, 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc,
0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817]
SHA-512 fő ciklus funkciók:
S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)
S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)
s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)
s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)
Jegyzetek
[szerkesztés]- ↑ a b Announcing Approval of Federal Information Processing Standard (FIPS) 180-2, Secure Hash Standard; a Revision of FIPS 180-1. www.federalregister.gov (angolul) (2002. augusztus 26.) (Hozzáférés: 2021. november 9.)
- ↑ FIPS PUB 180-4: Secure Hash Standard (SHS). nvlpubs.nist.gov (angolul) (2015. augusztus) (Hozzáférés: 2021. november 9.)
- ↑ What is Capstone? x5.net (angolul) (Hozzáférés: 2021. november 10.)
- ↑ FIPS 180 – Secure Hash Standard (SHS). csrc.nist.gov (angolul) (1993. május 11.) (Hozzáférés: 2021. november 10.)
- ↑ FIPS 180-1 – Secure Hash Standard. csrc.nist.gov (angolul) (1995. április 17.) (Hozzáférés: 2021. november 10.)
- ↑ FIPS Publication 180-2 (with Change Notice 1). csrc.nist.gov (angolul) (2004. február 25.) (Hozzáférés: 2021. november 10.)
- ↑ SHAttered: The first collision for full SHA-1. shattered.it (angolul) (Hozzáférés: 2021. november 10.)
- ↑ Nemzeti Kibervédelmi Intézet – Újabb szög az SHA-1 koporsójába. nki.gov.hu (magyarul) (Hozzáférés: 2021. november 10.)
- ↑ Somitra Kumar Sanadhya (2008). „New Collision Attacks Against Up To 24-step SHA-2”. IACR Cryptology ePrint Archive 2008:270.
Források
[szerkesztés]- Wouter Penard – Tim van Werkhoven: On the Secure Hash Algorithm family. www.staff.science.uu.nl (angolul) (Hozzáférés: 2021. november 9.) arch
További információk
[szerkesztés]- Online tools – Hash függvény generátorok Archiválva 2023. február 6-i dátummal a Wayback Machine-ben
- SHAttered – The first collision for full SHA-1 (angolul)