Új hozzászólás Aktív témák
-
Szerintem teljesen félreértetted a blog bejegyzést. A célom az algoritmus (és annak egyszerűségének) megismertetése, nem pedig egy létező alkalmazás telepítésének leírása volt. Arra elég lett volna egy sor valamelyik létező hitelesítő alkalmazás linkjével.
Ráadásul ami a github-on fent
van(volt -- azóta ugyanis még a totp.app felületéről is lekerült a korábbi github link), az egy minified JS kód, kibogarászni lehetséges, csak eléggé mazochista vállalkozás. Developer Console-ban ugyan megnézhető kicsomagolva, de ott is elég terjedelmes, mert az alkalmazás az idők során tele lett rakva kényelmi funkciókkal.Ha tehát a cél egy 6 számjegyű kód kiszámítása, akkor ~20 sor megértése helyett miért lenne bárkinek is alternatíva egy ismeretlen és az avatatlan szem számára átláthatatlanul terjedelmes program telepítése?
-
bagarol
junior tag
Hát nem tudom... A TOTP.APP forráskódja fenn van a githubon és
egy egyszerű webszerveren (Rebex pl.) elfut. -
-
Inhouse
őstag
válasz cinemazealot #47 üzenetére
A Harbournál/Clippernél néha érdekesen alakul a tizedes...de most már úgy néz ki 100%-os.
Keresgéltem a neten, elég kevés valódi, kézzelfogható megvalósítás van, úgyhogy még egyszer kösz!Üdv Inhouse
-
-
Inhouse
őstag
Jó, annyi, hogy alapból nem egészként szerepelt ez a változó, hanem 2 tizedessel (.00) és így nem igazán kellett megpótolja 0-kal, tehát vette az első 6-ot. Ez lett vagy 5 szám és egy pont, vagy 4 szám, egy pont és egy 0, amikor nem volt 6 jegyű az egész. Az int() megoldotta...
008456->8456.0
Annyi érdekesség, hogy adott időpontban, másnap is ugyanaz a kulcs jön ki...
Van tegtnapi mentésem...
[ Szerkesztve ]
Üdv Inhouse
-
Inhouse
őstag
Ja, gyakorlatilag, alapból 2 tizedessel számol. Ha 6 jegyű az egész, akkor nem kell kiegészíteni, ezért veszi az első 6-ot, nincs gond. Mondjuk ha 5 jegyű, akkor se kell kiegészítenie a tizedesek miatt...de így a pont lesz a 6. karakter.
Már csak az a kérdés, hogy hallucináltam-e a pont nélküli, de eltolódott 0-t.Üdv Inhouse
-
Inhouse
őstag
Na, a '.' hiba a legvégén keletkezett, még az r értéke is jó volt, viszont nálam az 'r % 1000000'-nek az egészrészét kell vennem, úgy jó. Na, majd még tesztelem, hogy ha kezdő 0 van, akkor is jó lesz-e így... Nem is értem, miért csinálja ezt néha a HB-s padl() függvény...
Üdv Inhouse
-
Inhouse
őstag
válasz cinemazealot #42 üzenetére
Van még valami bibi. Általában jó, viszont néha hibázik.
Pl.:
039893
helyett
39893.
illetve volt olyan, hogy a kezdő 0 a végére került...
Majd átnézem. Logoltattam egy darabig, a '.' feltűnű, de a vándorló 0 csak akkor, ha mellette nézem ugyanezzel a kulccsal a totp.app-ot pl... Fura hiba, mert sokáig nem is tűnt fel...tehát van olyan együttállás, amikor nem jó, valahol elronthattam.[ Szerkesztve ]
Üdv Inhouse
-
-
Inhouse
őstag
válasz cinemazealot #25 üzenetére
Köszönöm neked és a többieknek is hathatós segítséget. Sikerült! Elkészült a te PHP megoldásodnak a Harbour-os megfelelője, működik.
A szívást több dolog okozta:
- induláskori 0 PHP ismeret, így a PHP kód értelmezése, ebben sokat segítettél, de volt még mit kutakodni később is (ilyen mélységű matematikai ismeretek sem voltak túlzottan)
- mivel sorról sorra igyekeztem megoldani, ellenőriznem kellett, hogy ne menjek tévútra, ebben nem segítettek az említett megjeleníthető tartományon kívüli karakterek, áttértem az ASCII kódjuk kiiratására, így már sikerült meglátnom, hogy mi a baj
- meg kellett keresnem az összes matematikai/string függvény és oprátor HB-s megfelelőjét, szerencsére majdnem mindnek volt
- PHP 0-tól, Harbour 1-től kezdődő sorozat indítás...
Jó móka volt.[ Szerkesztve ]
Üdv Inhouse
-
nevemfel
senior tag
Illetve szűz Windowsra azt hiszem ezt is fel kell telepíteni:
Rally against apathy draws small crowd
-
nevemfel
senior tag
válasz cinemazealot #38 üzenetére
Jó, hát egy szűz gépre szűz kéznek sok mindent fel kell tennie, mielőtt akár egy Hello World! is futásképessé válik.
Végülis olyan sok mindent nem kell csinálni. Lehúztam a legfrissebb php.zip-et a linkelt oldalról, kicsomagoltam, és mellémentettem a totp kódot. Még a php.ini-vel sem kellett babrálni.Base2n-nél viszont én nem szöszöltem. Letöltöttem a Base2n.php-t (csak azt , semmi mást), bemásoltam a szkriptem mellé, oszt jóccakát.
Persze, világos, és is ezt csináltam, és remekül működik! De ami nekünk triviális, az mások számára nem feltétlenül az, mint azt láthatod.
Egyébként köszönöm, hasznos tanulóprogram!
Rally against apathy draws small crowd
-
-
nevemfel
senior tag
válasz cinemazealot #36 üzenetére
Nem kell hozzá semmilyen módosítás, akár saját, akár linkelt base32 dekódert használsz.
Úgy értem szem előtt tartva azt, aki kezdőként egyszerűen futtatni akarja a leírt programot, nem ért a PHP-hoz, sőt, azt sem tudja, hogy mi az. [link]
A PHP futtatókörnyezetet persze le kell tölteni, kicsomagolni, ezt megkerülni nem lehet, de ezen kívül mást ne kelljen csinálnia (base2n letöltés, a totp.php mellé kicsomagolni a base2n classt, vagy composert telepíteni, azzal lehúzni, satöbbi, satöbbi)
[ Szerkesztve ]
Rally against apathy draws small crowd
-
"Elvileg javascript-ben is meg lehetne csinálni egy helyben futtatható verziót, ahhoz a böngészőn kívül nem kellene más."
Nagyjából bármelyik nyelven meg lehet csinálni, a totp.app pedig éppen a JS implementációra egy kiváló példa (az egész üzleti logika JS-ben van megírva, a HTML alap csak a betöltéshez, a CSS pedig a látványhoz kell). Attól azonban nem feltétlenül csökken a faktor szám, ha nem ugyanabban a böngészőben fut a generátor és az Ügyfélkapu+.
#34 ekkold
Olvass tovább, nevemfel kolléga pont a helyi gépen való PHP futtatásra írt egy példát. Mellesleg én is így futtattam fejlesztés közben: parancssorból, nem böngészőből.#35 nevemfel
Nem kell hozzá semmilyen módosítás, akár saját, akár linkelt base32 dekódert használsz. Én egészen konkrétan ezt a programot futtattam parancssorból. Igaz, nem Windows alól portable PHP-val, hanem Linux alól telepítettel.[ Szerkesztve ]
-
nevemfel
senior tag
válasz cinemazealot #29 üzenetére
- egy kellően biztonságos webtárhely, ami PHP futtatásra alkalmas,
- egy domain, amin keresztül eléred a fenti webtárhelyen futó programot.Még nem próbáltam ki a programot, de kis módosításokkal (pl. saját base32 függvénnyel) elvileg annyi is elég, ha valaki letölti a PHP-t ( [link] ), kibontja a zipet, és parancssorból futtatja a scriptet.
Rally against apathy draws small crowd
-
ekkold
őstag
válasz cinemazealot #32 üzenetére
Igazából ennek akkor van értelme, ha van tárhelyed valahol (ahol php-t is futtathatsz), vagy ha van saját NAS-od, vagy szervered. Ha otthon egy sima PC-n akarnám használni, akkor egy javascript verzió lenne az ügyesebb.
http://skory.gylcomp.hu/ http://www.skory.z-net.hu/ https://skori.hu/ https://skori.spacetechnology.net/
-
ekkold
őstag
válasz Geri Bátyó #31 üzenetére
Elvileg javascript-ben is meg lehetne csinálni egy helyben futtatható verziót, ahhoz a böngészőn kívül nem kellene más. Viszont ezzel a kétfaktoros azonosítás gyakorlatilag az egyfaktorossal azonos biztonsági szinte süllyed. Ettől függetlenül nem vetem el a dolgot, (lehet, hogy megcsinálom) mert még mindig jobbnak érzem mint mondjuk egy totp.app használatát. Meg egy ilyet bárki tudna használni...
http://skory.gylcomp.hu/ http://www.skory.z-net.hu/ https://skori.hu/ https://skori.spacetechnology.net/
-
válasz Geri Bátyó #31 üzenetére
A "nulla tudás" csak Rajtad múlik, a net pedig tele van tutorialokkal. Viszont a cucc működhet saját gépről is, helyben, de akkor csak abban az esetben tudod távolról elérni, ha neten nyitsz neki egy portot az otthoni routereden és foglalsz hozzá egy az otthoni IP címedet követő dinamikus domaint, hogy "hazatalálj".
-
Geri Bátyó
addikt
válasz cinemazealot #29 üzenetére
+ ekkold
Szóval az én nulla tudásommal ez nem igazán fog működni, még lokálisan sem. Kár, pedig vicces lett volna egy saját gépemen futó kódgenerátor!"Ki a büdös istennyila vagy te bohócképű!?" SzŐr Geri, birodalmi poéta és főszakács (:L topic)
-
ekkold
őstag
válasz Geri Bátyó #28 üzenetére
Ez nem egy kész megoldás, csak a lényeg, mindenféle körítés nélkül. Tehát kell egy minimális webprogramozói ismeret ahhoz, hogy fel tudd használni.
Lennének ötleteim, hogyan lehetne viszonyleg egyszerűen többfelhasználós weboldalt csinálni ehhez. Tehát mondjuk minden felhasználónak lenne egy név/jelszó párosa, amit ha megad akkor látja az aktuális idő alapú kulcsot, ill. fel tudja venni/módosíthatja a fő kulcsot. Csak ezt több idő lenne megvalósítani, és nem biztos, hogy ennyi energiát/időt rá akarok szánni erre. A sajátom, amire készült azt már tudja, napi használatban van.http://skory.gylcomp.hu/ http://www.skory.z-net.hu/ https://skori.hu/ https://skori.spacetechnology.net/
-
válasz Geri Bátyó #28 üzenetére
Fontos hangsúlyozni, hogy a program csak a működési elvre fókuszál és nulla védelemmel van ellátva (hozzáférési jelszó, kulcs elszeparált/titkosított tárolása stb.). De ha nagyon le akarom egyszerűsíteni a dolgot, akkor az alábbiakkal már összehozhatod a saját TOTP kliensedet:
- egy kellően biztonságos webtárhely, ami PHP futtatásra alkalmas,
- egy domain, amin keresztül eléred a fenti webtárhelyen futó programot.Bárhol (bármilyen eszközön) is hívod meg a szolgáltatást, az kiköpi Neked az éppen aktuális 6 számjegyű kódodat. Ennyi.
-
Geri Bátyó
addikt
válasz cinemazealot #19 üzenetére
Nyugodtan vedd szó szerint a felhasználó meghatározást. Hardverhez értek, de a szoftverhez nem. Azt sem tudom, hogy mi az a PHP!
"Ki a büdös istennyila vagy te bohócképű!?" SzŐr Geri, birodalmi poéta és főszakács (:L topic)
-
És íme egy saját "minimál" base32 dekóder, levezetés gyanánt:
function base32_decode(string $text)
{
$abc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
$i = 0;
$l = strlen($text = trim(strtoupper($text)));
$result = '';
$fivebyte = 0;
while ($i < $l) {
$f = $i % 8;
if ($text[$i] == '=') break;
$p = strpos($abc, $text[$i]);
if ($p === false) throw new \Exception('Illegal base32 character: ' . $text[$i]);
$fivebyte |= ($p << (35 - $f * 5));
if ($f == 7) {
$result .= str_pad(dechex($fivebyte), 10, '0', STR_PAD_LEFT);
$fivebyte = 0;
}
$i++;
}
if ($text[$i] == '=') {
$result .= substr(str_pad(dechex($fivebyte), 10, '0', STR_PAD_LEFT), 0, $i % 8);
}
return hex2bin($result);
}Forrás RFC 4648. Most pedig szunya!
-
Inhouse
őstag
válasz cinemazealot #25 üzenetére
Köszönöm. Nem mondom, hogy nem lesz még kérdésem. Ameddig eljutottam a hex2bin problémámmal, az a bejárati ajtó előtti bejáró eleje...
Üdv Inhouse
-
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";
-
Korrektor
"Engem az zavar a hex2bin()-ben, hogy nem értem az eredményét, miért csak (látszólag?) azt a 2 értéket alakítja át?
00|00|00|00|03|73|f2|a7 -> s�"Ezt teljesen helyesen teszi mert a webes felületek döntő többségben UTF-8 kódolással dolgoznak:
- az ASCII vezérlő karaktereket (0-31 / 00-1f) nem mutatják
- a szabványos ASCII karakterek (32-127 / 20-7f) megegyeznek
- emellett az UTF-8 szabvány nem egy single-byte codepage (mint a win1250 vagy az iso8859-2), ami azt jelenti, hogy egy karakter lehet tárolva 1, 2, 3, 4 byte-on is, de nincs minden kombinációra illeszthető karakterEmiatt:
- 00 és 03 nincs megjelenítve
- 73 --> 's'
- f2a7 --> f2 esetén a karakterhez 4 byte-ot vár, de ez itt nem teljesül, ezért itt egy úgynevezett replacement charactert helyez elA lényeg az, amit már korábban írtak, a képernyőn megjelenő forma semmit sem jelent...
-
ekkold
őstag
Bemásoltam korábban egy dekódoló függvényt, én is a netről szedtem. Teljesen jól működik, csak használni kell.
Azon kívül talán léteznek még ingyenes tárhely szolgáltatók, ahol php-t is lehet használni. Egy ilyen apphoz nagyon kevés hely is elegendő. Az ATW-n pl. most is lehet ingyen tárhelyet regisztrálni - mindjárt kipróbálom egy-e rajta...http://skory.gylcomp.hu/ http://www.skory.z-net.hu/ https://skori.hu/ https://skori.spacetechnology.net/
-
Inhouse
őstag
válasz cinemazealot #19 üzenetére
Jogos, hiszen az egész erről szólt. Persze azért ehhez a visszaéléshez kéne a felhasználónév és jelszó, 30s-en belül, meg valami motiváció...de persze az ördög nem alszik és így korrekt, ha nincs 3. fél.
Csak meg kéne csináljam a sajátom a te segítségeddel. Jól sejtem, hogy készül a saját base32 függvényed?Üdv Inhouse
-
válasz Geri Bátyó #17 üzenetére
Ahhoz, hogy válaszoljak erre a kérdésre, tudnom kellene, miféle felhasználóval van dolgom.
Ha van affinitásod a PHP-hoz, akkor a kérdés nem kérdés: beüzemelsz egy gépet, amin fut a PHP, és már meg is van a saját TOTP generátorod. Az már csak hálózati konfiguráció kérdése, mivel honnan akarod vagy vagy hajlandó elérni. A bejegyzés azoknak szól elsősorban, akik kíváncsiak az utóbbi időben sokszor és sokak által tárgyalt TOTP algoritmus működésére, és/vagy szeretnének saját megoldást, ami senki mástól nem függ (sem a Google-tól, sem az MS-től, sem a TOTP.APP orosz fejlesztőjétől, de még csak a magyar államtól sem).
#18 Inhouse
Azért nem osztom a nézetedet, mert a hangsúly a saját, és mindenki mástól független megoldáson van. Az Általad leírt megoldás függ a base32 dekóder szolgáltatástól és a onecompiler.com-tól. Ráadásul a kulcsod online dekódolásával és a programod harmadik fél portálján keresztül történő futtatásával Te magad szolgáltatod ki a titkos(nak szánt) adataidat. Ne tedd! -
Inhouse
őstag
válasz Geri Bátyó #17 üzenetére
Mint egyszerű user (én)...
Ha minden telepítés nélkül kell, akkor keresel egy base32 dekódoló weboldalt, ott az azonosítódat megadva megkapod az eredeti változatát és mondjuk a onecompiler.com/php oldalra beillesztve a program forráskódját, néhány módosítás után már működik is, ezeket a sorokat "hatástalanítod" //-el az elején, vagy kitörlöd:
// require_once("Base2n.php");
// $base32 = new Base2n(5, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', false, true, true);
Ezt a sort pedig:
$key = $base32->decode('IDEJONAZUGYFELKAPUTOLKAPOTT16JEGYUKULCSOD');
módoisítod így:
$key = 'IDEJONAZUGYFELKAPUTOLKAPOTT16JEGYUKULCSODeredeti változata, ami nem base32';
Jobbra fent nagy piros RUN gomb, alatta lesz az eredmény.[ Szerkesztve ]
Üdv Inhouse
-
Geri Bátyó
addikt
Ezt egy magamfajta felhasználó hogyan tudná használni? (Ha egyáltalán)
"Ki a büdös istennyila vagy te bohócképű!?" SzŐr Geri, birodalmi poéta és főszakács (:L topic)
-
"A pontok szóközöket helyettesítenek, csak a fórummotor kiszedi őket..."
Nem szóközök, hanem nullás bájtok, amiknek nincs (olvasható) karakteres megfelelője. És nem a fórum motor, hanem a HTML "szedi ki őket", valójában pedig csak összevonja a white space-eket. A HTML alapú megjelenítés sok szempontból nem szerencsés ilyen esetben, de a hexadecimális formátum sokat tud ebben segíteni. Hasonló okból barátai a fejlesztőknek a hexa editorok.
-
Inhouse
őstag
válasz cinemazealot #14 üzenetére
Köszi! Nem az olvashatóság volt a gondom, hanem, hogy nem adott egy akármilyen karaktert a tartományon kívülről, nem voltak az elején a üres (vagy egyéb értelmezhetetlen, stb...) karakterek a 0x00-k (v. 0x03) miatt. Lepróbáltam újra és most a onecompiler oldal is úgy adja vissza, hogy vezető semmikkel és a hosszellenőrzés szerint is 8, így már érthetőbb lenne...de mi történt tegnap óta?
Tegnap is csak bemásoltam a prg-d, és amikor egy változó kapott értéket, akkor kiírattam.
De lehet, hogy saját magam vezettem meg valamiért...echo-val néztem.
Ahogy látom voltak változások a PHP verziókban ebben a függvényben is, a onecompiler meg nem írja, hogy mennyire frisset futtat. A https://www.w3schools.com/ oldal is levágja a 0x00-kat, mint tegnap még a onecompiler. Tudom, telepítsek. Ma már megtaláltam a var_dump() függvényt...
onecompiler:
var_dump(hex2bin("000000000048656c6c6f")). "\n"; -> string(10) ".....Hello"
w3schools:
var_dump(hex2bin("000000000048656c6c6f")). "\n"; -> string(10) "Hello"
A pontok szóközöket helyettesítenek, csak a fórummotor kiszedi őket...[ Szerkesztve ]
Üdv Inhouse
-
"Ez a hex2bin() meg csak párat."
Ugye nem a képernyőről próbálod leolvasni hány bájtot gyárt a függvény? Mondom, bármit is kapsz ennek kimenetéül, azt ne próbáld szövegként elolvasni!
Egyébként rém egyszerű a működése, mert a függvény hexadecimális bemenetének és bináris kimenetének hossza (bájt- vagy ha úgy tetszik, karakterszáma) között egy 2-es osztó áll: beadsz neki n (páros) számú hexadecimális karaktert string formájában és kiad n/2 számú bájtot szintén string formájában. Amit csak akkor tudsz olvasni, ha mindegyik bájt értéke a 32...127 (hexadecimálisan 0x20...0x7f) tartományban van, ami jelen esetben nagy eséllyel nincs így.
-
Inhouse
őstag
Ja, korai volt az örömöm, a bin2hex() csak visszaalakítja a korábbi hexa alakba, a hex2bin() inverze (triviális, csak elsőre nem esett le), a hexáig jó vagyok HB-ban is. Csak ott az ennek megfelelőnek vélt függvény annyi karaktert gyárt, amennyi kijön a hexa értékből. Ez a hex2bin() meg csak párat. Gyanús, hogy ez így nem lesz jó...lehet, hogy 01... olvasható formátumban kéne valahogy megnézzem a kapott értéket, mindkét platformon...
[ Szerkesztve ]
Üdv Inhouse
-
Inhouse
őstag
válasz cinemazealot #8 üzenetére
A bin2hex() ötlet jónak tűnik, majd kipróbálom. Köszi!
Nyilvánvaló, hogy egy ilyet kiírni szövegként teljességgel értelmetlen volna, mert az csak egy bájtsor...
Nem is az értékekre voltam kíváncsi, összehasonlítási alap lett volna az enyémmel, ezen hasalt itt el a dolog. Idáig sem volt olyan egyszerű, nekem a PHP 0 tudásommal, de utána néztem, és megkerestem a megfelelőjét HB-ban. UNIX time-ot nem találtam, azt pl. megírtam.
Igen, este idáig jutottam, utána írtam ide....ha igény van rá, este leírom egy hsz-ben az egész program működését sorról-sorra.
Van, van! Köszi!
Főleg, mert ezután jön az a rész, amit megint nem igazán értek még...néztem az operátorokat és a ^ jel sem volt köztük, illetve ez a többsoros ord()-os rész is ködös, de ebből itt van a Skori megoldása is, hátha...
Mindenesetre már sokat segítettél és köszönöm az elkövetkezőket is.
Rám is vár még egy Base32 függvény írása, mert az nincs HB-ban, nem találtam. Base64 van beépített, meg írtam egy sajátot is tanulásképpen.Üdv Inhouse
-
ekkold
őstag
válasz cinemazealot #4 üzenetére
Csak javaslat, de szerintem építsd be a base32 dekódoló függvényt a php fájlodba, így nem kellene külső 3. fél által gyártott kódot meghívnod.
http://skory.gylcomp.hu/ http://www.skory.z-net.hu/ https://skori.hu/ https://skori.spacetechnology.net/
-
válasz cinemazealot #8 üzenetére
"Mert ha jól sejtem, tegnap 18:23:30-kor futtattad."
Bocs, 18:23:30 és 18:23:59 között.
-
Még egyszer: a hex2bin() kimenete nem egy hétköznapi (olvasható) string, hanem egy (jelen pillanatban 8 karakter, azaz 8 bájt hosszú) 64 bites integer string-ként tárolva. Pusztán azért, mert így kényelmesebb vele dolgozni. Ne próbáld megfejteni "00|00|00|00|03|73|f2|a7" bájtsorozat (string) szöveges jelentését, mert nincs neki olyan. Ez nem más, mint az 57930407 értékű egész szám big-endian ábrázolása, ami a 1737912210/30 matematikai művelet eredményeként született. Mert ha jól sejtem, tegnap 18:23:30-kor futtattad.
Online szerintem ne akarj PHP-t futtatni, inkább telepíts fel egyet magadnak, futtasd a programot parancssorból és itt-ott állítsd meg, hogy "kiechózd" egyik-másik változót. Viszont kiechózni sem lehet mindent, pl. a bináris tartalom parancssorban is szarul mutatna. Ahhoz előbb érdemes beletenni a bináris tartalmat egy bin2hex()-be, csak hogy hexadecimálisan olvasható legyen.
Még egy gondolat a stringekhez: a PHP-ban minden bináris tartalom (pl. hang, kép, videó, Excel tábla, Word vagy PDF dokumentum) betölthető stringbe. Nyilvánvaló, hogy egy ilyet kiírni szövegként teljességgel értelmetlen volna, mert az csak egy bájtsor, aminek elemei bőven túlmutathatnak az ASCII kódtáblán.
Szerk.: Most melózom, de ha igény van rá, este leírom egy hsz-ben az egész program működését sorról-sorra.
[ Szerkesztve ]
-
Inhouse
őstag
válasz cinemazealot #6 üzenetére
Szia!
Köszi, hogy válaszoltál. Láttam ezeket, amiket linkeltél, de a te gyakorlati megvalósításod nagyon megtetszett és soronként szerettem volna megérteni és átültetni. De valószínűleg ez mégsem ilyen egyszerű, meghaladja az én képességeim.
Engem az zavar a hex2bin()-ben, hogy nem értem az eredményét, miért csak (látszólag?) azt a 2 értéket alakítja át?
00|00|00|00|03|73|f2|a7 -> s�
Vagy az echo nem ír ki olyat, ami nem olvasható string? De akkor miért nincs 0xA7, alias § nálam, ž netes környezetben? Csak az angol ABC és számok?
A másik problémám, hogy megnéztem a hash részt, a HB-s változat hexaban ugyanazt az eredményt adja, a RAW opcióval meg csak talán, az értelmesen olvasható ASCII része stimmel, a többit egyelőre nem tudom...lehet, hogy csak megjelenítési gond, ugyanúgy megenné és kiköpné az eredményt... az online PHP futtatós oldal ebben nem barátom.[ Szerkesztve ]
Üdv Inhouse
-
Szia Inhouse!
A hex2bin() pontosan azt teszi, amit a neve sugall, illetve amit a manual ír róla: egy bináris stringet hoz létre. Ennek azonban nem feltétele, hogy a string ember által olvasható is legyen. Ha megfigyeled, az eredménye csupán egy 64 bites (8 bájtos) "big-endian" integer, aminek alapja a 30 másodpercenkénti számláló, kiegészítve balról nulla karakterekkel (!). Mivel az alapja integer, amúgy sem lenne string formában olvasható, de nem is ez a cél, hanem hogy bekerüljön a h() függvénybe, ahol a jobbról nulla bájtokkal (!) kiegészített és aztán jól "meg-scramble-zött" kulcshoz hozzáfűzve ráeresztjük az SHA1-et... aztán mégegyszer egy másik pad bájttal.
Olvasd el a linkelt szabványt... illetve az abban hivatkozott RFC 4226 és RFC 2104 szabványokat, utóbbiban lesz jobban kifejtve ez a fenti eljárás.
-
Inhouse
őstag
Szia cinemazealot !
Engem is foglalkoztatott, hogy megcsinálom. Nem vagyok PHP programozó, a legfejlettebb nyelv a Harbour, amiben dolgozok, ez egy Clippert magában foglaló modernizált C alapú nyelv.
Gondoltam elegendő lesz, vannak fejlett szövegfeldolgozó függvények, számrendszer konvertálás, sha1, stb...
Néztem a kódod, elakadtam a hex2bin() függvénynél. Azt látom, hogy ez nem az aminek a neve mutatná, hanem a hexa adatból ASCII karakterek lesznek. De a netes példákban nem kezdődik 9 nullával, mint itt. Van egy ilyen függvény HB-ban, HB_HexToStr(), de az fogja és végigmegy, és minden pár byte-ból próbál karaktert gyártani. Ezért az őeredménye a 0x00-k miatt üresekkel kezdődik, aztán a 0x03 egy szivecske 1250-es kódkészletnél, stb...
Példa:
PHP:
000000000373f2a7 -> s�
HB:
000000000373f2a7 -> ♥sň§
Weben próbáltam https://onecompiler.com/php/-el. Miért csak a 0x73(s) és az 0xF2(ň) van látszólag benne. Gondolom a 0xF2 azért más, mert erre nincs felkészítve a webes felület megjelenítésben, vagy más a kódlap...[ Szerkesztve ]
Üdv Inhouse
-
Szuper, örülök.
#2 ekkold
Olvastam a megoldásodról, irigykedtem is, hogy megelőztél. De azon túl, hogy egy bagatell problémán akadtam fenn, én kizárólag a TOTP magjára fókuszáltam. Aztán ha valaki olyan összkomfortos megoldást akar, mint a Tiéd, az legfeljebb körülbástyázza az áhított védelmi és kényelmi funkciókkal.#3 Doky586
Nem beszélve arról a pár ezer forintos kínai switch-ről, amit a minap tettem a hálózatra. -
"Az igazsághoz persze hozzátartozik, hogy ez a program is behúz egy 3. fél által gyártott kódot, ami"...
A teljes bizonyossághoz még ellenőrizni kellene a
- windows forráskódját
- a böngésző forráskódját
- a hálókártya driver forráskódját
- minden mást is ami futhat...
Hogy teljes biztonságban legyünk. -
ekkold
őstag
Hasonlót gyártottam én is, persze jelszavas védelemmel kiegészítve.
Több kulcsot kezel, és egy táblázatban jeleníti meg, valahogy így:
Hogy ne kelljen külső dekódert használni azt is beemeltem a php kódba:
$map = array(
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 7
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23
'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31
'=' // padding char
);
$flippedMap = array(
'A'=>'0', 'B'=>'1', 'C'=>'2', 'D'=>'3', 'E'=>'4', 'F'=>'5', 'G'=>'6', 'H'=>'7',
'I'=>'8', 'J'=>'9', 'K'=>'10', 'L'=>'11', 'M'=>'12', 'N'=>'13', 'O'=>'14', 'P'=>'15',
'Q'=>'16', 'R'=>'17', 'S'=>'18', 'T'=>'19', 'U'=>'20', 'V'=>'21', 'W'=>'22', 'X'=>'23',
'Y'=>'24', 'Z'=>'25', '2'=>'26', '3'=>'27', '4'=>'28', '5'=>'29', '6'=>'30', '7'=>'31'
);
function decode($input) {
global $map;
global $flippedMap;
if(empty($input)) return;
$paddingCharCount = substr_count($input, $map[32]);
$allowedValues = array(6,4,3,1,0);
if(!in_array($paddingCharCount, $allowedValues)) return false;
for($i=0; $i<4; $i++){
if($paddingCharCount == $allowedValues[$i] &&
substr($input, -($allowedValues[$i])) != str_repeat($map[32], $allowedValues[$i])) return false;
}
$input = str_replace('=','', $input);
$input = str_split($input);
$binaryString = "";
for($i=0; $i < count($input); $i = $i+8) {
$x = "";
if(!in_array($input[$i], $map)) return false;
for($j=0; $j < 8; $j++) {
$x .= str_pad(base_convert($flippedMap[@$input[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT);
}
$eightBits = str_split($x, 8);
for($z = 0; $z < count($eightBits); $z++) {
$binaryString .= ( ($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48 ) ? $y:"";
}
}
return $binaryString;
}//fv
/*
function encode($input, $padding = true) {
global $map;
global $flippedMap;
if(empty($input)) return "";
$input = str_split($input);
$binaryString = "";
for($i = 0; $i < count($input); $i++) {
$binaryString .= str_pad(base_convert(ord($input[$i]), 10, 2), 8, '0', STR_PAD_LEFT);
}
$fiveBitBinaryArray = str_split($binaryString, 5);
$base32 = "";
$i=0;
while($i < count($fiveBitBinaryArray)) {
$base32 .= $map[base_convert(str_pad($fiveBitBinaryArray[$i], 5,'0'), 2, 10)];
$i++;
}
if($padding && ($x = strlen($binaryString) % 40) != 0) {
if($x == 8) $base32 .= str_repeat($map[32], 6);
else if($x == 16) $base32 .= str_repeat($map[32], 4);
else if($x == 24) $base32 .= str_repeat($map[32], 3);
else if($x == 32) $base32 .= $map[32];
}
return $base32;
}
*/[ Szerkesztve ]
http://skory.gylcomp.hu/ http://www.skory.z-net.hu/ https://skori.hu/ https://skori.spacetechnology.net/
-
PSti
tag
Tökéletesen működik, nagyon köszönöm!
[ Szerkesztve ]
Új hozzászólás Aktív témák
- Épített vízhűtés (nem kompakt) topic
- Okos Otthon / Smart Home
- Politika
- Évek óta ígért funkcióval egészíti ki a DirectX 12-t a Microsoft
- Bemutatkozott a Poco X7 és X7 Pro
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- NBA és kosárlabda topic
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- AutoCAD
- Ukrajnai háború
- További aktív témák...
Állásajánlatok
Cég: Marketing Budget
Város: Budapest