ugrás a tartalomhoz

Jelszavak adatbázisban visszafejtehtő formában

ED · 2012. Aug. 8. (Sze), 14.33
Hogyan lehet adatbázisban (például) jelszavakat tárolni visszafejthető módon, biztonságosan? Értem ez alatt, hogy a visszafejtéshez szükséges kulcs ne az adatbázisban legyen a lekódolt adatok mellett, vagy éppen tárhelyen...

Egy ötlet, ami első ránézésre szerintem működőképes és biztonságos, de jó lenne, ha egy hozzáértő is ránézne és véleményezné. Vagy ha van jobb, megosztaná velem...

- Amikor a felhasználó bejelentkezik a honlapra a felhasználó nevével jelszavával, akkor készítek a jelszavával és egy 2048 bites véletlen karaktersorozattal egy (aszimmetrikus titkos) kulcsot. Majd ezzel a kulccsal lekódolom (aszimmetrikus titkos kulccsal) a titkosítandó adatot és letárolom az adatbázisba (a véletlen karaktersorozattal együtt persze).
- Ezek után amíg be van jelentkezve, session-ban tárolom a titkos kulcsot amivel visszafejthetem a titkosított adatot.
- Ha kijelentkezik, törlöm a titkos kulcsot, így nincs sehol sem letárolva, ha feltörik az egész rendszert, akkor sem találják a kikódoláshoz szükséges kulcsot.
- Amint megint bejelentkezik a felhasználó a szokásos felhasználói nevével és jelszavával a honlapra, elkészítem a fentiek alapján a kulcsot és kikódolom neki az adatot, ha kell...

A honlapra való belépéshez használt jelszót természetesen erősen hashelve tárolom az adatbázisban, illetve a ugye a titkos kulcs készítéséhez nem a hash-t használom, hanem a tiszta jelszót.

Az egész hátránya, hogyha a felhasználó elfelejti a jelszavát és teljesen újat kell generálni, akkor veszik a titkosított adat... De ez szerencsére nekem nem probléma, mert az adatok megvannak máshol is, itt csak a munka megkönnyítése miatt tárolnám...

Vélemények? Ötletek? Javaslatok, hogy milyen titkosítást/php függvényeket használjak?
 
1

Tarolas

janoszen · 2012. Aug. 8. (Sze), 15.00
Most akkor jelszot akarsz tarolni vagy egyeb titkos adatot? Ha jelszot:

A jelszavak tarolasa alapvetoen problemas. Ha a plaintext jelszot akarod letarolni, az semmikeppen nem jo. A cel az, hogy egy betoronek egynel tobb akadalyt kelljen megugrani, igy az egyetlen igazi megoldas az, hogy a jelszotarolast egy kulon szerveren, API mogott elrejtett valami vegzi. Ha ugyanazon a szerveren van, akkor egyetlen egy code exec vuln. vagy hasonlo semmisse teszi az osszes erolkodesedet, igy a helyi titkositas szinte semmit nem javit a helyzeten. Ennek megfeleloen az elfelejtett jelszo kuldest is ki kell raknod ugyanezen API moge, hogy a "frontended" ne ferhessen hozza a jelszohoz.

Mindazonaltal mostanaban elegge negativ visszhangot kapott a plaintext vagy sima hasheleses jelszo tarolas, ergo a userek egy bizonyos szazaleka nem fog orulni, ha visszakapja a jelszavat.

Ha mast:

Alapvetoen rejtsd API moge az adatokat. Az API-d legyen olyan, hogy meg ha kiadod kulso feleknek, akkor se tudjanak vele kart okozni, magyaran szolva ellenorzid az API-n is, hogy az adott hivasra van-e jogosultsag. Annak semmi ertelme, hogy ha az API-d gyakorlatilag 1:1 DB querykre fordul.

Ha feltetlenul titkositani akarod az adatokat, akkor ket opciod van: 1. A felhasznalonal van a kulcs. Ha ez elveszik, akkor kampec, nincs adat. 2. Nalad van a kulcs, amit write-only helyre backupolsz, tehat az alkalmazas nem tudja visszaolvasni. A felhasznalo jelszava a working (read-write) valtozat titkositasat oldja fel.

Ezen felul termeszetesen arra is figyelni kell, hogy a session tarolod, a swap fileod/particiod, illetve az erzekeny adatot forgalmazo kapcsolataid is titkositva legyenek, amit korant sem olyan trivialis megcsinalni. (Lasd az Apple AppStore in-game payments hackjet.) Ez a feladat egyebkent sokkal messzebb megy, mint egy sima webfejlesztes. Ha tenyleg biztonsagos rendszert akarsz, akkor ehhez kell hozzaerto rendszergazda is, akinek van ilyenben tapasztalata. Ha ez nincs meg, akkor szerintem kar ezen erolkodni, mert csak latszat tevekenyseg lesz.
4

Az általam írt ötletben hol a

ED · 2012. Aug. 8. (Sze), 15.25
Az általam írt ötletben hol a hiba? Hogy lehetne ezt megfúrni?

Illetve:
- Az adatok ssl-el közlekednek mind a honlap és felhasználó között, mind a postafiók és felhasználó között is (fizetős, nem otthon gyártott tanúsítvány)
- A honlap fizetős tárhelyen van, remélhetőleg a szerver üzemeltetői értenek ahhoz, amit csinálnak. Sajnos/szerencsére a munkájukba nem látok bele. De később váltani fogunk saját szerverre, így akkor saját szájízünk szerint bevédhetjük az egész rendszert. Addig is jó lenne ezt a részt megoldani, hogy akkor már ezzel ne kelljen foglalkozni. Meg úgy egyébként is érdekel a téma...
5

Hiba

janoszen · 2012. Aug. 8. (Sze), 16.01
Tobb ponton is.

Tegyuk fel, hogy valaki jogosulatlanul hozzafer a szerveredhez, mondjuk van a kododban egy code execution sebezhetoseg. Inentol kezdve ugye eleri a session tarolod, tehat meglesz a titkosito kulcs. Leven tarhely, a sessionoket fogja tudni enumeralni, sot ha DB-ben van, egyetlen SELECT-el meglesz neki az OSSZES titkositokulcs, aki eppen be van lepve.

Ezen felul sajnos azt kell mondjam, hogy a tarhelyek 1%-a SEM rendelkezik olyan biztonsagi rendszerrel, amely kepes a felhasznalokat minden korulmenyek kozott megvedeni egymastol. Ha a PHP-ban van egy security hole, amivel ki lehet lepni az open_basedirbol, maris gyonyoru szepen at lehet olvasni a masik konyvtaraba. Mar ahol hasznalnak egyaltalan open_basedirt. Anno NEKEM kellett megmondani a tarhely szolgaltatonak, hogyan kell legalabb felig normalisan felconfolni a szervert. Es a mai napig rengeteg ilyen szolgaltato van, idonkent belefutok egybe. Lasd egy regi projektemet ebben a temaban.
2

És mi a jó abban, hogy

rrd · 2012. Aug. 8. (Sze), 15.09
És mi a jó abban, hogy visszafejthető a jelszavad? Miért nem felel meg az egyirányú titkosítás?
3

A honlapra bejelentkezve a

ED · 2012. Aug. 8. (Sze), 15.20
A honlapra bejelentkezve a honlap beléptetné a felhasználót automatikusan az ugyancsak ezen honlaphoz tartozó postafiókjába, illetve a honlapon megjeleníteni az utolsó ~10 levelének fejlécéből kinyerhető adatokat. Ehhez kell a postafiókja jelszava, amit nem akarok plaintext-ként tárolni. Legalábbis jelenleg, később lehet más adat is lenne így tárolva...
6

Postafiok?

janoszen · 2012. Aug. 8. (Sze), 16.02
Azt akarod mondani, hogy a honlapotok automatikusan be akar lepegetni random userek IMAP postafiokjaba? Es mindezt egy osztott tarhelyrol akarod futtatni?
7

Hogy hű legyek a nickemhez...

