Operace Tripkodér
Tripcode je způsob autentifikace na imageboardech jako třeba 4chan, kde není možná žádná registrace a k tamějšímu bontonu patří anonymní přispívání. Když si někdo v tomhle prostředí chce vytvořit persistentnější identitu, musí použít tripcode, což je veřejně viditelný hash hesla. Uživatel se podepíše jméno#heslo, na chanu bude vidět jméno!8nz4qwIJo6. Ta část za vykřičníkem je právě tripcode.
Dost často jsou k vidění pěkné tripkódy jako třeba !slash.ORiG. Takového krasavce získáte jedině tak, že budete hrubou silou generovat jeden tripkód za druhým a hledat. A já začal hledat…
Rozhodl jsem se napsat vlastní bruteforce generátor v PHP a protože patřím mezi vládnoucí kastu líných programátorů, jednoduše jsem na netu našel funkci mktrip(). Sám jsem pak doplnil bruteforce část. Vypočtení jedné kontrolní dávky trvalo 100 vteřin.
To je všechno moc pěkné, ale nešlo by to rychleji?
Generátor jsem tedy přepsal, tentokrát do Scaly. K tomu, aby to fungovalo je potřeba javovská implementace funkce crypt
odsud. Když se všechno zkompilovalo, jedna dávka zabrala 8 vteřin a po drobných optimalizacích cirka 7 vteřin. Když jsem kód pomocí aktorů paralelizoval, tak na mém dvoujádru trvala jedna dávka trvala přibližně poloviční dobu. Tak jak to má být.
To je všechno moc pěkné, ale nešlo by to rychleji?
Zoufalé okolnosti si žádají zoufalé činy. Přepsal jsem to ještě jednou, tentokrát do Céčka. Hned ze začátku jeden segfault na uvítanou, abych si uvědomil, že píšu v jazyku pro skutečné chlapy. (Mimochodem, znáte hru starých unixových hackerů: Když uvidíš segfault, napij se?) Ve výsledku jedna dávka v jednom vlákně trvala mezi jednou a dvěma vteřinami.
To je všechno moc pěkné, ale nešlo by to rychleji?
Šlo. Samosebou.
Pak jsem stáhnul Tripcode explorer, který napsal nějaký Japonec a vážně důkladně ho optimalizoval, aby využíval nejnovější instrukce nejnovějších procesorů a byl rychlý jako blesk. Jednu kontrolní dávku Tripcode explorer, který běžel ve Wine, přechroustal za 0.05 vteřiny. Dvatisícekrát rychleji než první pokus v PHP!
Rychleji to už asi nepůjde.
A poučení z celé anabáze? Pokud chcete rychlost, PHP není správná volba.
Doba zpracování jedné dávky + odkazy ke stažení mých pokusů:
pokus | doba trvání vygenerování cca 250000 tripkódů | zrychlení |
---|---|---|
PHP | 100s | 1× |
Java/Scala | 8s | 12.5× |
Java/Scala – optimalizováno | 6.6 – 7.3s | 14× |
C | 1.2 – 2.1s | 60× |
Tripcode explorer | 0.05 :( | 2000× |