DB pole typu timestamp vz. Nette

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Čamo
Člen | 798
+
-1
-

Zdar! Nazdar!
Som mierne zmetený, lebo pri získavaní timestampu z DB mi zkonvertuje ten timestamp na Nette\datetime. Dá sa to vypnúť, alebo k tomu máme nejakú dokumentáciu? Chcel som len ten stĺpec použiť ako salt pri prihlasovaní.
Ďakujem.

Mysteria
Člen | 797
+
0
-

$datetime->format(‚U‘) nestačí?

Čamo
Člen | 798
+
-1
-

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.

Editoval Čamo (3. 7. 2014 22:31)

Pavel Macháň
Člen | 282
+
0
-

Č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

Mysteria
Člen | 797
+
0
-

@Č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.

Čamo
Člen | 798
+
0
-

EIFEL:
Myslíš, že soliť timestampom nieje dobrý nápad?

Pavel Macháň
Člen | 282
+
-1
-

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
+
+1
-

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)

Čamo
Člen | 798
+
-1
-

EIFEL:
Jeden salt sa pridáva z DB a druhý z php. Tak som sa to učil ja. Je na tom niečo zlé?

Mysteria:
Momentálne riešim inú vec a nejdem študovať ten github. Mám „len“ php 5.4

Editoval Čamo (3. 7. 2014 23:46)

Jan Endel
Člen | 1016
+
+1
-

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 ;).

Čamo
Člen | 798
+
-2
-

Jan Endel
Prečo myslíš že sú k ničomu? Máš k tomu nejaké argumenty?
A tá trieda password má aj nejakú dokumentáciu, či ako mám k tomu pristupovať? V čom je jej výhoda? Môže mi to prosím vás niekto priblížiť. Tú vešteckú guľu v papierníctve nemali :)

Mysteria
Člen | 797
+
+1
-

@Č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
+
-1
-

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.

Jan Endel
Člen | 1016
+
+1
-

Sůl ti umožní pouze to, že na rozšifrování řetězce nejdou použít ve většině případů rainbow tables + to že prolomení hesla trvá drobátko déle, taky jde o to, jakou chceš použít hashovací funkcni, protože zatím to vidím tak na SHA1 nebo MD5 :-).

Jan Endel
Člen | 1016
+
+3
-

Jinak na toto téma doporučuju alespoň prolítnout tuhle přednášku.

Čamo
Člen | 798
+
-3
-

Jan Endel
Díky za link. Ale ruku na srdce, hešujete heslá pri odosielaní z prehliadača, keď ma tu tak linčujete za sha1?

Jan Endel
Člen | 1016
+
+1
-

Skoro, nehashujeme, ale šifrujeme, páč jedeme se vším na https, sha1 heslo je skoro jako bys to ukládal do plaintextu, cracknutí jednoho průměrného hesla brutalforcem se dá udělat v řádů sekund až minut.

Editoval Jan Endel (4. 7. 2014 12:53)

Mysteria
Člen | 797
+
+1
-

Čamo: Proč tak trváš, na vlastním algoritmu s SHA1, když použití password_hash() a password_verify() je úplně stejně pracné na tvorbu a bezpečnost je absolutně někde jinde. Nechápu to.

Čamo
Člen | 798
+
-1
-

Mysteria
Pretože ten algoritmus nepoznám a dokumentácia chýba.

mystik
Člen | 312
+
+1
-

Č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
+
-3
-

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
+
+1
-

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:

  1. bude to jednoduší na implementaci
  2. Přehlednější
  3. Nemusíš vymýšlět obskurity jako saltování timestampem vytvoření uživatele
  4. Minimálně 1000× tak bezpečnější

Proč se pořád zatvrzele držíš svého řešení?

mystik
Člen | 312
+
+1
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)

Čamo
Člen | 798
+
0
-

Martincz
To ma tiež napadlo ohľadom toho výkonu, ale som asi ešte v štádiu, že som náchylný veriť tomu čo píšu v dokumetácii. Sú to predsa autori jazyka.

Editoval Čamo (5. 7. 2014 21:20)

Filip Procházka
Moderator | 4668
+
0
-

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
+
+4
-

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
+
0
-

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
+
0
-

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)