eddig bírtam szó nélkül · 2012. Aug. 8. (Sze), 16.18
Na eddig bírtam ki, hogy ne pofázzak bele, pedig a múltkor megfogadtam, hogy hónapokig read only leszek.
A téma pár napja megy a prog.hu-n, azt hiszem, én tereltem ide a kérdezőt, mert (itt most jönne egy hosszú, erősen flame jellegű beszólás, szóval inkább ***** ;-) akit érdekel, keresse meg az ottani társalgást, talán megérti :-) )
Akkor megírtam neki privátban, hogy ilyet ne, mert ez felér egy öntökönbökéssel.
Mégis ragaszkodik ehhez az ötlethez.
Mondjuk ott nem derült ki számomra, hogy osztott tárhely, próbáltam javasolni, hogy inkább valami SSO megoldással próbálkozzon vagy egyszerűen felejtse el ezt az agyrémet, de... hátha nektek sikerül meggyőzni, hogy ez egy ön- és közveszélyes ötlet.
8

Ha akarja

janoszen · 2012. Aug. 8. (Sze), 19.05
A kerdezo ha akarja, elmondja. Viszont nem biztos, hogy az o otlete, csak befogtak megvalositasra.
9

Azért abban egyetértünk, hogy

eddig bírtam szó nélkül · 2012. Aug. 8. (Sze), 19.27
Azért abban egyetértünk, hogy ez az ötlet finoman szólva is életveszélyes, ugye?
12

Azért abban egyetértünk, hogy

ED · 2012. Aug. 8. (Sze), 21.24
Azért abban egyetértünk, hogy ez az ötlet finoman szólva is életveszélyes, ugye?

Azért annál amit legtöbben javasoltok, hogy plaintext-ként tároljak jelszavakat, annál egy fokkal azért csak jobb... Prog.hu-n még azzal is győzködtek, hogy a honlapra való belépéshez tartozó jelszót le ne hash-eljem!!! Hisz az tök felesleges és kidobott idő...
14

Bocs, de én nem tettem ilyet, sőt...

eddig bírtam szó nélkül · 2012. Aug. 8. (Sze), 22.29
Mindössze privátban javasoltam, hogy ezt az egész ötletet felejtsd el és amikor láttam a... szóval az utolsó, hosszas... khm... "vitát", akkor szóltam, hogy inkább itt érdeklődj, hasznosabb válaszokat fogsz kapni.

Részemről rossz ötletnek tartok minden olyan jelszó tárolást, ami nem egyirányú kódolást használ. Én biztosan tiltakoznék az ellen, hogy akár csak a céges postaládám jelszavát kiadjam harmadik személynek. Pláne ha még tárolni is akarja.
Én felvetném a feladat kitalálójának, hogy ennek elég komoly veszélyei vannak.
Részben olyanok, hogy "mi lesz, ha feltörik a rendszert", részben - ami SZVSZ sokkal cikibb - valamelyik user hanyagul kezeli a postaládája jelszavát, ellopják tőle, akkor az első számú gyanúsított a rendszer adminisztrátora lesz, mert bármikor le tudja kérdezni és visszafejteni, bármelyik usert jelszavát.
Üzemeltetőként biztosan nem vállalnám be egy ilyen rendszer üzemeltetését.

És ahogy janoszen is írta: egy osztott tárhelyen semmi biztosíték nincs rá, hogy önhibátokon kívül fér hozzá valaki illetéktelenül az adatbázisotokhoz. (mást ne mondjak, a tárhely rendszergazdái).
Szóval csak ellenérveket tudok, semmi olyat, ami az ötlet mellett szólna.
10

Igen, feladatul kaptam...

ED · 2012. Aug. 8. (Sze), 21.19
Igen, feladatul kaptam...
11

Munkatársakat kell beléptetni

ED · 2012. Aug. 8. (Sze), 21.21
be akar lepegetni random userek IMAP postafiokjaba

Munkatársakat kell beléptetni a céges postafiókokba. Csak munkatársaknak van jelszavuk a honlapra való belépéshez.
15

Maskepp

janoszen · 2012. Aug. 8. (Sze), 22.44
Ezt illene maskepp megcsinalni. Nem tudom, ki uzemelteti a mail szervert, de sztem siman fel lehet huzni egy read only IMAP szervert, amire be tudsz lepni. Vagy mesterjelszot hasznalni.
16

