Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: krypt 18. 09. 2013, 12:22:03

Název: Šifrovací algoritmus pro hesla
Přispěvatel: krypt 18. 09. 2013, 12:22:03
Ahoj,

mohl byste mě někdo naťuknout nebo nasměrovat na šifrovací algoritmus, díky němuž bych mohl zašifrovat heslo při požadavku/autentifikaci, aby:

- při každém šifrování řetězce/hesla vygeneroval jiný řetězec

- z generovaných řetězců by heslo nebylo možné uhodnout (tj. podle nějakého společného znaku)

- bylo možné s daným heslem k dispozici ověřit, zda byl z něho řetězec daným algoritmem vygenerován

Z hlediska kryptografie asi rutinní záležitost, nicméně moc netuším kde začít.

Díky
Název: Re:šifrování hesla
Přispěvatel: SHA 18. 09. 2013, 12:48:12
silná hashovací funkce (např. z rodiny SHA) + náhodný salt je to co hledáte
Název: Re:šifrování hesla
Přispěvatel: prezek 18. 09. 2013, 13:09:58
O šifrování prakticky skoro nic nevím (kromě toho, že o šifrování moc neví ani Linus Torvalds), takže mě neberte moc vážně...
silná hashovací funkce (např. z rodiny SHA) + náhodný salt je to co hledáte
Pokud bude zasoleno náhodně, tak už to nijak nepůjde ověřit, ne?

Požadované podmínky by snad mohlo splnit libovolné šifrování rozšířením vstupního řetězce o náhodnou sekvenci znaků("Heslo"->"nahodnaDataDelkyTreba28ZnakuHeslo"->šifrování->pokaždéJináŠifra->dešifrování->"nahodnaDataDelkyTreba28ZnakuHeslo"->oříznutíPrvních28Znaků->"Heslo"). Samozřejmě to musí být zařízeno tak, aby se např. u blokové šifry vešlo vše do jednoho bloku apod.
Název: Re:šifrování hesla
Přispěvatel: krypt 18. 09. 2013, 13:15:59
silná hashovací funkce (např. z rodiny SHA) + náhodný salt je to co hledáte

vypadá to tak

kdyžtak se ještě ozvu  ;)
Název: Re:šifrování hesla
Přispěvatel: SHA 18. 09. 2013, 13:45:01
silná hashovací funkce (např. z rodiny SHA) + náhodný salt je to co hledáte
Pokud bude zasoleno náhodně, tak už to nijak nepůjde ověřit, ne?

Náhodný salt vždy funguje tak že se stane (nezašifrovanou) součástí zahashovaného výsledku. Slouží ke zkomplikování slovníkových útoků ("rainbow tables" - což jsou předpočítané zahashované běžné výrazy).
Název: Re:šifrování hesla
Přispěvatel: prezek 18. 09. 2013, 14:02:02
A jak se potom prověří původní heslo, když poprvé hashuju se solí 132546, podruhé 345646546, potřetí 467654657 atd.. To se přenáší hash a sůl pro možnost zkontrolování? To by pak asi šlo, ale kdyby kontrolní algoritmus neznal původní heslo, nebo sůl se kterou bylo hashováno, tak by to nemohlo fungovat, že?
Název: Re:šifrování hesla
Přispěvatel: Pavel... 18. 09. 2013, 14:18:43
taka blba myslienka: co tak ako sol pouzivat cas?
Ma to svoje obmedzenia v podobe nutnosti mat aspon trochu presny cas, ale moze to byt pouzitelne riesenie.
Název: Re:šifrování hesla
Přispěvatel: DK 18. 09. 2013, 14:27:00
musis pouzivat porad stejny salt pro dane heslo, jinak to nezkontrolujes
Název: Re:šifrování hesla
Přispěvatel: prezek 18. 09. 2013, 14:52:43
tak to potom nemůže splňovat tento požadavek
- při každém šifrování řetězce/hesla vygeneroval jiný řetězec

Já to pochopil tak, že chce, aby mu po zašifrování/hashování řetězce "ahoj" vyšlo pokaždé něco jiného.
Název: Re:šifrování hesla
Přispěvatel: Mirek Prýmek 18. 09. 2013, 15:21:27
Já to pochopil tak, že chce, aby mu po zašifrování/hashování řetězce "ahoj" vyšlo pokaždé něco jiného.
Jo, tenhle bod byl dost nesrozumitelně napsanej. Nicméně i to hash+salt splňuje:

