A HOTP ( HMAC -alapú egyszeri jelszó-algoritmus ) egy egyszeri jelszót (One Time Password, OTP) használó biztonságos hitelesítési algoritmus. HMAC (SHA-1) alapján . Ez egy egyirányú hitelesítési algoritmus, nevezetesen: a szerver hitelesíti a klienst .
A jelszógenerálás dinamikájáért felelős paraméterként egy eseményt használnak, vagyis a generálás tényét [1] : minden alkalommal, amikor új jelszót készítenek, az eseményszámláló eggyel növeli az értékét, és ez a monoton növekedés. az algoritmus fő paramétereként használt érték. Az egyszeri jelszavak kiszámításának második paramétere egy szimmetrikus kulcs, amelynek minden generátorhoz (klienshez) egyedinek kell lennie, és mindenkitől privátnak kell lennie, kivéve magát a szervert és magát a generátort (klienst).
Az algoritmust először az IETF csapata írta le hivatalosan 2005 decemberében. [2] [3] Ez volt az Initiative for Open Authentication ( OATH ) első igazán sikeres projektje. [4] Az egyszeri jelszavak generálására szolgáló algoritmusok a mobilipar rohamos fejlődése miatt ekkoriban széles körben elterjedtek. Megbízható algoritmust igényel, megvalósítása egyszerű.
2008-ban a HOTP megszületett egy erősebb időalapú egyszeri jelszóalgoritmus (TOTP), amely nagyrészt örökli szülője tulajdonságait. 2010 szeptemberében egy hatékony OATH Challenge-Response Algorithm ( OCRA ) hitelesítési algoritmust fejlesztettek ki a TOTP alapján. [négy]
A HOTP algoritmus újításokat vezetett be az egyszeri jelszavak generálására szolgáló technológiában is. Az akkoriban stabil SHA-1 hash függvényt egy nem triviális megoldással kombinálták az eseményszámlálóval. Ezek a funkciók a HOTP-t olyan szintre emelték, mint az olyan jól bevált algoritmusok, mint az S/KEY . [négy]
A fő különbség a két algoritmus között a jelszó generálása az időbélyeg alapján, amelyet a TOTP algoritmus paraméterként használ. Ebben az esetben nem a pontos időértéket használjuk, hanem az aktuális intervallumot, amelynek határait előre beállítottuk (például 30 másodperc) [5]
A HOTP létrehoz egy kulcsot egy megosztott titok és egy időfüggetlen számláló alapján. Ennek az algoritmusnak a modellje eseményeken alapul – például minden alkalommal, amikor a következő egyszeri jelszó generálódik, a számláló növekszik. Ezért a később generált jelszavaknak minden alkalommal másnak kell lenniük.
Emiatt a HOTP-algoritmusban a számláló alapja a többi időzítőt használó algoritmustól eltérően védve van a továbbító eszközök deszinkronizálásától vagy a köztük lévő túl nagy távolságtól (olyan távolságtól, hogy a címzetttől később érkezik válasz a jelszó érvényességi ideje lejár) [2] . Ez lehetővé teszi, hogy a HOTP jelszavak korlátlan ideig érvényesek maradjanak, míg a TOTP jelszavak meghatározott idő elteltével már nem lesznek érvényesek.
Ennek eredményeként, feltételezve, hogy ugyanazt a hash függvényt használják, mint a HOTP-ben, ez az algoritmus működési különbsége biztonságosabb és előnyben részesített megoldássá teszi a TOTP -t az egyszeri jelszavak esetében [6]
Az algoritmusnak legalább 6 számjegyet kell visszaadnia a megfelelő jelszóbiztonság érdekében. A biztonsági követelmények szintjétől függően használhat magasabb számjegyeket a HOTP-hez, hogy a jelszót ellenállóbbá tegye a támadásokkal szemben. Az algoritmus működése a következő képlettel írható le [1] :
H O T P ( K , C ) = T r u n c a t e ( H M A C − S H A − egy ( K , C ) ) {\displaystyle HOTP(K,C)=Csonka(HMAC-SHA-1(K,C))} Az algoritmus folyamata a következő lépésekre osztható:Ez a példa [1] egy olyan algoritmus működését mutatja be, amely 160 bites hitelesítési kódból hatjegyű numerikus jelszót állít elő. Legyen egy bizonyos lépésnél a karakterlánc értéke
int offset = hmac_eredmény[19] & 0xf; int bin_code = (hmac_eredmény[eltolás] & 0x7f) << 24 | (hmac_eredmény[eltolás+1] & 0xff) << 16 | (hmac_eredmény[eltolás+2] & 0xff) << 8 | (hmac_eredmény[eltolás+3] & 0xff);Akkor az eredmény így fog kinézni:
Byte index | 0 | egy | 2 | 3 | négy | 5 | 6 | 7 | nyolc | 9 | tíz | tizenegy | 12 | 13 | tizennégy | tizenöt | 16 | 17 | tizennyolc | 19 |
Jelentése | 1f | 86 | 98 | 69 | 0e | 02 | kb | 16 | 61 | 85 | ötven | ef | 7f | 19 | da | 8e | 94 | 5b | 55 | 5a |
Amikor a generátor (kliens) új egyszeri jelszót hoz létre, a kliens számlálójának értéke eggyel nő. A jövőben a számláló értéke a billentyűvel együtt a hash függvény bemenetére kerül . Ezt követően elküldik a hitelesítési szerverre, ahol összehasonlítják a szerver által kiszámított értékkel. Ha az értékek egyeznek, figyelembe véve az eltérést legfeljebb a deszinkronizálási paraméternél , akkor a szerver eggyel növeli a számláló értékét. Ha az adatok nem egyeznek, akkor a szerver elindítja az újraszinkronizálást, és hiba esetén megismétli, amíg el nem éri a sikertelen hitelesítési kísérletek korlátját . Ezt követően a szerver blokkolja a felhasználói fiókot [1] .
Ahogy korábban említettük, az ügyfél minden alkalommal frissíti az eseményszámláló értékét, amikor az egyszeri jelszót generálják. A szerveren lévő számláló értéke viszont csak a sikeres hitelesítés után növekszik. Ezen állítások alapján leírható, hogy miért van szükség az újraszinkronizálási folyamat végrehajtására:
Ez ahhoz vezet, hogy az out of sync paramétert kell használni , amely annak az ablaknak a méretéért lesz felelős, amelyen belül a kliens és a szerver számlálóértékei szinkronizáltnak tekintendők.
Az újraszinkronizálást kizárólag a szerver végzi. Ez abból áll, hogy új értéket számítanak ki az eseményszámlálóhoz úgy, hogy annak értéke megegyezzen az ügyféltől kapott értékkel az értékek közötti különbségen belül, legfeljebb . Ha ez a feltétel teljesül, akkor a szerver frissíti a saját számlálójának értékét [1] .
Ellenkező esetben a szerver újraszámolja a számláló állapotát. A folyamat során a szerver többször is kérhet további OTP értékeket. Ez a biztonsági szint növelése érdekében történik, mivel a jelszavak összehasonlítása ebben az esetben két vagy három pár esetén történik. Ha eléri az újrapróbálkozási korlátot, a szerver zárolja a felhasználói fiókot. A paraméter azt az ablakot is meghatározza, amelyen belül a szerver növeli a számlálót az újraszinkronizálási folyamat során. Ez a limitparaméter a következőkre szolgál:
A HOTP segítségével épített biztonsági rendszerek nagyfokú megbízhatósággal rendelkeznek. Ezek többnyire ellenállnak a széles körben elterjedt kriptográfiai támadásoknak, például:
A támadónak gyakran sikerül ellopnia egy kivonatolt felhasználói jelszót a hitelesítési szerverről, amelyet a hitelesítéshez használnak. A jelszó-létrehozó algoritmus azonban eseményszámlálót is használ. Mivel a számláló kezdeti értékét a szerver választja ki, az általában véletlenszerű, ami megnehezíti a kommunikációs csatorna feltörését még akkor is, ha a támadónak megosztott titka van. [3]
Ezek a változtatások nem kötelezőek, illetve az algoritmus szerzői által javasolt bővítések. Saját megvalósításának biztonsági szintjének növeléséhez azonban a következő lehetőségeket használhatja [1] :
Minden új karakter kiemelése az eredményből drasztikusan csökkenti a sikeres támadás esélyét. Ennek köszönhetően kényelmesebbé teheti a jelszavakkal való munkát. Például növelje a beviteli kísérletek számát, vagy bővítse ki a tartományt, amelyben a szerver és a kliens számláló értékeit összehasonlítja.
Ennek az ötletnek az a célja, hogy ne csak számokat használjunk a jelszóhoz, hanem az AZ karaktereket is. Inkább egy alfanumerikus halmaz 32 karakterből álló halmazáról beszélünk. Azonnal láthatja, hogyan nőtt a jelszavas biztonság szintje, mert most a brute-force keresés sikerének valószínűsége a 6 karakterből álló jelszavakra vonatkozik.
Ha a feltételek lehetővé teszik, hogy a kliens ne csak a HOTP értéket, hanem más adatokat is küldjön, akkor az újraszinkronizálási folyamatot sokkal kényelmesebbé és biztonságosabbá teheti, ha a HOTP értékkel együtt a kliens az eseményszámláló állapotát is elküldi a szerver. Ebben az esetben a kliens HOTP értéke a számláló állapot álbeszúrásaként fog működni.
A számlálóértékek hitelességének és megfelelőségének ilyen módon történő ellenőrzésével megtagadhatja a deszinkronizálási paraméter használatát, ami szintén növeli az algoritmus védelmi szintjét, mivel a frissített rendszerben a nyers erő sikerének valószínűsége támadás lesz csak .
A HOTP szabványosításával az OATH egyesülése nem adott útmutatást az algoritmus megvalósításához. Éppen ellenkezőleg, a fejlesztők szabadsága lehetővé teszi, hogy új megoldásokat találjanak, igyekezve megfelelni az ügyfél igényeinek, és innovatív módon járuljanak hozzá az OTP technológiához. [2] [3] [9]
A HOTP gyakori megvalósítása Java nyelven az org.jboss.security.otp csomagban található, amely az Apache Jboss ingyenes webszerver szabványos könyvtáraiban található.
A Java nyelv másik megvalósítását közvetlenül az OATH unió biztosítja az org.openauthentication.otp csomagban.
Megemlítheti még a megvalósítást - az OATH Toolkit projektet, amelynek liboath könyvtára lehetővé teszi jelszavak létrehozását HOTP és TOTP módban. [tíz]
Számos alacsony intelligenciájú eszközt kifejezetten jelszavak generálására vagy adatátvitelre terveztek HOTP és TOTP segítségével (Feitian, SecuTech, SmartDisplayer, Vasco, Yubico, Protectimus [11] ). Az algoritmust otthoni hálózatokban is használják perifériák távirányítóval vagy mobiltelefonnal történő vezérlésére. [3]
A HOTP az SHA-1- en alapul , amely már nem tekinthető kellően ütközésállónak. A HOTP algoritmus azonban csak azt használja ki, hogy az alapján számított szám véletlenszerű, így az ütközések jelenléte közvetlenül nem befolyásolja a működését. [2] [9]
Az egyirányú hitelesítés azt jelenti, hogy az ügyfél kérésre megpróbál kapcsolatot létesíteni. A szerver ezután visszaküldi a kérést a kliensnek, és ellenőrzi a válasz hitelességét. Az OCRA algoritmus módosítása lehetővé teszi a felhasználó számára a szerver hitelesítését is. [négy]