Erv

janoszen · 2012. Aug. 9. (Cs), 09.43
Juteszembe, en megkerdeznem a kovetkezot a fonoktol: vajon mekkora kart okozna a cegnek, ha valaki a webtarhelyen keresztul hozzafer a teljes ceges levelezeshez? Mert azt latni kell, hogy a webtarhelynel tul sok olyan pont van, ami nem a Te kezedben van. Megeri-e a kockazatot a feature?

Es meg a sajat szervernel vagy VPS-nel is igaz lesz ez, mert ha felbereltek egy random rendszergazdat, akkor jo esellyel olyat fogtok ki, aki 10 evvel ezelott valamit megtanult es azota semmit nem fejlodott. Fel fogja rakni az altala jonak gondolt konfiguraciot, aztan vagy biztonsagos lesz, vagy nem. Az esetek 80-90%-aban inkabb nem.
13

Hogyan lehet adatbázisban

tgr · 2012. Aug. 8. (Sze), 21.58
Hogyan lehet adatbázisban (például) jelszavakat tárolni visszafejthető módon, biztonságosan?


Válassz közülük egyet.
17

Csak savazzátok

joed · 2012. Aug. 11. (Szo), 02.06
Csak savazzátok szerencsétlen kollégát, de használható tanácsot nem kap senkitől. Értem én, hogy mindenkinek tele a gatyája az ilyen dolgoktól, de bármilyen meglepő, real world scenario, hogy érzékeny adatokat visszafejthető formában kell tárolni. Még ha itt elkerülhető is lenne.

Tiszta sor, hogy a nulladik lépés az lenne, hogy a futási környezet biztonságos legyen. Mivel emberünk jó eséllyel tisztában van ennek veszélyeivel és meg is fogja oldani, lépjünk ezen túl és tegyük fel, hogy biztonságos környezetben fut a kód.

Akár egy kulcsos/PSK, akár asszimetrikus kulcsos titkosítást használsz, a probléma gyökere (ahogyan emberünk is felismerte) minden esetben az lesz, hogy hol legyen kulcs? Sok választás nincs: vagy a usernél vagy a futási környezet által elérhető helyen. Előbbi sokak szerint a legkevésbé megbízhatóbb hely, de jelen esetben mivel a kulcsra csak az idő alatt van szükség, míg a user be van jelentkezve jó megoldás lehet. Nem beszélve arról, hogy letolod a user-re a felelősséget és nem tartasz egy kupacban (pl. a szervereden) egy rakás érzékeny információt -> kockázat szétterítése. Ha a user session-től függetlenül folyamatosan szükséged van a kulcsra, akkor annak folyamatosan jelen kell lennie a rendszerben. Tehát vagy másik szerveren, folyamatosan lekérdezhető módon tárolod, memóriában tartod, lemezen tartod vagy adatbázisban tartod (felsorolás csökkenő biztonság sorrendjében).

A helyedben én valamilyen SSO/token/Key Server/Kerberos alapú megoldáson elgondolkodnék.

A legkézenfekvőbb szerintem, ha titkosítod az autentikációs adatokat és kérésre dekódolod azokat. Ehhez néhány tanács:
  • Ne akard feltalálni a spanyol viaszt, ne találj ki saját titkosítási algoritmusokat! Használd bátran a jól bevált módszereket, mint pl. az AES/Rijndael.
  • Használj AES ciphert, 256 bit hosszú kulccsal, CBC módban és megbízható random generátort az init vektorhoz (tipp: ZF2 Crypt modul, PHP Cryptlib)
  • DES, 3DES és hasonló rövid kulcsos block cipher-ek felejtősek, ECB cipher mód szintúgy
  • a visszafejtett információt ha lehet, ne tárold, csak a futás idejére maradjon memóriában.
  • a titkosítási modulod legyen a lehető legegyszerűbb, ne bonyolítsd. Ha kész vagy, célszerű másokkal is átnézetni. A titkosítási rendszered megbízhatóságának nem az algoritmustól kell függeni, hanem a kulcs erősségétől (Kerckhoff-elv). Minél kevesebbet teszel hozzá a meglévő crypto rendszerekhez, annál kisebb az esélye, hogy valamit eldurrantasz :)
