» »

Skrivanje gesel

Skrivanje gesel

Primoz ::

Zanima me, kako imate na svojih straneh izvedeno shranjevanje gesel. Plain text, kakšen oneway hash, kakšna dvosmerna kodirna funkcija? In zakaj ste se odločili za to metodo.

Na Slo-Techu uporabljamo SHA256.
Zakaj... ne vem (ker mi je všeč hash algoritem) :D
There can be no real freedom without the freedom to fail.

darh ::

najprej je bil samo plain text... nato sem prešel na crypt... ko sem začel mySQL uporabljat je vse opravljala SQL funkcija PASSWORD, zdj pa delam sam še z MD5...
Excuses are useless! Results are priceless!

milosm ::

Tudi MD5.

krho ::

MD5

darh ::

aja.. še zakaj..

plaintext - simple
crypt - plaintext se mi je zazdel insecure, crypt je bil pri roki
password - crypt mi je bil neroden (and don't ask why :D ) in ker sm začel delat z MySQLom je bil PASSWORD() pri roki ;)
MD5 - ker je bil PASSWORD mogoč samo skozi mySQL (vsak kakor vem), za vsak enckripšn pa se mi ni dal querya delat :D.. MD5 pa daenak output pr PHPju in mySQLju (kar za crypt v ene par primerih nisem bil prepričan ;) ), tako da lahko enkryptam tako kot mi paše...

tale SHA256 pa zgleda ni možn v PHPju... ;)
Excuses are useless! Results are priceless!

cahahopie ::

Kaj pa....če...nič ne enkriptaš ?:D
O.k. tole ne ravno ne sodi v vašu intelektualno višino toda.. zanima kateri del celotnega sistema (server-baza-skripta-browser) zavaruješ? Jaz mislim na enkriptanje v bazi. Če ti en model vpiše username in geslo se tisto geslo iz baze odenkripta in prečekira z danim ali pa vnešeno enkripta in se primerja z enkriptom v bazi...bla bla. In nato z dovoljenjem te prijavi. Sam kje si se tukaj zavarval pred hekerčkim? Da ne morjo vedet kakšen je pass v bazi?
Sam...kaj pa če vejo s katerim algoritmom oz. funkcijo si to zakripto?

Razjasnite mi pogled! Vi ste preroki! Halalalala..... :D

darh ::

nene cahahopie.... NIKOOOL ne delaš tako...

maš password k ga je dal user... pol pa tega zaenkriptiraš in primerjaš rezultat - torej enkriptan string z tistim v bazi, k si ga že poprej enkriptiru...

torej... uporaba one-way alogaritmov.. tako da nobedn ne ve kak je original password razen tistega k ga je vpisu...

aveeš... to je security..


ampak še zmer ti lahko kdo posliša na liniji med USER-SYSTEM al pa SYSTEM-DB... pol maš pa še druge system če si tolk pranaoyik...
Excuses are useless! Results are priceless!

alesrosina ::

hm.... to se prav, da lahko jst nardim en cist svoj sistem kodiranja, ki ga poznam samo jaz .... in ta sistem je zapisan kot plain text v PHP/ASP/whatever fajlu ... a si jst to dost dobr predstavlam? :P

Area_51 ::

:)) Za kaj pa se uporablja ta program MsQy...:) Eno krato razlago prosim.
Area 51

alesrosina ::

mySQL = baza podatkov.

Area_51 ::

:)) Ja to sem razumel. Ampak za kaj se pa uporablja ta baza podatkov???:)
Area 51

milosm ::

Povedano zelo na kratko, za shranjevanje podatkov :D ;)

darh ::

Area51: mysql je skoraj nekaj takega kot excel... sestavljajo ga baze (v excelu je to file), v vsaki bazi so tabele (v excelu je to sheet), in vsaka tabela je sestavljena iz večih stolpcev in vrstic....

po mySQL bazi brskamo in jo urejamo s pomočjo jezika SQL (structured query language (semizdi da je to to))...




ASPmaster:
nekje na to foro... ti shraniš samo zaenkriptiran podatek za geslo. Ob vsaki prijavi uporabnika, poiščeš njegovo geslo v bazi in ga priperjaš z enkriptiranim vnešenim geslom. Če sta gesli enaki, sta tudi oba enkriptirana stringa enaka....


