Nette\String randomString/random

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Patrik Votoček
Člen | 2221
+
0
-

Hodil by se generator náhodných stringů. (pro hesla, klíče atd.)
něco jako:

class String
{
	public static function random($length, $base = "abcdefghjkmnpqrstwxyz123456789")
	{
		$max = strlen($base)-1;
		$string = "";

		mt_srand((double)microtime()*1000000);
		while (strlen($string) < $length)
			$string .= $base[mt_rand(0,$max)];

		return $string;
	}
}

Editoval vrtak-cz (19. 6. 2009 4:02)

pmg
Člen | 372
+
0
-

Asi to nedopadne, protože podobná funkce už byla jednou odstraněna. Můžeš to ale hodit do repozitáře. :-)

Inza
Člen | 330
+
0
-

Je to jasná věc do Nette/Extras – jsem pro přidání to do něj…

R2D2
Člen | 22
+
0
-

ještě nahradit $key za $string, jinak ten cyklus poběží celkem dlouho :)

jinak mt_srand((double)microtime()*1000000); .. je vcelku zbytečné, od php 4.2 se seedování provádí automaticky a to pokud vim lépe, microtime * M je špatnej seed.

pmg
Člen | 372
+
0
-

Taky bacha na to, že funkce mt_rand entropii negeneruje, nýbrž jen mixuje seed. Pro generování kryptografických klíčů slabé. Více tady.

Patrik Votoček
Člen | 2221
+
0
-

R2D2 napsal(a):

ještě nahradit $key za $string, jinak ten cyklus poběží celkem dlouho :)

Sorry… Opraveno

Každopádně jsem to sem psal protože to je věc která mě hodně ve FW chybí a to protože spousta z nás má aplikace kde je zaslání zapomenutého hesla uživately a jelikož jsme chytří tak ho nemame jako plain text ale hash (MD5, SH1 atd.). A tak nemůžeme zaslat aktuálně nastavené heslo uživatele a proto generujeme nové „náhodné“. A to poté posíláme a nastavujeme. A tak by se hodilo mít tohle rovnou ve FW.

pmg
Člen | 372
+
0
-

No nevím, já heslo ukládám jako MD5 hash právě proto, abych v případě zapomenutí nemusel generovat nové. Jiný důvod pro použití této funkce nevidím.

nAS
Člen | 277
+
0
-

Mě by se tato funkce také hodila. Teď zrovna potřebuju generovat salt pro ukládání hesel a určitě ji budu potřebovat pro zasílání zapomenutých hesel. Nějak jsem nepochopil, jak pmg řeší zapomenuté heslo? Když je heslo zahashované, tak jej nemůžeš uživateli poslat a tedy je potřeba mu vygenerovat nějaké nové, ne? A ještě by mě zajímalo, proč třída String nedědí od Object? Takhle si tam tu metodu nemůžu dodat ani přes extensionMethod :(

vlki
Člen | 218
+
0
-

String je statická třída, tedy jen knihovní třída zastřešující nějaké funkce. Takže si stačí napsat třídu, do které si budeš psát vlastní knihovní funkce. Čistěji už to moc nejde…

Že by pmg posílal ten md5 hash, aby si své heslo uživatel zjistil sám porovnáváním?:)

Editoval vlki (19. 6. 2009 17:20)

pmg
Člen | 372
+
0
-

No dobře, byla to narážka na to, že je snadné k MD5 nalézt kolizi. Na druhou stranu se nalezení kolize nemusí rovnat prolomení hesla, které je při určitém designu aplikace tím jediným, co vyžaduje vysokou ochranu.

Dobrá ochrana hesla se dá v praxi realizovat tak, že se hashuje opakovaně, použije se salt, a udělá se to javaskriptem na straně klienta. Vlastní certifikát SSL a chráněný server je určitě lepším řešením, ale všechno to stojí dinero. Existují racionální důvody proč se obávat sdílených hostingů / certifikátů.


Jinak jsem rád, že někdo (konečně) zareagoval na moji signaturu. Je to výborná parafráze! A také vidím, že jsem to napsal blbě… hned to fixnu. Troll fed. :-D

Editoval pmg (19. 6. 2009 22:02)

nAS
Člen | 277
+
0
-

vlki napsal(a):

String je statická třída, tedy jen knihovní třída zastřešující nějaké funkce. Takže si stačí napsat třídu, do které si budeš psát vlastní knihovní funkce. Čistěji už to moc nejde…

No jasně, tak jsem to taky vyřešil, jenom mi připadá, že by se to hodilo do třídy String a když už má Nette ty extensionMethod-y, tak je škoda, že zrovna když to poprvé potřebuju, tak to nejde :)

Že by pmg posílal ten md5 hash, aby si své heslo uživatel zjistil sám porovnáváním?:)

… a dostává tisíce děkovných dopisů ;)

pmg napsal(a):

No dobře, byla to narážka na to, že je snadné k MD5 nalézt kolizi. Na druhou stranu se nalezení kolize nemusí rovnat prolomení hesla, které je při určitém designu aplikace tím jediným, co vyžaduje vysokou ochranu.

Přesně tak, kolize tady v tom případě nijak nevadí.

Dobrá ochrana hesla se dá v praxi realizovat tak, že se hashuje opakovaně, použije se salt, a udělá se to javaskriptem na straně klienta. Vlastní certifikát SSL a chráněný server je určitě lepším řešením, ale všechno to stojí dinero. Existují racionální důvody proč se obávat sdílených hostingů / certifikátů.

A třeba právě ten salt je potřeba náhodně generovat.

Jinak jsem rád, že někdo (konečně) zareagoval na moji signaturu. Je to výborná parafráze! A také vidím, že jsem to napsal blbě… hned to fixnu. Troll fed. :-D

Jj, tvůj podpis se mi líbí už dlouho. :)

romansklenar
Člen | 655
+
0
-

Myslím, že statické metody nejdou pomocí extension method do tříd přidávat, proto asi ani String nedědí z Object-u.

pmg
Člen | 372
+
0
-

A třeba právě ten salt je potřeba náhodně generovat.

Možná trochu jednodušší je generovat salt inkrementálně.

Jj, tvůj podpis se mi líbí už dlouho. :)

Jen se často mění, tak si dávej pozor, co chválíš. :-)

PetrP
Člen | 587
+
0
-

romansklenar napsal(a):

Myslím, že statické metody nejdou pomocí extension method do tříd přidávat, proto asi ani String nedědí z Object-u.

Jedině v php 5.3 pomocí magické metody __callStatic().

Ví někdo proč se nepřidali i metody jako __getStatic atd?

Majkl578
Moderator | 1364
+
0
-

PetrP napsal(a):
Ví někdo proč se nepřidali i metody jako __getStatic atd?

http://www.google.cz/search?…
první odkaz je zajímavý, včetně patche

LM
Člen | 206
+
0
-

Majkl578 napsal(a):

PetrP napsal(a):
Ví někdo proč se nepřidali i metody jako __getStatic atd?

http://www.google.cz/search?…
první odkaz je zajímavý, včetně patche

Ten patch stál za houby a nikdo se neměl k tomu ho dotáhnout do konce, každopádně třeba Environment::$templatesDir by bylo pěknější než Environment::getVariable(…).

Editoval LM (23. 6. 2009 10:09)