heslo+1234 -> ABC1234
heslo+2345 -> CDE2345
Název: Re:šifrování hesla
Přispěvatel: Jack 18. 09. 2013, 16:13:22
musis pouzivat porad stejny salt pro dane heslo, jinak to nezkontrolujes
Nemusi.
Název: Re:šifrování hesla
Přispěvatel: Jose 18. 09. 2013, 16:33:52
sifrovaci algoritmus pomoci eliptickych krivek toto je schopen splnit, konkretne ECIES.
Název: Re:šifrování hesla
Přispěvatel: krypt 18. 09. 2013, 17:01:45
Jedno z řešení, k němuž jsem dospěl vlastní hlavou bylo to, že by pro autorizaci stačilo, aby byla správně část hesla/klíče.
Tudíž pro binární případ bych měl např. 256 bitový klíč, přičemž by bylo třeba, aby byla správně třeba alespoň polovina a zbytek by byl nějak náhodně vygenerován.
Tam ale nejspíš bude problém s pravděpodobností uhodnutí hesla. Kromě toho nevím, jak obtížné by bylo z určité množiny zaslaných klíčů uhodnout ten původní.
Takže asi budu muset přeci jen dát na osvědčené metody.
Název: Re:šifrování hesla
Přispěvatel: Filip Jirsák 18. 09. 2013, 18:57:28
tak to potom nemůže splňovat tento požadavek
- při každém šifrování řetězce/hesla vygeneroval jiný řetězec

Já to pochopil tak, že chce, aby mu po zašifrování/hashování řetězce "ahoj" vyšlo pokaždé něco jiného.

Uživatel si zvolí heslo, vy vytvoříte náhodnou sůl, vypočítáte heslo+sůl -> hash a uložíte si sůl+hash. Při ověření uživatel zadá heslo, vy si načtete sůl a hash, vypočítáte heslo+sůl -> hash a porovnáte jej s uloženým hashem. Sůl se tedy nevolí náhodně pokaždé, ale jen poprvé při registraci hesla. Při ověřování už se používá ta sůl, kterou máte poznamenanou spolu s hashem.
Název: Re:šifrování hesla
Přispěvatel: m 18. 09. 2013, 19:08:12
to že chcete šifrovat a ne hashovat mi trochu zavání tím, že budete chtít znát plaintext hesla.. to se nedělá. k ověření stačí hashe.

na serveru můžete mít uloženy hashe hesel, pro větší bezpečnost ještě osolena nějakou společnou solí sůl0. solení znamená, že _před_ zahashováním tu sůl k heslu nějak připojíte.

no a klient nebude potřebovat znát žádné tajné šifrovací heslo, ale jen tu sůl0 (to není nic tajného) a samozřejmě správnou hashovací funkci. heslo se osolí solí0, zahashuje, pak osolí náhodnou solí a znova zahashuje. na server se k ověření pošle výsledný hash a ta tajná sůl.. na serveru se vytáhne uživatelovo zahashované heslo, osolí tou obdrženou náhodnou solí, zahashuje, a porovná s obdrženou hashí.

jo a ty 2 hashovací funkce mohou být klidně odlišné..
Název: Re:šifrování hesla
Přispěvatel: m 18. 09. 2013, 19:11:50
(upřesnění.. já jsem to tedy taky pochopil tak, že heslo má být z nějakého důvodu pokaždé u stejného uživatele "zašifrováno" pokaždé s jiným výsledkem)
Název: Re:šifrování hesla
Přispěvatel: m 18. 09. 2013, 19:13:50
.. na server se k ověření pošle výsledný hash a ta tajná sůl..

oprava: "tajná sůl" -> "náhodná sůl"

(pozn: taky jsem to pochopil tak, že z nějakého důvodu chcete, aby výsledek "zašifrování" byl pokaždé jiný pro stejného uživatele)
Název: Re:Šifrovací algoritmus pro hesla
Přispěvatel: krypt 18. 09. 2013, 22:28:13
No, vize byla taková, že by se při každém požadavku nebo úvodní autentizaci (třeba startu session) z klíče - hesla/hashe podle určitého algoritmu z hesla vygeneroval kód, který by byl zčásti náhodný, ale spadal by do určité množiny, což by se na straně serveru podle toho klíče ověřovalo.

Nemusel bych se tedy bát o to, že mi heslo/hash někdo cestou ukradne nebo někde přečte a později použije, to je vlastně to, a co mi šlo.

Existovala by tedy určitá množina kódů, které by 'odpovídaly', která by měla být:
- tak velká, aby stačila kapacitně
- tak malá vůči všem možnostem, aby i pravděpodobnost uhodnutí jednoho z nich byla dostatečně malá
- taková, aby z určité její části nebylo snadné podle nějakých společných znaků jednotlivých řetězců vyhodnout klíč, ze kterého byly kódy vygenerovány

Nicméně možná je to trochu utopie.   :-\
Název: Re:Šifrovací algoritmus pro hesla
Přispěvatel: krypt 18. 09. 2013, 22:30:25
edit:
řetězec -> kód
když teda píšu o binárních datech

Název: Re:Šifrovací algoritmus pro hesla
Přispěvatel: krypt 18. 09. 2013, 23:18:36
omluva, vypadla mi z toho ta základní myšlenka, že by každý vygenerovaný kód byl použitelný jen jednou
(teoreticky by tedy mohl být občas vygenerován už použitý kód, což by však tolik nevadilo)
Název: Re:Šifrovací algoritmus pro hesla
Přispěvatel: Filip Jirsák 19. 09. 2013, 08:25:40
Požadavek na to, aby se nedalo znovu přihlásit odposlechnutím přihlášení jste na začátku nenapsal…