and then again.. zakaj to jest tebi razlagam ? a nisi ti neki hud programer or smthin ?
Excuses are useless! Results are priceless!

Zgodovina sprememb…

  • spremenil: darh ()

Gandalfar ::

guess not ;-)

A se z bazo povezujes preko kaksnega SSLja al kar preko navadnga socketa?

darh ::

socket... itak delam (zaenktat) samo z lokalnimi bazami ni projekti so na takem nivoju da ne rabijo neke huuuude zaščite..
Excuses are useless! Results are priceless!

alesrosina ::

xbite: jst hud programer? hm.... like not. Bo treba se ene 10 let drkanja, da bom postal dobr programer ;)
anyway, lohka bi bla tud fora kje drgje ... sam pol ti recimo shrans v bazo ne originaln geslu ampak zaenkriptiran ... zanimiv. Jah, se nism nch drku teh security stuffa pr programiranju. Sicer pa: lohka si dobr programer, pa vseen ne znas vsega, hehehe :D

david ::

xbite, en kvestn ... ce nekaj zakodiras z md5, je potem to dobit nazaj?

darh ::

md5 je one-way alogaritm... da se ugotovit z brute-force, ampak to se itak da skor vsako stvar tako ugotovit.. vse kar rabiš je čas ;D
Excuses are useless! Results are priceless!

david ::

kaj je potem najboljsi nacin za enrypt/decrypt?

poweroff ::

Ah, eni ste pa res .... (ne bom rekel kaj).

MD5 je enosmerna funkcija. Definicija: iz poljubnega niza znakov ti izracuna unique stevilo FIKSNE dolžine.

To ima par zanimivih implikacij... Recimo:

- imaš različne dolžine stringov (gesel, datotek,...), MD5 pa ti izračuna število ki je vedno enake velikosti. Se pravi lahko MD5 uporabimo za nekaksen digitalni prstni odtis niza znakov (datoteke, gesla...)

- user vpise geslo. Ti izracunas MD5 hash in ga shranis v bazo. Gesla v bazo ne shranis.
No, priden user ponovno in vpise geslo. Izracunas MD5 stevilo iz vpisanega gesla in ga primerjas z onim v bazi. Ce se ujemata - voila, geslo je pravo. Zakaj? Ker preverjas samo ujemanje prstnih odtisov ne pa tudi samih gesel, ampak to je v bistvu isto.

- a lahko nazaj iz cifre izracunas geslo? Tezko, oziroma morda celo nemogoce. To pa zato, ker je zadeva enosmerna. Geslo -- > MD5 stevilo je samo ena pot. Obratno je pa poti mnogo.

Če pa hočeš uporabljati kriptiranje in dekriptiranje neke zadeve, pa priporočam PGP. Ne vem ali obstaja kakšna implementacija za PHP.

Lahko pa tudi kaj bolj preprostega, kaksno simetricno funkcijo, XOR or something...

XBITE: a XOR v PHP obstaja?

poweroff ::

Tole eni ste pa res se seveda ne nanasa na xbita, pac pa na ona cudna vprasanja zgoraj...

darh ::

$a xor $b Xor TRUE if either $a or $b is TRUE, but not both.

a tole bi ti rad al kaj ? 8-)

Drugače se da uporabljat tudi kak base64_encode in base64_decode, ampak to nimaš nikakršne varnosti... ker nimaš nobenega ključa neč...

base64_encode() returns data encoded with base64. This encoding is designed to make binary data survive transport through transport layers that are not 8-bit clean, such as mail bodies.

Base64-encoded data takes about 33% more space than the original data.


tale porabi 33% več prostora.. pa nič varnosti.. torej je skrivanje podatkov pred stupid-userji... pol bi biljš naredu, če uporabiš funkcije gzcompress() in gzuncompress()

samo malo razmišljam... je pa še vedno najboljša izbira PGP... pa še free je..
Excuses are useless! Results are priceless!

cahahopie ::

V bistvu mislim takole. Kolkr sem prej tebe bral xbite in nek vidu... ma mysql tud opcijo password...ne? Tako nbedn ne vid passa....kar je po funkcionalnosti skoraj enako kot, da bi encyripto z md5() ..le da pri prvem načinu prej ugotiviš pass, ker so pasi v stilu "janko10".
Torej je md5() še naj.

b ::

Ja tkole je s tem kriptiranjem...

Plaintext gesla od userjev imet shranjena je neumno. Ce ti nekdo vdre, kar naenkrat
ve gesla vseh userjev. Ker so ljudje preleni, da bi si zapomnili vec kot eno geslo,
uporabljajo isto geslo povsod. Recimo za dostop do e-maila ali dial-up...

Gesla mora torej zaveden skrbnik site-a enkriptirat. Mozna sta dva nacina enkripcije,
simetricni in enosmerni. Pri simetricnih algoritmih imas navadno en kljuc, s katerim
enkriptiras podatke, nato pa jih z istim kljucem dekriptiras. Ce ti nekdo vdre v streznik
bo lahko dobil tudi ta kljuc, zato to spet ni nobena varnost (za gesla).

Pri enosmernih (one-way) algoritmih pa iz gesla (oz. kakrsnihkoli podatkov) dobimo
neko vrednost (hash), iz katere ni mogoce dobit nazaj gesla. Primerjava gesla, ki ga vpise
uporabnik, se naredi tako, da se vneseno geslo enkriptira in primerja hash v bazi s tem
novim. Ce se ujemata, je uporabnik vpisal pravo geslo.

Seveda ne bi bilo pretezko narediti tabele geslo->hash v kateri bi hitro poiskali hash in
dobili geslo. Zato imajo nekateri algoritmi dodan scepec soli ;-) skoraj dobesedno, ja.
Poleg gesla je treba za izracun hasha dodati tudi nekaj podatkov (par znakov, odvisno
od algoritma), ki se jim rece salt. Pri navadnem DES crypt() je to 16 bitov, zaradi cesar
se stevilo vseh moznih hashev poveca 2^16x, zaradi tega pa izdelava zgoraj omenjene
tabele ni vec ravno macji kaselj. Noja...tale navaden crypt() dandanes ni vec dovolj
varen pred kaksnimi multinacionalkami in vladami, za uporabo na web siteih pa je po mojem
dovolj varen. Ce ne ves, za kaj vse bos potreboval ta gesla, je mogoce dobro uporabit
crypt(), ker kaksen star softver mogoce ne podpira nobenega drugega podobnega
algoritma. Hashi, ki jih naredi funkcija crypt() so dolgi 13 znakov, od tega sta prva 2
znaka salt (npr. "NWE0XfcL2tfhk", to je moj password na strezniku kjer imam e-mail).

Slaba stran DES crypt-a je to, da uposteva samo prvih 8 znakov gesla, cesar niti ni
vec tako tezko bruteforcat. Na Linuxu in FreeBSD-ju (pa verjetno se kje) se zadnjih par
let za kriptiranje gesel uporablja MD5 crypt. Gre za podoben algoritem kot DES crypt,
le da je racunsko bolj zahteven (izracun hasha iz gesla vzame vec casa), zato ga je tezje
bruteforcat. Poleg tega je salt dolg 8 znakov, kar zelo poveca stevilo moznih hashev.
To je trenutno verjetno najbolj preizkusen hash algoritem.
MD5 crypt-a ne mesajte z MD5 checksumi. MD5 checksumi se uporabljajo za prevejanje,
da podatki niso bili spremenjeni, recimo za kaksne datoteke ipd. Ceprav je to takisto
podoben enosmerni algoritem pa ni primeren za passworde, ker nima salta.

Poleg teh je enosmernih algoritmov se kar nekaj. Glede podpore v PHP si poglejte
dokumentacijo PHP-ja, jaz sem to moral studirat ravno prejsnji teden :-)
Blowfish, SHA-256,... so cisto OK, ce bos jih bos uporabljal na tocno dolocenem
operacijskem sistemu s tocno dolocenim softverom (recimo PHP), kaj pa ce bos
moral preverjat ista gesla recimo s perlom ali pythonom, ki mogoce ne bo imel
vkljucene podpore za kaksen eksoticen algoritem ali ce bos moral site na hitrico
prenest na eno drugo masino, kjer podpore za eksoticne zadeve ne bo?

MySQL-ov PASSWORD() je izjemno sibek algoritem, saj nima nobenega salta.
Cisto enostavno ga je bruteforcat, gesla do 6 znakov se na povprecni masini
pokazejo po par dneh (preizkuseno), do 5 znakov pa v par urah. Ce imate dolga
gesla (z non-alnum znaki) potem to ni tak problem, ampak vseeno...jaz mu ne zaupam.

