Diskuze: Generátor hesel
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Super, už to nedělá jedno písmenko.
Jenže, když mám stanovený počet znaků (10) tak to napíše náhodný
počet znaků do 10.
Ještě tohle potřebuji opravit a bude to vše.
Díky
Pokud chceš, aby ti to udělalo heslo přesně tak dlouhé kolik zadáš, odeber funkci pass.Next() u deklarace proměnné maxznaky. Ta funkce dělá to, že vybere náhodné číslo menší než číslo které do ní zadáš. Bude to tedy vypadat takhle:
int maxznaky = Convert.ToInt32(text_minh.Text);
if (check_pismena.Checked == true)
{
while (maxznaky-- > 0)
{
heslo.Append(pismena[pass.Next(pismena.Length)]);
text_heslo.Text = heslo.ToString();
}
}
Jenže, když mám stanovený počet znaků (10) tak to napíše náhodný počet znaků do 10.
To dělá přesně tato řádka:
int maxznaky = pass.Next(Convert.ToInt32(text_minh.Text));
Musíš dát pryč to
pass.Next
Super, děkuji Vám oběma.
Rozhodně jste mi pomohli, jsem začátečník a tady tu práci musím odevzdat
k talentovým zkouškám na školu.
Díky moc, Daniel.
Jestli jsi začátečník (a očekává se to od tebe!), je to asi OK, ale
tohle rozhodně není bezpečný generátor hesel (tedy pro vygenerování pár
hesel na nějaký náhodný web to je relativně ok). Rozhodně to není dost
bezpečné na to, abys chtěl šifrovat cokoliv závažného (cokoliv, co není
test ).
Na to by se použil zcela jiný přístup. Protože to není úplně
triviální, nebudu psát kód; spíš abys o tom věděl. Jestli tě to
zajímá, splácnu něco, až bude čas.
Proč?
Random
je pseudonáhodný generátor čísel,
takže stroji by nedalo příliš velký problém zjistit, co jaká "náhodná"
čísla v tom momentě mohl vygenerovat a heslo uhodnout. Random je ale
relativně rychlý a je to naprosto v pořádku pro většinu použití - kromě
právě bezpečnosti.
Když chceš generovat úplně náhodná čísla, je třeba nějaký zdroj
náhodnosti. Třeba random.org používá nějaké poryvy větru, myslím,
některé operační systémy mohou třeba používat jemné nuace v pohybu
myši, v extrémních případech dokonce existuje HW modul, co generuje
náhodná data na základě kvantové mechaniky. Od toho tě ale naštěstí
snad všechny moderní jazyky odstíní a poskytují nějaké rozumné API. Jen
se to potom nepoužívá tak hezky jako Random
, protože to
generuje náhodné byty a ne čísla a typicky to musí být v
using
bloku.
"takže stroji by nedalo příliš velký problém zjistit,"
Prosím, jak to ten zatracený stroj bude hádat? Na základě čeho? Je to za předpokladu, že ten stroj zná dostatečně dlouhou sekvenci vygenerovaných čísel, použitou funkci (včetně dodatečného kódu, jako například promíchání vstupních znakových polí) a pokud možno i počáteční náhodný seed té funkce? Možná bychom mu také mohli říct, kolikáté je to heslo v pořadí, aby to byla sázka na jistotu. A jak bude takový stroj řešit případné obranné mechanismy, jako je například zablokování účtu po n-tém špatně zadaném heslu?
Splácáš tedy něco ? Proč je random nebezpečný, jak se dá "předvídat", ukázky... To by bylo dost informativní
Generování skutečně náhodné posloupnosti je v deterministickém prostředí problém. Počítač si nemůže házet korunou. Čistě teoreticky není ani hození korunou náhodné. Pokud známe všechny parametry hodu, pak dokážeme určit výsledek.
Povězme ale, že jsme házeli korunou dostatečně dlouho a dostali jsme množinu výsledků. Mělo by platit, že v dostatečně velké množině bude rovnoměrné rozložení (distribuce) hodnot hlavan-orel v poměru 1:1. Pokud to tak není, můžeme z toho usoudit, že naše házení nebylo zrovna košér. Pokud to tak je, můžeme z toho usoudit, že jde o náhodnou posloupnost?
Nikoliv. Například posloupnost 1,0,1,0,1,0 má rovnoměrné rozložení, ale docela určitě není náhodná. Člověku nedělá velké potíže, aby si domyslel, že další číslo bude 1. U skutečně náhodné posloupnosti nelze odvodit (ani z dostatečně velké množiny hodů), jaký bude ten další.
Pokud by to bylo možné, pak by například kasina měla problém.
Existují různé metody, jak získat náhodná čísla. Ty ale nejsou právě praktické pro generování rychlých náhodných hodnot.
V deterministickém, tj. předvídatelném, prostředí neumíme napsat funkci, která by sama od sebe vyplivla náhodné číslo. Pokud bychom to uměli, pak by to prostředí nebylo deterministické. Nicméně jsme schopní napsat funkci, která na základě počáteční hodnoty, tzv. seedu, dokáže generovat posloupnost hodnot, která se při zběžném zkoumání jeví jako náhodná.
Taková posloupnost se samozřejmě dá zpětně analyzovat. Potud vše dobré. Mělo by být ale jasné, že znalost funkce a jejího seedu nám sotva napoví, jaké konkrétní heslo program vygeneroval, pokud neznáme přesný okamžik, kdy ho vygeneroval, popřípadě nemusíme ani znát způsob, jak ho kód vygeneroval, jestli například programátor nějakým způsobem nepromíchal vstupní data atd. V reálném světě si ani nemůžeme být jistí, jaký způsob tvorby hesla uživatel použil.
Zpátky se vracíme k hodu korunou. Pokud bychom znali všechny parametry hodu, můžeme stanovit výsledek. Pokud nemáme k dispozici dost údajů, pak je i takový generátor hesla docela v pořádku.
A: řekni mi náhodné číslo
B: 1,1,1,1,1,1,1,1,1,1,1,1,1,1...
A: to není náhodné
B: Ale je.
Tolik k náhodnosti.
Mimochodem,.. některé kusy HW třeba čtou ze zvukového analogového vstupu a to používají jako seed .
Tak u online účtů tohle bude nejspíš bezpečné, pokud to použije
uživatel. Ale kdyby třeba hned něco šifroval tím vygenerovaným heslem,
může to dopadnout hodně špatně.
Samozřejmě počítám s nejhorším scénářem, ale s tím se počítá
vždy, když se dělá kryptografie.
Zobrazeno 13 zpráv z 13.