Hirdetés
- Xiaomi 15 - kicsi telefon nagy energiával
- One mobilszolgáltatások
- Kikapcsolható lesz a PWM az iPhone 17 modelleken
- Samsung Galaxy A54 - türelemjáték
- iPhone topik
- Milyen okostelefont vegyek?
- Xiaomi 13 - felnőni nehéz
- Motorola Edge 50 Neo - az egyensúly gyengesége
- Leminősítik az S26 Ultra zoomkameráját
- Oldalról rápillanthatunk a Vivo X300-ak kameráira
Új hozzászólás Aktív témák
-
cinemazealot
addikt
No, megpróbálom röviden és érthetően leírni a program működését. Hozzáértők, nyugodtan szóljatok hozzá!
<?php
// Betöltjük a Base2n nevű osztály forráskódját, ezzel elérhetővé válik a base32 kóder/dekóder szolgáltatás. Részletek lejjebb.
require_once("Base2n.php");
// Beállítjuk az időzónánkat. Erre azért van szükség, mert a TOTP szabvány UTC világórához van kötve, a mi rendszeróránk viszont CET időzóna szerint ketyeg. Ha tehát a mi óránk ma, január 27-én 20:02-t mutat, az UTC szerint 19:02. Ezt az Ügyfélkapu+ is tudja, hiszen ő is ugyanezt az algoritmust használja, nekünk pedig lehetőség szerint másodpercre pontosan együtt kell vele ketyegnünk.
date_default_timezone_set('Europe/Budapest');
// Létrehozzunk azt az objektumot, ami a base32 dekódolást fogja elvégezni. Azért így, mert a Base2n osztály egy általános felhasználású osztály, többféle kódolást is képes alkalmazni, a base32 pedig az alábbi ábécével és egyéb paraméterekkel inicializálható. De ez egy példa, ekkold kolléga már bemutatta a saját megoldását, az is tök jó.
$base32 = new Base2n(5, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', false, true, true);
// Definiálunk egy speciális, ún. "hash" függvényt, ami a paraméterként átadott kulccsal (1. paraméter) és pad bájt (2. paraméter) segítségével egy fix hosszúságú, de a tartalom függvényében jelentősen változékony tartalommal bíró bináris bájtsorrá kódolja a 3. "text" paramétert. Ez a "text" persze lehet bármilyen bináris bájtsor is, a tartalma lényegtelen.
function h(string $key, int $pad, string $text)
{
// A kulcsot 64 bájtra egészítjük ki jobbról feltöltve nullás bájtokkal.
$key = str_pad($key, 64, chr(0x00), STR_PAD_RIGHT);
// A 64 bájtra hízlalt kulcs minden bájtján XOR bitműveletet (kizáró VAGY) hajtunk végre a pad értékével, ami szintén egy bájt. Ezzel a kulcs bitjeinek eloszlását szétszórjuk a spektrumon, egyszerűbben mondva, zajosabbá tesszük.
for ($i = strlen($key) - 1; $i >= 0; $i--) {
$key[$i] = chr(ord($key[$i]) ^ $pad);
}
// A 64 bájtos, zajos kulcshoz jobbról hozzáfűzzük a titkosítandó "szövegünk" bájtjait (ami majd látjuk, hogy valójában nem is szöveg) és alávetjük az SHA-1 hash-elésnek. Az eredmény egy 20 bájt (azaz 160 bit) hosszú bináris bájtsor. (Ha a 3. paraméter false lenne true helyett, akkor az eredmény ugyanennek a 20 bájtnak a hexadecimális megfelelője volna, azaz egy 40 karakteres string.)
return hash('sha1', $key . $text, true);
}
// Lekérdezzük a rendszeridőt, ami UTC időzónában értelmezett, 1970.01.01 00:00:00 óta eltelt másodpercek száma lesz.
$t = time();
// Ezt a ~1,7 milliárdos számot elosztjuk 30-cal és csak az egész részt tartjuk meg. Ezzel egy ~57 milliós értéket fogunk kapni, ami 30 másodpercenként növeli az értékét eggyel.
$t30 = (int)floor($t / 30);
// Fogjuk ezt a 30 másodperceként lépkedő számlálót és átalakítjuk egy 8 bájtos (64 bites) big-endian egésszé. Ezt úgy csináljuk, hogy először a számot átalakítjuk hexadecimálissá, balról feltöltjük '0'-ás karakterekkel, amíg 16 karakter hosszú nem lesz, majd az egészet visszaalakítjuk egy bináris bájtsorrá, ami pont 8 bájt hosszú lesz és történetesen string típusú. De ezt elolvasni nem fogjuk tudni, bár nem is célunk.
$c = hex2bin(str_pad(dechex($t30), 16, '0', STR_PAD_LEFT));
// Közben előkapjuk az Ügyfélkapu+-tól kapott 16 karakteres kulcsunkat, ami valójában base32 eljárással van elkódolva. Az eredmény egy ~10 elemű bájtsor lesz.
$key = $base32->decode('IDEJONAZUGYFELKAPUTOLKAPOTT16JEGYUKULCSOD');
// Fogjuk a fent definiált hash függvényünket és meghívjuk a ~10 bájtos (immáron dekódolt) kulcsunkkal, egy 0x36 (54) értékű pad bájttal és a 8 bájton tárolt számlálónkkal. Ezután újra meghívjuk a ~10 bájtos kulcsunkkal, egy 0x5c (92) értékű pad bájttal és az előbbi hívásunk eredményeként kiköpött hash eredményünkkel. Az eredmény egy 20 bájtos (160 bites) bájtsor lesz.
$h = h($key, 0x5c, h($key, 0x36, $c));
// Vesszük ennek az utolsó (huszadik, azaz mivel 0-kezdetű tömbindexelést használunk, 19. indexű) elemét, ami -- mivel stringben tároljuk az hash-elésünk eredményét -- egy karakter lesz. Ahhoz, hogy ebből egy számot kapjunk át kell kergetnünk az ord() függvényen. Végül pedig, egy AND bitművelettel elmaszkolva megtartjuk az utolsó 4 bitjét. Ennek köszönhetően az eredmény egy 0...15 közötti szám lesz, amit offszetként fogunk használni.
$o = ord($h[strlen($h) - 1]) & 0x0f;
// Vesszük a hash-elésünk eredményeként született bájtsort (ami string típusú) és rábökünk annak "offszetedik" elemére. Az ord()-dal egésszé konvertáljuk, AND bitművelettel elmaszkolva megtartjuk az utolsó 7 bitjét, majd balra el-shift-eljük 24 bittel.
$r = (ord($h[$o]) & 0x7f) << 24
// Fogjuk a hash bájtsorunk "offszet+1-edik" elemét, egésszé alakítjuk és eltoljuk balra 16 bittel.
| ord($h[$o + 1]) << 16
// Fogjuk a hash bájtsorunk "offszet+2-edik" elemét, egésszé alakítjuk és eltoljuk balra 8 bittel.
| ord($h[$o + 2]) << 8
// Fogjuk a hash bájtsorunk "offszet+3-adik" elemét, egésszé alakítjuk.
| ord($h[$o + 3]);
// Ezt a 4 bájtot OR bitműveletekkel összefésüljük, így kapunk egy 31 bites egész számot, ami a 0...2147483647 tartományban kaphat majd értéket.
// Fogjuk ezt a 31 bites egészt és vesszük az egymillióval való osztás maradék részét, ami így egy legfeljebb 6 számjegyű decimális szám lesz. Annak érdekében viszont, hogy ez a szám garantáltan 6 számjegyű legyen, szöveggé alakítjuk és balról feltöltjük '0'-ás karakterekkel. És ezzel meg is van a 6 számjegyű kódunk.
echo str_pad($r % 1000000, 6, '0', STR_PAD_LEFT) . "\n";
Új hozzászólás Aktív témák
- BESZÁMÍTÁS! GigaByte H610M i5 14400F 16GB DDR4 512GB SSD RTX 3060 Ti 8GB Kolink Observatory RGB 800W
- Ár/ÉRTÉK BAJNOK! Dell Latitude 5330 i3-1215U 6magos! - 16GB 512GB 13.3" FHD vilbill, 1 év garancia
- iKing.Hu - Motorola G86 5G Dark Blue Használt, karcmentes állapotban 8 GB RAM / 256 GB tárhely
- Samsung Galaxy A54 5G 128GB, Kártyafüggetlen, 1 Év Garanciával
- Telefon felváráslás!! Xiaomi 13T, Xiaomi 13T Pro, Xiaomi 14T, Xiaomi 14T Pro
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest