Nem fejlesztettem soha, nem vagyok fejlesztő csak olvasgattam és próbálgattam a témában már sokat. Illetve maximum hobby szinten kisebb-nagyobb dolgokat megcsináltam megnézve hogy amit elképzeltem működik -e. Speciel amúgy saját szerveren nem vittem túlzásba, jelszót hasheltem egyetlen saltozással mindig. Igazából maga a jelszó nem onna kerül ki, nem beszélve arról, hogy visszafejtés sem egynapos munkafolyamat. Legtöbb esetben inkább ott hasalnak meg a dolgok hogy hozzáférnek az sql-hez és megnézik mondjuk az email címét/usernevét és azt más oldalakon megpróbálják megfejteni (mondjuk email-t). Ha jobban érzed magad hasheld be a felhasználónevet és az email-t is. Szerintem inkább arra figyelj jobban, hogy ne férjenek hozzá az sql-hez, meg maga a szerver magjához, ne tudják injectálni és a többi.
hash(\"sha512\", hash(\"sha512\", salt_1) .. hash(\"sha512\", password) .. hash(\"sha512\", salt_2))
Az egy dolog, hogy most ki fér hozzá, a kérdés az hogy később ki fog esetleg bejutni valamilyen formában (erre is értettem a limitálást). Szerintem iszonyatosan túlgondolod, saltozást felesleges hashelni és az egész salt+jelszó kombót is elég egyszer hashelni. Csak feleslegesen lassítod be a processzorod vele (gondolj bele hogy minden egyes folyamatot végig kell futtatnia és mondjuk szorozd fel 500 emberrel), igazából az általunk leírt verzió is teljesen biztonságos már, de ha nagyon biztonságosat akarsz, akkor pedig írj egy saját kódolást és használd azt.
local TEST_SETTINGS = { interval = 10000, salt_1 = randomString(16), salt_2 = randomString(16),}local tick = getTickCount()for i = 1, TEST_SETTINGS.interval do local password = randomString(32) hash(\"sha512\", hash(\"sha512\", TEST_SETTINGS.salt_1) .. hash(\"sha512\", password) .. hash(\"sha512\", TEST_SETTINGS.salt_2))endprint(string.format(\"Executed in %dms\", getTickCount() - tick))
A szervergép azért van, hogy terhelni lehessen. Ha már belebasznak egy bölömbika processzort ne csak super mariozni akarjanak már rajta az emberek. Azért van, hogy ki lehessen használni. Másrészről érdemes a jelszót kliens oldalon hashelni és úgy elküldeni, ugyanis az RPC-k sima bájtokat küldenek, így lényegében akármilyen egyszerűbb hálózat figyelő programmal kilehet figyelni egyes emberek jelszavát. Összedobtam egy gyors kis tesztet, megnézzük mennyi idő alatt fut le: local TEST_SETTINGS = { interval = 10000, salt_1 = randomString(16), salt_2 = randomString(16),}local tick = getTickCount()for i = 1, TEST_SETTINGS.interval do local password = randomString(32) hash(\"sha512\", hash(\"sha512\", TEST_SETTINGS.salt_1) .. hash(\"sha512\", password) .. hash(\"sha512\", TEST_SETTINGS.salt_2))endprint(string.format(\"Executed in %dms\", getTickCount() - tick)) Természetesen a jelszó minden egyes ciklusnál egy tetszőleges 32 karakter hosszúságú szöveg ami alfanumerikus karaktereket tartalmaz. A fenti kód az én gépemen átlagban véve 310ms alatt futott le. Most annak az esélye, hogy éles szerveren egy adott pillanatban, egy csettintésre összejönne 10.000 kérés, azt nem tartom valószínűnek. Az egyes algoritmusokat brute forceolni tudják csak. Saját algoritmust meg nem érdemes fejleszteni se, hiszen a meglévőeket hozzártő szakemberek írták, és fejlesztik azt.
Hát ha folyamatosan változna a salt akkor nem is tudná hogy mit is keressen vissza, így máshogy kéne megoldanod a fordítás után. Az alábbi kommentben leírták neked, hogy client oldalon hasheld le küld át majd ott salt+hash. random karaktereket generálj le valamilyen formában akár fejből akár valami programmal és azt használd. Szerintem iszonyatosan túlbonyolítod valamiért, de ahogy jól esik. Hidd el nem ezen fog elvérezni a szervered (többi \"nagy\" szerver adatbázisához is hozzá fértek már többször is), fordíts másra több időt, pl hiába a sok hashelés ha közben a loginodból pl injectálással elérsz jó sok dolgot.
function passwordHash(password) return passwordend