18

A használható tanács jelen

tgr · 2012. Aug. 11. (Szo), 15.47
A használható tanács jelen esetben az, hogy lehetőleg ne csinálja. Teljesen értelmetlen és félrevezető hosszas értekezéseket tartani arról, hogy a 3DES vagy az AES a jobb titkosítás, mert egyik sem jó. A szimmetrikus titkosítások thread model-je az, hogy két biztonságos végpont között a támadó le tudja hallgatni a kommunikációt. Ha ahhoz a géphez is hozzáfér, amin a titkosítás történik, az egy egészen más szitáció, és zéró különbséget jelent, hogy milyen algoritmust használ mekkora kulccsal, meg hogy betartja-e a Kerckhoff-elvet; ezek a tanácsok a hamis biztonság illúziójának kialakításán kívül semmire nem jók.

Egy tipikus webalkalmazásnál nagyjából kétféle fenyegetéssel kell számolni: hogy megszerzik az adatbázis tartalmát (tipikusan SQL injectionnel), meg hogy hozzáférnek a webszerverhez, legalább a webalkalmazással azonos jogosultságokkal. Utóbbi esetben el tudják olvasni azokat az adatokat, amiket a webalkalmazás el tud olvasni, akármit is csinálsz. Ha ez nem elfogadható, akkor nem kell tárolni őket.
20

-

joed · 2012. Aug. 11. (Szo), 17.54
Tehát azt mondod, hogy webalkalmazásban nincs értelme titkosítást használni, ergo érzékeny információ biztonságos tárolására nincs mód?
21

Akkor van értelme, ha a

tgr · 2012. Aug. 11. (Szo), 21.55
Akkor van értelme, ha a rendszer gyenge pontján csak a titkosított szöveg halad keresztül, a kulcs nem. Az itt felvázolt esetben a gyenge pont a webszerver, és azon át kell haladnia a kulcsnak, úgyhogy nincs értelme. (Lásd pl. a Tesco esetét a titkosítva tárolt jelszavakkal.) Esetleg ha az adatbázist lényegesen gyengébb pontnak ítéled meg, akkor lehet értelme letitkosítani az ottani adatokat egy fájlban tárolt kulccsal, de a külön jelszószervernek meg ilyeneknek nem sok értelme van.
23

Hát nem tudom... Jelszavakat,

eddig bírtam szó nélkül · 2012. Aug. 12. (V), 08.34
Hát nem tudom... Jelszavakat, PIN kódokat, egyéb, más emberek "megszemélyesítéséhez" felhasználható adatokat, visszafejthető módon tárolni egy adatbázisban... Részemről nem tartom jó ötletnek, semmilyen formában.
(valójában azt sem, hogy a böngészőm jegyzi meg a jelszavakat, de olyan oldalak esetében, ahol nem ér nagy veszteség, ha valaki hozzáfér az accountomhoz - pl. fórumok nagy része - kevésbé zavar)
24

Informatika

janoszen · 2012. Aug. 12. (V), 18.55
Az informatika nem önmagáért van, hanem az üzleti igények megvalósításáért. Én nem érzem aggályosnak a dolgot, mert végső soron belső céges felhasználásról van szó. A kérdezőnek itt az a feladata, hogy a kockázat minimalizálása mellett eleget tegyen a kívánalmaknak, amit szerintem meglehetős alapossággal el is végez. Az én szimpátiámat mindenképpen elnyerte a stílusa és kitartása, szívesen dolgoznék vele a fentiek alapján.
25

Ízlés dóga... lehet, hogy

eddig bírtam szó nélkül · 2012. Aug. 12. (V), 19.17
Ízlés dóga... lehet, hogy csak a sok negatív tapasztalat(*) és némi paranoia mondatja velem, de az ilyen felhasználói igényeknek max. egy a torkomhoz illesztett machete hatására tennék eleget. ;-)