Tako, to je (na dolgo) to o kriptiranju passwordov. Upam da bo komu pomagalo.

lp,
Borut.

Zgodovina sprememb…

  • spremenilo: b ()

Uporabnik ::

salt more pol bit vedno isti?

pa v php je mal bl nerodno izveden MD5 crypt.. tko da ga zato folk ne uporablja

upam na čimprejšno funkcijo md5crypt()

b ::

Ko preverjas password ga moras zahashat z istim saltom kot geslo v bazi.
Example code v php:


if($oldpass_hash == crypt($old_pass, $oldpass_salt)) {
//use MD5 password hash if possible
if(CRYPT_MD5 == 1) {
$salt = '$1$' . substr(md5(rand(0,9999999)), 0, 8);
$passhash = crypt($new_pass1, $salt);
} else {
//use DES crypt
$salt = substr(md5(rand(0,9999999)), 0, 2);
$passhash = crypt($new_pass1, $salt);
}
}


Tukaj najprej preveris ce se vpisano geslo in geslo iz baze ujemata.
$oldpass_hash je hash iz baze
$old_pass je staro geslo
$oldpass_salt je salt gesla iz baze, ce hoces ti pejstnem se kodo ki
preveri kaksno geslo imas v bazi in temu primerno pobere salt (MD5 ali DES)

Nekatere implementacije crypt() funkcije znajo same razbrat kaksen salt si jim dal
in temu primerno ukrepat. PHP to zna, razbrat iz dolzine salta, pri nekaterih pa
lahko enostavno namesto salta vpises kar star hash.

Iz tega kosa kode dobimo ven $passhash, ki ga potem vpisemo v bazo tam kjer
je bil prej $oldpass_hash

Ne vem v cem je problem PHP crypt()-a... v PHP dokumentaciji od crypt()
funkcije sem vse nasel.

Glede na to da sem jaz kot totalen luzer na podrocju PHP-ja v enem popoldnevu
naredil web interface za spremebo passwordov in se administrativni interface za
dodajat/brisat mail accounte za eno stranko, potem to ne bi smel bit za nikogar
prevelik problem.

lp,
Borut.

Zgodovina sprememb…

  • spremenilo: b ()

poweroff ::

Če te prav razumem, je salt neka dodatna informacija, ki pove katera izmed n možnih hash tabel je prava?

Tole definicijo sem nasel. In password protection, salt is a random string of data used to modify a password hash. Salt can be added to the hash to prevent a collision by uniquely identifying a user's password, even if another user in the system has selected the same password. Salt can also be added to make it more difficult for an attacker to break into a system by using password hash-matching strategies because adding salt to a password hash prevents an attacker from testing known dictionary words across the entire system.

Bega me samo tole - kako potem naslednjic ko preverjam geslo vem kaksen salt moram izbrati?

Zgodovina sprememb…

  • spremenilo: poweroff ()

b ::

Ubistvu je to to, ja.

Brez salta bi, ce bi dva userja imela isto geslo, to bilo razvidno, ker bi bla hasha enaka.
Ce recimo uporabis MySQL PASSWORD() funkcijo, bos takoj videl, ce sta dva passworda
enaka, ker je hash enak.

S saltom pa lahko iz istega gesla dobis n razlicnih hashev, kjer je n stevilo razlicnih moznih
saltov. Pri DES crypt()-u je salt dolg 2 znaka, torej lahko iz istega passworda dobis 2**16
razlicnih hashev.

Ko preverjas geslo uporabis salt iz hasha, ki ga imas shranjenega.

Ce poskusis kaksno crypt(password, salt) funkcijo, bos videl da ima rezultirajoci hash
prva 2 znaka enaka kot je salt (pri DES crypt-u).

Vcasih lahko testiras kar tako:

if(hash==crypt(password,hash)) ...


ker crypt vzame iz drugega argumenta funkciji samo toliko znakov kot jih rabi,
ampak to je omejeno samo na implementacije crypt(), ki podpirajo zgolj DES.
crypt() v PHP je recimo tak da izbere kateri algoritem bo uporabil na podlagi tega,
kaksen salt mu das, kar je razvidno iz kosa kode v enem prejsnjih postov.

V spremenljivki hash tu zgoraj je shranjen hash ki ga prej nekako poberes od tam
kjer je bil shranjen...

lp,
Borut.


