NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Daniel Pajdič:21.12.2017 19:20

Zdravím, chtěl bych si udělat generátor hesel, napsal sem si kód atp. Myslel sem, že vše bude fungovat, avšak opak je pravdou.
Pokud kliknu na "Generovat" zobrazí se jen jedno písmeno, ne tolik, kolik napíši (maxznaky)
Prosím o radu, co mám udělat, aby se zobrazoval počet co zadám.
Díky.

private void but_generovath_Click(object sender, EventArgs e)
{
    int cisla = 123456789;
    string pismena = "abcdefghcijklmnopqrstuvwxyz";
    string pismenaV = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string znaky = ",.-§)(:?_!/@$€*&";

    StringBuilder heslo = new StringBuilder();
    Random pass = new Random();

    int maxznaky = pass.Next(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();
    }

}
 
Odpovědět
21.12.2017 19:20
Avatar
Ota Vlna
Člen
Avatar
Ota Vlna:21.12.2017 19:35

Zkus to takhle, mně to funguje, jen jsem přidal složený závorky okolo toho co má být v tom while loopu.

while (maxznaky-- > 0)
{
        heslo.Append(pismena[pass.Next(pismena.Length)]);
        text_heslo.Text = heslo.ToString();
}
 
Nahoru Odpovědět
21.12.2017 19:35
Avatar
Daniel Pajdič:21.12.2017 19:38

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 :)

 
Nahoru Odpovědět
21.12.2017 19:38
Avatar
Ota Vlna
Člen
Avatar
Ota Vlna:21.12.2017 19:49

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();
        }
    }
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
21.12.2017 19:49
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Daniel Pajdič
gcx11:21.12.2017 19:50

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
 
Nahoru Odpovědět
21.12.2017 19:50
Avatar
Daniel Pajdič:21.12.2017 19:51

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.

 
Nahoru Odpovědět
21.12.2017 19:51
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Daniel Pajdič
Petr Čech:21.12.2017 20:38

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 :D).
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.

Nahoru Odpovědět
21.12.2017 20:38
the cake is a lie
Avatar
hanpari
Člen
Avatar
Odpovídá na Petr Čech
hanpari:22.12.2017 8:54

"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?

https://gizmodo.com/…w-1797643987

 
Nahoru Odpovědět
22.12.2017 8:54
Avatar
Shade
Člen
Avatar
Odpovídá na Petr Čech
Shade:22.12.2017 9:15

Splácáš tedy něco ? Proč je random nebezpečný, jak se dá "předvídat", ukázky... To by bylo dost informativní :P

Nahoru Odpovědět
22.12.2017 9:15
Talk is cheap. Show me the code.
Avatar
hanpari
Člen
Avatar
Odpovídá na Shade
hanpari:22.12.2017 13:34

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.

 
Nahoru Odpovědět
22.12.2017 13:34
Avatar
Odpovídá na hanpari
Marian Benčat:22.12.2017 13:37

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 .

Nahoru Odpovědět
22.12.2017 13:37
Totalitní admini..
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na hanpari
Petr Čech:22.12.2017 18:43

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.

Nahoru Odpovědět
22.12.2017 18:43
the cake is a lie
Avatar
hanpari
Člen
Avatar
hanpari:22.12.2017 20:06

Kdybych s tebou souhlasil, popřel bych smysl toho, co jsem napsal předtím. V každém případě zajímavé téma. Pěkné Vánoce.

Editováno 22.12.2017 20:06
 
Nahoru Odpovědět
22.12.2017 20:06
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.