[ FlatLine @ 15.07.2004. 21:27 ] @
Pravim jednu malu aplikaciju koja bi zavisila od simetrične enkripcije. Najverovatnije će biri rijndael ali to nije ni toliko bitno jer nemam sumnje u pogledu samog cyphera nego u metodu generisanja ključa.

Palo mi je na pamet da password (string/keyfile) propustim kroz md5 i dobijem standardni 32 byte digest (256bit) i da to onda koristim kao ključ. Meni se čini da je taj metod sasvim podesan, ali nisam siguran jer se digest sastoji samo iz alphanumeričkih znakova što mu automatski smanjuje raspon na samo 34 bajta (case insensitive).

Šta mislite?
[ Mikky @ 21.07.2004. 00:53 ] @
Ovo i mene interesuje, znaci kolika je sigurnost ako za kljuc uzmemo hash nekog stringa umesto sam taj string, ali izgleda da nema dovoljno dobrih poznavalaca ove oblasti na forumu.

Inace ako si u ne doumici dali bi md5 davao dovoljno siguran kljuc, mozes da koristis neki drugi hash koji daje sve vrednosti a ne samo ASCII, npr SHA512 hash daje 64bitni (512bites) message digest.
[ FlatLine @ 22.07.2004. 14:11 ] @
Na kraju ću tako nešto da uradim.. Ponudiću korisniku izbor hash funkcije pa neka se on misli :)
[ Mikky @ 22.07.2004. 22:16 ] @
Zavisi kojim korisnicima si namenio program. Ako je nekim laicima mozda je bolje da im ti uradis taj izbor nego da oni dobiju gomilu hash algoritama za koje nisu ni culi. U najboljem slucaju ce znati sta je i cemu sluzi "hash" :)
Ali ako ti je ciljna grupa neka grupa kriptoanaliticara (sto neverujem jer bi oni vec sami uradili program kakav im treba) onda zasto da ne.
[ zvrba @ 09.08.2004. 09:13 ] @
Kako to mislis da si smanjio (i STO) na 34 bajta? Rezultat npr. MD5 hash funkcije je 16 bajtova = 128 bitova. Sasvim dovoljna duljina kljuca za 128-bitni simetricni algoritam. I povecanjem duljine kljuca neces dobiti na sigurnosti enkripcije. Takodjer ni povecanjem duljine hasha.

U cijeloj prici je i dalje je najslabija tocka userov password koji je vrlo cesto los. Nitko nece ici pogadjati 2^128 kombinacija kljuca kad moze isprobavati puno manje kombinacija userovog passworda.

Za detaljniju diskusiju na temu sigurnosti passworda pogledaj

http://www.stack.nl/~galactus/remailers/passphrase-faq.html
http://world.std.com/~reinhold/diceware.html

(nazalost, zadnji site je bio down kad sam ovo pisao)
[ Mikky @ 09.08.2004. 22:56 ] @
zvrba, nas u stvari zanima da li je dobro uraditi neki hash (md5 ili sha) na korisnikovu sifru, pa onda taj hash koristiti kao kljuc za enkripciju? Umesto da se korisnicka sifra odmah koristi kao kljuc enkripcije.

Time bi kljuc uvek bio maximalne duzine za dati algoritam (plus bi se koristili svih 8 bitova po karakteru a takodje bi i entropija kljuca bila mnogo bolja) bez obzira koliku sifru ukuca korisnik, samo ne znam da li to otvara neke druge mogucnosti za ranjivost celog procesa enkripcije i zastite?
[ zvrba @ 10.08.2004. 08:37 ] @
OK je ako koristis hash passworda kao kljuc za enkripciju. To se najcesce tako i radi i u komercijalnim projektima (npr. gledao sam malo source za BestCrypt za Linux koji omogucava enkriptirane particije). I da, prednost je sto onda dobijes kljuc duljine koja ti vec treba za dani simetricni algoritam. Samo pazi da nigdje u enkriptiranom fajlu ne spremis plaintext hash :)

Koji hash odaberes je sasvim nebitno - imas ih cijelo cudo na biranje, npr. SHA-1, MD5, RIPEMD160, SHA-384, SHA-512, standardni hashevi bazirani na blok-enkripciji (npr. Davies-Meyer konstrukcija) itd... Najlakse ti je ako izaberes onaj cija duljina odgovara duljini kljuca koja ti treba.. Nikako ne smije biti kraca duljina od duljine kljuca.. Ako je vece duljine, samo uzmes bitova koliko ti treba od pocetka ili kraja..

Ali, ponavljam, problem ti je u korisnikovom passwordu. Racunanje bilo kakvog hash-a je deterministicki proces. Za isti ulaz UVIJEK daje isti izlaz. Sto ce reci: sam hash NE POVECAVA entropiju. Kad bi netko isao provaljivati enkripciju, nece ici pogadjati 128 bitova hasha nego ce ici pogadjati userov password.

Sto se tice sigurnosti: svi hashevi su konacne duljine. Dakle, postoje dvije poruke sa ISTOM hash vrijednoscu (Dirichletov princip: imas 2^128 mogucnosti za rezultat MD5 hasha; dakle ako hashiras 2^128+1 poruku, neke dvije ce imati isti hash). E sad, stvar je u tome sto napadac NE TREBA pogoditi korisnikov password vec treba naci poruku koja se hashira u ISTU VRIJEDNOST KAO I korisnikov password. Ako je hash duljine N bitova, prosjecan broj poruka koje treba 'isprobati' je 2^(N/2), dakle 2^64.

Najsigurnije bi bilo za password generirati 16 slucajnih bajtova, to enkodirati u base-64 (radi lakoce utipkavanja) i staviti korisniku kao KLJUC (ne password). Npr. sa openssl-om iz UNIX shell-a:

$ openssl rand -base64 16
u1H0RpNv2U99rFuBEdosPQ==

Tako imas punih 128 bitova entropije, ako je generator slucajnih brojeva siguran (na Linuxu i FreeBSD-u je jer koristi /dev/urandom). Naravno, takav password je skoro nepamtljiv prosjecnom korisniku :) Kod koristenja takvog passworda za kljuc, jednostavno dekodiras base-64 u binarni oblik. Npr. gornji base-64 oblik se dekodira u sljedecih 16 bajtova (hex):

bb51f446936fd94f7dac5b8111da2c3d