DB pole typu timestamp vz. Nette
- Pavel Macháň
- Člen | 282
Čamo napsal(a):
Mysteria:
A má to nejaký mod ktorý vracia presne to čo som zadal? Už tam mám tie heslá osolené tým originálnym reťazcom.
Co mají společného timestamp a osolené hesla ? o.O
- Pavel Macháň
- Člen | 282
Mysteria napsal(a):
@Čamo: Učko je počet sekund od roku 1970. Jinak interně si MySQL ukládá timestamp ve formátu YYYY-MM-DD HH:mm:ss.
@EIFEL: Předpokládám, že solil tím datumem, který si uložil do timestampu.
Salt ale nemá co dělat v DB. To tam rovnou může dát plaintext.
Editoval Pavel Macháň (3. 7. 2014 23:32)
- Mysteria
- Člen | 797
Hlavně je zbytečný vymýšlet nejlepší způsob řešení sám. Použij bCrypt, od verze PHP 5.5 máš přímou podporu pomocí http://php.net/…ord-hash.php a v PHP 5.3 – 5.4 to můžeš nahradit tímhle: https://github.com/…sword_compat
Editoval Mysteria (3. 7. 2014 23:38)
- Jan Endel
- Člen | 1016
Použij tuhle třídu https://api.nette.org/…sswords.html a nestarej se o soli které typu jaký jsi naznačil jsou k ničemu ;).
- Mysteria
- Člen | 797
@Čamo: Otevřel jsi vůbec ten odkaz? Pokud ano, jak se můžeš ptát na nějakou dokumentaci. Tady máš něco o hashování: http://www.php.net/…asswords.php Případně ještě jsem viděl pěknou prezentaci na internetu na tohle téma, byla někde i tady zmiňovaná, ale momentálně ji nemůžu najít. Celkově je prostě blbost aby jsi se plácal s nějakým vlastním hashováním, který určitě nebude tak bezpečný jako dvě výše zmíněné implementace.
- Čamo
- Člen | 798
Pokiaľ viem tak princíp soli je o tomto: http://www.it-joker.cz/…amatora.html a nie o tom aký sa použije reťazec.
- mystik
- Člen | 312
Čamo: Dokumentace je tady http://php.net/…ord-hash.php
Ad sůl dle času nesplňuje jedno základní kritérium a to, že nesmí být odhadnutelná. Pokud tušíš, kdy se uživatel registroval tak ti je taková sůl při crackování téměř k ničemu.
- Čamo
- Člen | 798
A nieje to náhodou tak, že k tomu aby mohol byť úspešný bruteforce
útok potrebuješ nielen poznať sol, ale aj algoritmus, ktorý sa použil?
Takže ak sa už útočník dostal až tam a toto
všetko pozná, tak môže začať lámať heslá, inak asi sotva. Alebo mi
niečo uniká? K tomu majú samozrejme prístup správcovia, čo je určite
riziko.
Ale nie som si istý či v takom prípade bude stačiť aj ten
password_hash().
Bude?
- Jan Endel
- Člen | 1016
Jde spíše o to, že SHA1 umí dnešní laptopy miliony až miliardy hashů za sekundu které můžou porovnávat, specializované stroje násobně víc.
U bkryptu je těch hashů za sekundu v řádech desetitisíců u pokročilejších strojů.
Takže když použiješ Password::hash a Password::verify:
- bude to jednoduší na implementaci
- Přehlednější
- Nemusíš vymýšlět obskurity jako saltování timestampem vytvoření uživatele
- Minimálně 1000× tak bezpečnější
Proč se pořád zatvrzele držíš svého řešení?
- mystik
- Člen | 312
Algoritmus musí být vždycky považovaný za veřejný. Security through obscurity nefuguje moc dobře. (https://cs.wikipedia.org/…gh_obscurity). Ví ho vždycky až moc lidí aby se dal utajit (každý zaměstnanec, bývalý zaměstnanec, každej správce u hostingu, …). Správně bys ty hesla neměl být schopen cracknout ani ty.
Pokud použiješ password_hash tak používáš nejsilnější aktuálně známý hash algoritmus. Brute force útok na něj je téměř jistě mnohem složitější než cokoliv co si vymyslíš ty. Stačit by to mělo jednoduše proto, že ten algoritmus má správné vlastnosti. Nejsou v něm známé algoritmické chyby, které by pomáhaly zmenšit stavový prostor, je pomalý takže zkoušení všech možností bude řádově pomalejší, automaticky používá náhodnou sůl, …
Pokud chceš ještě více zvýšit zabezpečení tak ten hash ještě šifruj symetrickým klíčem, který je jen na serveru (ne ve zdrojácích). Potom by útočník musel získat nejen přístup k DB (SQL injection) ale i k file systému.
- Čamo
- Člen | 798
Z kade to teda mám, že funkcia crypt() je slabá. Nehovorím teraz o password_hash(), lebo tá prišla až s php 5.5 Ako sa teda veci mali doteraz??
Jan Endel:
Neber to ako nejakú moju tvrdohlavosť, proste sa pýtam, aby som to pochopil.
Ja nerád robím veci ktoré nechápem.
mystik:
No to ohľadom Security through obscurity je pravda. Ale snažím sa zistiť ako
to bolo vlastne doteraz, lebo php 5.5 a password_hash() tu je len chvíľu.
Editoval Čamo (4. 7. 2014 20:45)
- Filip Procházka
- Moderator | 4668
Máš to nejspíš od hodně špatného zdroje, protože funkce samotná slabá není, můžeš jí pouze vnutit slabý algoritmus, nebo slabý cost (všimni si v dokumentaci, že podporuje i md5).
password_hash
a password_verify
je jenom
jednodušší api nad crypt. Jak sis určitě všiml, použít crypt
správně není vůbec jednoduché, proto taky existuje v Nette třída Password která dělá to samé, obaluje funkci
crypt
, aby se dala lépe používat a nemohl jsi v tom udělat
chybu (nebo alespoň hodně složitě). Funkce password_hash
je
v php od 5.5, ale Passwords
můžeš používat díky Nette už
od 5.3.
Pointa je taková, že v současnosti prostě neexistuje lepší hashovací
funkce, než tu kterou vnitřně používá třída Passwords
v Nette. Pokud chceš vědět víc o blowfish hasování, funkci crypt a
věcech okolo víc, tak použij google, nemá smysl abychom ti sem do fóra
přepisovali dokumentaci jednotlivých funkcí a nástrojů.
Stejně tak nemá smysl v novém projektu používat jakýkoliv jiný hashovací algoritmus, než ten co ti nabízí Nette.
A ještě perla na závěr, třída Passwords
ti dokonce umí
říct, pokud heslo potřebuje přehashovat, funkci crypt totiž jde předat
„cost“ což znamená jak moc má být hashování drahé… Takže až za
5 let budou 100× rychlejší počítače, tak prostě zvedneš cost a aplikace
ti postupně, jak se ti budou přihlašovat uživatelé, hesla přehashuje na
„dražší“ hash (tedy pomalejší) a opět si v pohodě, protože
nepůjdou v rozumném čase cracknout silou.
- Čamo
- Člen | 798
Tak som si teda prešiel tie zdroje a jedna vec by sa hádam dala na tej Nette\Security\Password triede vylepšiť. V dokumentácii k password_hash() je v príklade 4# zaujímavý kúsok kódu, ktorý nastaví parameter cost na akúsi minimálnu rozumnú hranicu, miesto toho aby sa zadával natvrdo.
Filip Prechádzka:)
Však stačí odkaz, lebo zase ten Google vpľuje všetko na čo dosiahne a
v tom sa môže človek aj utopiť.
Editoval Čamo (5. 7. 2014 12:21)
- Filip Procházka
- Moderator | 4668
To stejné dělá
i Passwords a defaultní
cost je v součanosti 10, pokud ti to nevyhovuje, můžeš si ho přes
$options
zvednout.
A jak je vidět, i salt se ti generuje sama, takže opravdu stačí pouze
$hashed = Nette\Utils\Passwords::hash($password);
a pak
if ( ! Nette\Utils\Passwords::verify($password, $hashed)) {
throw new SecurityException("hesla se nerovnají");
}
- Čamo
- Člen | 798
Filip Procházka:
Nette passwords to nerobí. Tam ide o to, že hodnota cost sa nastaví na
maximálnu hodnotu automaticky a minimum je 10. A ide o to, aby som nemusel
robiť zásahy do zdrojového kódu Nette. Inak by som to musel pre každý
nový projekt robiť. Ja sa s tým vyrovnám, bol to len taký nápad.
- MartinitCZ
- Člen | 580
Však nemusíš zasahovat do zdrojáku Nette. Cost si můžeš nastavit sám. Možná, kdyby sese podíval na api, tak už si to dávno zjistil!
Nicméně automatická detekce dle výkonu serveru je opravdu blbost! Jednou ti to hodí cost na 20, pak se server zpomalí, víc ho zatížíš, a cost je na 10… a máš problém.
Raději si detekuj výkon serveru sám a cost si nastav klidně na 31.
A pokud opravdu potřebuješ automatickou detekci, tak takto:
public static function countMeCost()
{
$timeTarget = 0.2;
$cost = 9;
do {
$cost++;
$start = microtime(true);
password_hash("test", PASSWORD_BCRYPT, ["cost" => $cost]);
$end = microtime(true);
} while (($end - $start) < $timeTarget);
return $cost;
}
...
..
..
$hashed = Nette\Utils\Passwords::hash($password, array('cost' => self::countMeCost()));
Editoval MartinitCZ (5. 7. 2014 17:32)
- Filip Procházka
- Moderator | 4668
Ale vždyť oni tam píšou, že si máš vyzkoušet jakou cost zvládá tvůj server v rozumném čase a tu pak hodit do nějakého configu a používat, nemáš to dělat při každé registraci. Uvědom si, že když když dáš cost moc vysokou a začne se ti přihlašovat 10 lidí, tak ti to vyžere kompletně všechen CPU výkon a ten poslední se může přihlašovat klidně i vteřiny… to nechceš.
- spaze
- Generous Backer | 28
Ahoj všem,
pokusím se odpovědět na to, na co odpovězeno nebylo (přímo). Filip a Jan a Martin už (dobře) odpověděli na ten zbytek (díky!)
Myslíš, že soliť timestampom nieje dobrý nápad?
Ne, není. Timestamp se mění jednou za vteřinu, když se zaregistrují dva lidé se stejným heslem ve stejnou vteřinu, budou mít stejný hash. Salt se používá proto, aby stejné heslo neměli nikdy.
Salt ale nemá co dělat v DB
Salt v db je ok. Kam jinam strkat salt, když pro každýho uživatele musí být unikátní? Salt nezabraňuje ani nezpomaluje crackování hesel pomocí brute force/dictionary/hybrid útoků.
potrebuješ nielen poznať sol, ale aj algoritmus, ktorý sa použil?
Ano. Ten se ve většině případů dá poznat pouhým pohledem na hashe, příp. je napsaný ve zdrojovém kódu, zná ho bývalý vyhozený kolega, příp. ti ho někdo úplně v klidu řekne.
Na závěr: jakákoliv knihovna nebo funkce na hashování hesel, která vyžaduje zadávání saltu je špatná. Viz toto vlákno.
UPDATE:
Jeden salt sa pridáva z DB a druhý z php. Tak som sa to učil ja. Je na
tom niečo zlé?
Ano. Salt má být jen jeden, náhodný a unikátní. Na přidávání dvou saltů není žádný algoritmus připraven ani prověřen.
Editoval spaze (9. 7. 2014 3:16)
- Čamo
- Člen | 798
spaze:
Zdravím, keď si taký rozbehnutý nevedel by si mi vysvetliť toto: https://forum.nette.org/…sulade-s-pdo
Mám na mysli ako to robí Doctrine?
- spaze
- Generous Backer | 28
Nevedel, nevím. Ale v rychlosti jsem se podíval do zdrojáků Doctrine a
pak do FAQ a tam našel toto: Doctrine does not check if you are re-adding
entities with a primary key that already exists
Takže Doctrine to nerobí asi nijak. Každý databázový systém to řeší
jinak, univerzálně to nejde a je třeba koukat na stavový kódy tak, jak ti
radí jinde. Viz třeba právě Kdyby/Doctrine/Connection.php
PS: do tohoto vlákna toto téma nepatří, dále není třeba zde pokračovat.
Editoval spaze (10. 7. 2014 1:05)