Zgodovina sprememb…

  • spremenilo: b ()

poweroff ::

Če prv štekam imaš potem za vsakega userja shranjen njegov hash (ki je izracunan iz gesla - gesla pa se lahko ponavljajo) ter salt, ki pa mora biti unique. Iz teh dveh podatkov potem lahko ugotoviš ali je geslo pravo ali ne.
Se pravi isto kot da bib ilo njegovo geslo sestavljeno iz dveh delov (en del je salt).

b ::

Salt vpliva na to, kaksna bo vrednost hasha, ki ga dobis.
Glej, isto geslo (test) zahashano z dvema razlicnima saltoma zgleda takole:

aaqPiZY5xR5l.
bbTdyOM4g6r9Q

V prvem primeru je salt aa, v drugem pa bb.

Kot vidis je na zacetku hasha zapisan salt (2 znaka), nato pa se
preostali del hasha. Geslo je v obeh primerih enako.

Ne vem, a je se kaj za povedat? Salta si uporabnik ne rabi zapomnit, ker ga ob preverjanju gesla poberemo iz hasha.

lp,
Borut.

poweroff ::

Hmm, ampak če nekdo vdre v bazo podatkov in dobi ven hashe in salte, potem ravno tako lahko naredi tabelo geslo -> hash, ker tocno ve kateri salt je bil uporabljen?

blank3_ ::

xbite: kako pa potem posljes userju password, ce ga pozabi, ko imas narejeno z one-way algoritmom? ni te fkc...?
Zelo sem zaposlen. Potreboval bi brezčasje... Vsaj za nekaj časa.

Gandalfar ::

blank3: novo geslo mu nastavis

blank3_ ::

Ok... kaj pa tole:

Ko ma s ti en form pa kliknes prijavi (post varjanta), tvoj browser se zmer poslje pass v palin textu kajne?

Kako kak security tle vneses?
Zelo sem zaposlen. Potreboval bi brezčasje... Vsaj za nekaj časa.

darh ::

blank3_: don't get smart on me boy :D

userju ne pošleš njegovga passworda nazaj... zgeneriraš mu novga.. recimo 3 črke.. pol naj ga pa sam zamenja v tistega k si ga bo upajmo da zapomnu :)

če te skrbi za varnost podatkov med userjem in serverjem uporabiš SSL in kupiš Verisignovo licenco za nevem-kolk-že-ampak-recimo $1000 in maš lepo 128bit client<->server encryption, ok ?
Excuses are useless! Results are priceless!

cahahopie ::

Povejte prosim kaj je SSL ter njegove prednosti v dveh povedih. Sj vem, da je zato Google.. pa vseeno.. ne škodi.

darh ::

Excuses are useless! Results are priceless!

cahahopie ::

xbite veš kaj sem s tem nasplošno tud misli: Da se bo lahk ena pemtna glava razprsla o svojem znanju (marsikdo to rad počne z veseljem) in seveda, da bo eno na izi branje...ki bo v slovenščini...
Vseeno hvala za linke.

b ::

Odpri nov thread ce te zanima SSL, ne?

Jaz sem sem noter zdej pogledal samo zato ker sem ze prej
dosti pisal.

In ja, o SSL-ju bi znal kaj povedat.

lp,
Borut.

Tr0n ::

No, "salt" lahko enostavno naredis tako, da zraven uporabnikovega gesla pristejes nek privatni kljuc in vse skupaj MD5 zakodiras.

geslo: nekaj
privatni kljuc: kljuc

md5("nekajkljuc")

SSL -> OpenSSL. V novem PHPju imate nekatere funkcije ze vgrajene, vendar so "experimental". Drugace se pa da tudi rocno naredit. Je pa to dokaj varen protokol. Sem mel seminarsko na to temo :).


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

php+enkripcija gesla

Oddelek: Programiranje
162086 (1591) Housy
»

Odkrit resen hrošč v PHP 5.3.7 (strani: 1 2 )

Oddelek: Novice / Varnost
5016009 (13776) Spura
»

Analiza slovenskih gesel

Oddelek: Novice / Zasebnost
3911712 (9650) BlueRunner
»

Manj znane varnostne ranljivosti PHP programske kode

Oddelek: Novice / Varnost
314174 (2849) R33D3M33R
»

PHP - Register form

Oddelek: Izdelava spletišč
241844 (1472) roli

Več podobnih tem