V takovém případě je potřeba určitá spolupráce klienta. Server vygeneruje náhodná data (výzvu) a zašle ji klientovi. Klient vytvoří hash hesla a výzvy a výsledek odešle serveru. Ten z uloženého hesla a výzvy vytvoří také hash a porovná jej s tím, který dostal od klienta.

Místo otevřeného hesla (aby je server nemusel znát) je možné použít osolený hash hesla. Pokud by byla sůl pro každého uživatele jiná, musel by klient nejprve požádat server o sůl + výzvu pro konkrétního uživatele, a na základě toho vypočítat odpověď. Nebo je možné použít jednu sůl pro celý server – pak klient posílá přihlašovací jméno a hash najednou. Nevýhoda takového řešení je v tom, že pokud budou mít dva uživatelé stejné heslo, na serveru bude uložen i stejný hash. Tenhle způsob autentizace se používá např. v přihlašování přes HTTP metodou Digest: http://en.wikipedia.org/wiki/Digest_access_authentication (http://en.wikipedia.org/wiki/Digest_access_authentication)
Název: Re:Šifrovací algoritmus pro hesla
Přispěvatel: rejnok 19. 09. 2013, 10:59:37
A co takhle OTP
http://en.wikipedia.org/wiki/One-time_password

Název: Re:Šifrovací algoritmus pro hesla
Přispěvatel: krypt 19. 09. 2013, 14:00:02
nenapsal jsem to asi moc srozumitelně
nicméně snad už zhruba tuším řešení
Název: Re:Šifrovací algoritmus pro hesla
Přispěvatel: Dragonsoul 13. 11. 2013, 13:07:47
to Filip Jirsak
Take se tim zabyvam, a stale to nechapu
Na serveru je zahashovane heslo 'hello' -> aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
Server posle klientovi sul '1'
klient popta po uzivateli heslo ktere je hello a k tomu prida sul '1' a vznikne 88fdd585121a4ccb3d1540527aee53a77c77abb8
Server ma hash aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d a sul '1' a co s tim dal?
Dekuji moc
Název: Re:Šifrovací algoritmus pro hesla
Přispěvatel: Dragonsoul 13. 11. 2013, 13:29:51
Tak už jsem asi na to přišel
Server ma uložený hash hesla 'hello' -> aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
Posle klientovi sul '1' ktere se zobrazi na obrazovce.
Klient pozada uzivatele o heslo ktere zahasuje a k tomu prida hash soli a to cele zahasuje a odesle servru
('hello' sha1 + '1' sha1)sha1 = sendString;
Server vezme z databaze zahashovane heslo prida k tomu hash soli a cele to zahashuje a melo by to sedet...
Název: Re:Šifrovací algoritmus pro hesla
Přispěvatel: Logik 13. 11. 2013, 13:33:56
Tak nevím, jestli jsi to pochopil dobře. Např. rozhodně nemá smysl hašovat sůl zvlášť, myslím, že směšuješ sůl (sloužící k rozrůznění v db uložených haší stejných hesel a prevenci slovníkového útoku) a výzvu (sloužící k tomu, aby nešlo odchytit pomocí MIM heslo a později znovu použít).

1) Princip VÝZVY je ten, že klient zahašuje heslo s něčím, co mu pošle server (to něco může být pokaždé jiné).
Server provede stejnou hash a porovná.

2) Pokud není záhodno, aby server znal heslo uživatele, tak může server znát pouze hash uživatele. Pak je postup stejný, akorát klient před algoritmem 1) heslo zahašuje. Pak server potřebuje znát pouze hash toho hesla.

3) Pokud není záhodno, aby šla hesla na serveru prolomit pomocí slovníku, je třeba hesla hašovat se solí. Tuto sůl buď klient zná (pak je postup stejný jako v 2, akorát se při hašování přidá sůl), nebo nezná (např. proto, že je pro každého uživatele jiná, což je bezpečnější). V tom případě musí klient o sůl požádat server. Komunikace je tedy takováto

K: Ahoj, tady uzivatel UZIVATEL, chci se prihlásit
S: Ok, sůl uzivatele UZIVATEL je SUL, náhodná vyzva je VYZVA
K: Ok, autentizuji se pomoci hash(VYZVA+hash(SUL+HESLO))
S: Zkontroluje hash(VYZVA + HASHOVANE_OSOLENE_HESLO)

To, že komunikace probíhá v jedné session, tzn. server musí vědět, že přihlašovanému poslal tu a tu výzvu a on se chce přihlásit jako ten a ten uživatel je doufám jasné.

All clear?

PS: ?ožnost, jak zjednodušit solení a zachovat unikátní sůl je nastavit sůl jako USERNAME+nějakáblbostprovšechnystejná.



Název: Re:Šifrovací algoritmus pro hesla
Přispěvatel: ryder 13. 11. 2013, 13:45:19
pozor na použitý algoritmus, sha1 není určený pro šifrování a ukládání hesel, ale pro výpočet kontrolních součtů souborů - proto je poměrně rychlý. pro hesla doporučuji bcrypt - je to "pomalý" algoritmus, který znemožní použití bruteforce útoku pro lámání hesel z hashů