Eleve ott kezdődik a dolog, hogy nem saját tárhelyen van az adatbázis -> elég necces ilyen helyen jelszavakat tárolni, bár ezt asszem, te is említetted. Ott folytatódik, hogy bármelyik, kissé bekattant felhasználó ráfoghatja az éles adatbázishoz egyébként legálisan hozzáférő üzemeltetőre, hogy lenyúlta a postafiókját és az esetek nagy részében az üzemeltető még védekezni se nagyon tudna ellene, mert az ilyen szintű audit általában úgy leülteti a rendszert, hogy max. debuggoláshoz célszerű használni.
Meg még pár dolog eszembe jutott, amikor a téma a prog.hu-n elindult, de így hirtelen csak ez a kettő jutott eszembe.
Ha ezeket, plusz azokat, amik most nem ugranak be, felsorolom a megbízónak és még mindig ragaszkodik az ötletéhez, esélyes, hogy felmondok.

* - szívesen emlegetnék dolgokat a múltamból, de seggbe rúgnának érte... :((( A szalonképesek közül: adott három rendszer. Egyik sem tökéletes, de valamelyiket ki kellene választani. Leendő felhasználók szavaznak az egyikre. IT szakemberek inkább másikra szavaznának, mert fejleszthetőség, üzemeltethetőség szempontjából az látszana jobbnak, de végülis a felhasználók választottja is elfogadható. Elmegy az eredmény a vezetőséghez, akik ki tudja miért, mindezek ellenére kiválasztják a harmadik rendszert, ami sem a felhasználók, sem az IT szerint nem jó... Valahogy ebben az esetben is van egy ilyen érzésem.

ui: a kérdezővel kapcsolatban igazad lehet, de a munkaadójáról/megbízójáról már nem biztos, hogy ugyanezt el merném mondani... :-)
26

Céges

janoszen · 2012. Aug. 13. (H), 10.35
Ha jól értelmezem, a saját céges postafiókjaikról van szó. Mennyi az esélye, hogy Gizike titkárnő más jelszót választ oda, mint a webes felületre? Ne tegyünk már úgy, mintha minden rendszer bank-szintű biztonságot igényelne, ha egyszer nincs rá üzleti igény!
27

Lehet, hogy valahol

eddig bírtam szó nélkül · 2012. Aug. 13. (H), 10.58
Lehet, hogy valahol elvesztettem a fonalat, de én úgy értettem (még mindig a prog.hu-s emlékek), hogy van ez a rendszer, ami "valahol" fut. Van egy levelező szerver (a későbbiekben esetleg egyéb funkciójú, de szintén authentikációt igénylő szerverük), ami máshol van, és amire úgy akarnak belépni, hogy az elsődleges rendszerben tárolják a hozzáféréshez szükséges adatokat (usernév, jelszó)

Hogy mennyi az esélye annak, hogy Gizike más jelszót választ? Tapasztalataim szerint kb. 50%... (engem is meglepett, amikor ilyet láttam, de attól tartok)

És az nem derül ki sehonnan, hogy a szóban forgó levelező rendszer hol van, ki üzemelteti.
Azt már meg sem említem, hogy ugye a jelszavakat többnyire egyirányú kódolással szokás tárolni, tehát max. valami snifferrel(SSL hiányában) v. keyloggerrel lehet ellopni Gizike jelszavát normális körülmények között, nem úgy, hogy belenézek az adatbázisba és "minimális" munkával visszafejtem.

Szóval jó, jó, hogy nem kell(nem kell?) mindenhova banki szintű biztonság, de arról senki sem fog meggyőzni, hogy normális dolog jelszavakat, visszafejthető formában tárolni.
22

Sérülékenység

janoszen · 2012. Aug. 12. (V), 08.33
Alapvetően lehet védekezni titkosítással, mert akkor már nem elég egy SQL injection a jelszavak megszerzéséhez, de amit el kellene érni az az, hogy ne legyen elég egyetlen egy más típusú exploit sem a megszerzésükhöz. Ezt pedig csak a privilégiumok szeparálásával tudod elérni, tehát ha pl. a mailek beolvasását egy az internetről közvetlenül nem elérhető szerver szolgáltatja, ami viszont a jelszavakat semmiképp nem adja ki az API-ján.
19

-

zzrek · 2012. Aug. 11. (Szo), 16.47
(bocs, valamit félreértettem)