Šifrovací algoritmus pro hesla

krypt

Šifrovací algoritmus pro hesla
« kdy: 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
« Poslední změna: 18. 09. 2013, 21:35:35 od Petr Krčmář »


SHA

Re:šifrování hesla
« Odpověď #1 kdy: 18. 09. 2013, 12:48:12 »
silná hashovací funkce (např. z rodiny SHA) + náhodný salt je to co hledáte

prezek

  • ***
  • 229
    • Zobrazit profil
Re:šifrování hesla
« Odpověď #2 kdy: 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.

krypt

Re:šifrování hesla
« Odpověď #3 kdy: 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  ;)

SHA

Re:šifrování hesla
« Odpověď #4 kdy: 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).


prezek

  • ***
  • 229
    • Zobrazit profil
Re:šifrování hesla
« Odpověď #5 kdy: 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?

Pavel...

Re:šifrování hesla
« Odpověď #6 kdy: 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.

DK

Re:šifrování hesla
« Odpověď #7 kdy: 18. 09. 2013, 14:27:00 »
musis pouzivat porad stejny salt pro dane heslo, jinak to nezkontrolujes

prezek

  • ***
  • 229
    • Zobrazit profil
Re:šifrování hesla
« Odpověď #8 kdy: 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.

Re:šifrování hesla
« Odpověď #9 kdy: 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

Jack

Re:šifrování hesla
« Odpověď #10 kdy: 18. 09. 2013, 16:13:22 »
musis pouzivat porad stejny salt pro dane heslo, jinak to nezkontrolujes
Nemusi.

Jose

Re:šifrování hesla
« Odpověď #11 kdy: 18. 09. 2013, 16:33:52 »
sifrovaci algoritmus pomoci eliptickych krivek toto je schopen splnit, konkretne ECIES.

krypt

Re:šifrování hesla
« Odpověď #12 kdy: 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.

Re:šifrování hesla
« Odpověď #13 kdy: 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.

m

Re:šifrování hesla
« Odpověď #14 kdy: 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é..