Ti titkosítást vagy hash-elést használtok a jelszavak megvédésére
Pont most olvastam egy írást arról, hogy a jelszavak megvédésére nem muszáj hash-elést használni, mert titkosító algoritmusokkal is jól megoldható a dolog. Érdekes, hogy eszembe sem jutott, annyira belém égett már, hogy a jelszót hash-elni kell. Nekem ez annyiban lenne izgalmas, hogy a titkosított adatban nem csak a jelszót tudnám letárolni ellenőrzés céljából, hanem mondjuk a felhasználói azonosítót, lejárati időt, egyebeket is, tehát ha valaki bele tud nyúlni az adatbázisba, jelszó cserével még akkor sem lenne lehetséges egy account megszerzése, feltéve, hogy nem ismeri az algoritmust, amivel ezeket az adatokat lekódoltam. Ha belegondolok még a jelszót sem lenne muszáj letárolni, elég lenne kikódolni vele a letárolt adatokat, és ha megfelel a struktúra, pl json parsolható, akkor helyes volt a jelszó.
■
Nem
Igen, ezt értem, viszont
Közben utánakerestem, bár
Szia inf3rno! Szerintem a
Szerintem a titkosítás ezért is rossz ötlet, mert akkor a kódnak rendelkeznie kell a titkosításhoz használt kulccsal/kulcspárral, aki pedig az adatbázisodhoz hozzáfér, az - eséllyel - hozzáfér a kódhoz is. Ennél a jelszavak sózott, egyirányú titkosítása sokkal biztosabb megoldás, szerintem.
Az viszont, amit én már évek óta nem értek ebben az egész problémában az, hogy óriási hangsúlyt fektetünk a jelszavak visszafejthetetlenségére (ha nem tévedek azért, hogy ha a bárgyú júzer minden oldalon ugyanazt adja meg, akkor se lehessen más fiókjaiba bemenni a jelszavával), ellenben ennél sokkal érzékenyebb adatait (pl. lakcím vagy telefonszám) titkosítatlanul tároljuk. Holott engem az sokkal jobban frusztrálna, ha ezek kerülnének rossz kezekbe. Vagy van valami, amit nem vettem figyelembe?
Üdv:
Dávid
Nem feltétlenül
Ezzel szemben a visszafejthető titkosítás nagy hátránya az, hogy az egyszerűbb kulcsok tök gyorsan megfejthetőek.
Neked, mint üzemeltetőnek az a feladatod, hogy a személyes adatait Te ne add tovább illetéktelen kézbe (pl ecommerce). A felhasználói fiók védelme (hogy más ne tudjon belépni) biztonsági kérdés.
Szíved joga, hogy személyes adatokat hogyan tárolsz, ha feltörik a db szervered, az egy bűncselekmény. Elsősorban az elkövető felel érte. Persze olyan értelemben Te is felesz, hogy ha alapvető, ismert támadási forma ellen (pl sql injection) nyitva hagytál kapukat és így sikerült lescannelni, akkor nyilván Te is kapsz némi ejnye - bejnyét a gondatlanságodért.
Szóval szerintem nincs azzal semmi gond, ha titkosítatlanul tárolsz valamit, akkor van baj, ha a Te gondatlanságod miatt tudják ellopni.
Az adatvédelemhez hozzá tartozik az is, hogy ha a user határozottan kéri, akkor köteles vagy fizikálisan törölni a személyes adatait. Ez egy sokkal nagyobb gond, mert kezdve a backup - októl, az esetleges idegen kulcsokon keresztül egészen a későbbi esetleges azonos adat felhasználásának megelőzéséig számtalan technikai korlátba ütközik.
Ezzel szemben kötelező (lenne) teljesíteni, talán 24 órán belül (ezt nem tudom biztosan).
Tök érdekes, hogy egyetlen fórumtémában több helyen is előjöttek jogi kérdések is, amikre évek óta nem tudok egyértelmű válaszokat, pár ügyvédet is megkérdeztem, de kb semmit nem tudnak ezekről, gondolom a technikai (IT) ismeretek hiánya miatt.
Akik pedig kitalálják és megszavazzák a törvényeket, nagyságrendileg azonos IT tudással rendelkeznek, mint az ügyvédek...
Kéne már nagyon egy "Weblabor ügyvédje, dr X Y". :)
Aszimmetrikus titkosításra
szerk:
Közben utánajártam. Régen volt az divat, hogy minden jelszót egy letárolt kulccsal titkosítottak le szimmetrikus titkosítással. Az a rendszer valóban nem biztonságos. Én arról beszéltem, hogy a jelszót vagy egy JSON-t metaadatokkal titkosítok le a jelszóval vagy abból származó kulccsal. Tehát maga a kulcs nem kerül letárolásra, hanem a jelszó megadásakor hozza létre a rendszer minden esetben. Így a kulcs nem is lopható. Ezt ki lehet egészíteni egy jelszó erősség ellenőrzővel, ami csak bizonyos hosszúságú nehezen törhető jelszavak megadását engedélyezi.
Persze, egyetértek, hogy a személyes adatokat is jó titkosítani. Ha a kódban vagy fájlban tárolod a kulcsot, akkor kisebb az esélye, hogy adatbázis lopásnál lenyúlják azt is. Egyébként vannak olyan szolgáltatások, amiknél a kulcs nincs letárolva, és szintén valamilyen jelszóból származik. Ezek alkalmasak pl privát adatok letárolására vagy megosztására. Felhőbe jelenleg én csak így töltenék fel adatot.
Tudtommal
Tehát csak és kizárólag hash-t tárolhatsz.
Megjegyzem, hogy ezzel szemben a mai napig lehet még olyan oldalt találni, ami elfelejtett jelszó funkció gyanánt simán kiküldi neked egy plain/text emailben a Te előző jelszavad. Viszont ha jól tudom ezt a szabályozást, akkor még új jelszót se generálhatsz, mert kiküldött email formájában meg van számodra is - amíg nem módosítja.
Így elérhető, minden egyes db-ben tárolt hash más sóval készüljön - amíg a hacker nem tudja meg, hogy milyen logikával honnan vegye a sót, esélytelen, hogy sikerrel változtasson jelszót.
Amit a kikódolásról írsz ("még a jelszót sem lenne muszáj letárolni, elég lenne kikódolni vele a letárolt adatokat") érdekes ötletnek tartom, így első olvasásra nekem úgy tűnik, hogy hozza azt is, hogy nem tudod a jelszavát.
Viszont a visszafejthető titkosításnak van egy nagy hátulütője, hogy záros időn belül - elegendő számítási kapacitással - visszafejthető, és pont függ a kulcs bonyolultságától.
Magyarul a Manyika néni szupertitkos "Manyika123" jelszavával titkosított adat mondjuk 1 - 2 másodperc... Emiatt én nem merném ezt élesben kipróbálni.
A hash-nél a salt-ot azért
Természetesen a jelszót a két irányú titkosításnál is meg lehet sózni. Én mondjuk egy felhasználói azonosítót hozzácsapnék, meg esetleg egy salt-ot, és azzal kódolnám le, amit kell. Nem muszáj magát a jelszót letárolni ha tényleg jogi akadálya van, elég csak egy JSON-t a felhasználói vagy kulcs azonosítóval, lejárati idővel, esetleg valami random értékkel, hogy ne lehessen megtippelhető, hogy mit kódoltam le. Ha JSON parsolható és megfelelő struktúrájú a kimenet, akkor gyakorlatilag biztos, hogy jó jelszót adtak meg. A szimmetrikus titkosítási algoritmusok egyébként lassabbak, mint a hash-elő algoritmusok, pl md5, sha1, ezért használnak bcrypt-nél is ilyen algoritmust, hogy csak nagyon nagy számítási kapacitással tudják betippelni a jelszót. Az én rendszeremben egyébként lesz megkötés a jelszó méretére, benne használt karakterekre is, szóval Manyika nem fogja tudni a kedvenc jelszavát használni. Egyébként nem csak beléptetésre használom ezeket a jelszavakat, hanem privát adatok titkosítására is. Van ennek egyébként egy olyan előnye is, hogyha event storage-ben tárolja valaki az adatokat, akkor a kulcs eldobásával elvesznek az adatok, mert nem lehet visszafejteni őket. Event storage-nél ugye probléma, hogy nem lehet törölni visszamenőleg eventet, viszont a jogászok meg csesztetik az embert, hogy 2-3 hónapon belül tűnjön el a felhasználói fiók, meg minden más vele együtt. Ez a titkosítás és kulcs eldobás egy lehetséges megoldás a problémára.
Elég jó
A nagyobb probléma az, hogy jelenleg fizikális törlés a feladat, nem invisibility vagy más, használhatatlanná tétel.
Nehéz lenne szerintem egy jogászt meggyőzni arról (mert nem ért hozzá), hogy a DB-ben ugyanazok a krix-kraxok, amiket a "törlés" előtt látott, már nem tudják "megmondani", hogy mi volt pl Manyika néni telefonszáma...
Jelenleg én azt gondolom ezen a téren egyfajta középútnak, hogy - db inkonzisztenciát elkerülendő - ÁSZF-be le van írva, hogy az email címed és a felhasználóneved törlés után is meg lesz tartva, mert így biztosítható, hogy ne lehessen velük újból regisztrálni. Minden más adat törölve / anonym - helyettesítve lesz. Nyilván a username csak akkor érdekes, ha van (mint pl itt is). Amiatt, hogy ne tudjon a Vér Pistike az én törlésem után Pepita névvel regelni és hülyeségeket kommentelni (kvázi a nevemben), illetve email amiatt, mert ez az egyetlen olyan kizárólagos adatod a usertől, ami legalább egyszer valid volt. Ezt ne lehessen újból, másik accounthoz használni, közvetve új tartalmakat létrehozni vele, vásárolni, stb.
Ez mondjuk már messzire visz a témanyitótól, és sajnos nincs is jogi szakink, aki segíthetne megtalálni a bizonyos arany középutat..
Ha nem tárolod, akkor nem
Nekem most az a koncepció, hogy a kulcsot és a hozzá tartozó metaadatokat a jelszóval titkosítom. Utána a privát dolgok titkosításához már a kulcsot használom fel, nem a jelszót. Egyébként SSH-nál az RSA kulcsokat is így titkosítod passphrase-el DES vagy 3DES-el, szóval nincs ebben hiba. Annyi a különbség, hogy én ezeknél jóval fejlettebb algoritmusokat használok, illetve szimmetrikus titkosítás lesz az adaton, mert biztonságosabb és nem kommunikáció titkosításáról van szó, ahova inkább aszimmetrikus titkosítás kell. Ennek a kulcs tárolós dolognak több előnye és hátránya is lehet. Pl ideiglenesen meg tudod osztani a kulcsot másokkal más jelszóval letitkosítva, illetve a kulcs törlésével megoldható a már említett fizikai megsemmisítése az adatnak, nem csak az elrejtése, feltéve, hogy a kulcs nincs event storage-be mentve. Én úgy emlékszem egyébként, hogy az elrejtés, amit pár napon belül meg kell csinálni, és az adatok törlése, amire néhány hónap a határidő, de persze lehet, hogy azóta sokat szigorítottak rajta.
Sokféleképpen meg lehet csinálni, hogy ne kelljen többször beírni a jelszót. Klasszikusan elmegy auth header-ben minden kéréssel, a szerveren meg kesselve van memóriában, hogy melyik email+jelszó-hoz melyik kulcs tartozik. Másik lehetőség, hogy a kulcs azonosítót egyéb adatokkal digitálisan aláírom a szerveren, és azt küldöm vissza a további kérésekkel, így csak a digitális aláírást kell ellenőrizni, nem a jelszót. Ez is ugyanúgy kesselhető memóriában. Még esetleg szóba jöhet a docker és valami fájlba mentés kesselés céljából, mert annál ha jól tudom elveszik az adat, amikor leáll a gép, de onnan egy hacker sokkal könnyebben megszerzi, mintha mondjuk egy js map-ben tárolom le. További lehetőség HTTP/REST helyett websockets használata, annál az állapotban lehet menteni, hogy be van e lépve valaki vagy nincs.
Igazából a neheze egyáltalán nem ez a dolognak, hanem hogy adatbázisban titkosított adatokra ugyanazokat a query-ket tudjam használni, mint a nem titkosítottakra elfogadható sebességgel. Egyelőre azon agyalok, hogy temp táblába teszem őket kikódolás után, aztán akkor lemehet ugyanaz az query a temp táblára, mint amit a simára használok, viszont nem minden adatbázisnál van erre lehetőség, illetve az adatbázisnak támogatni kell a titkosítást, különben egy csomó plusz idő és memória oda-vissza küldeni az adatot a szolgáltatás és az adatbázis között. Ha meg már úgyis elküldöm a szolgáltatásnak, akkor talán egyszerűbb ott szűrni, hogy mire van szükség, viszont akkor duplán kell implementálnom a lekérdezést és szűrést a programnyelven és sql-ben is, ami ugye dupla hibalehetőség és dupla karbantartási költség. Egyelőre még nézegetem, hogy mások mire jutottak a témában, de csak ilyesmiket találok, hogy teljes adatbázis titkosítása jelszóval, stb. ami nekem annyira nem jó. A másik, hogy stream-elni is szeretnék adatbázisból titkosított fájlokat, amihez olyan algoritmus és adatbázis kapcsolat kell, amivel ez megoldható. Nem túl gyakori, hogy az adatbázis adottságai befolyásolhatják a domain-t, igyekszem elkerülni, mert általában nem jó, de lehet, hogy nem megoldható anélkül.
Nem tudom
Fizikálisan törölni tudtommal akkor kell, ha az illető user ezt konkrétan kéri. Akkor viszont nem hónapok alatt. (Ha össze tudom ezt szedni egy konkrét kérdéssé, bedobom, mert nagyon érdekel.)
Bármilyen megoldásnál biztosítanod kell, hogy a kliens akkor se tudja klónozni magát, ha a hackerek királya az. :)
De gyanítom, hogy amikor törölsz egy usert, nem szeretnél hosszú másodpercekre szüneteltetni egy szolgáltatást amiatt, hogy rebuild-elsz egy konténert...
A keresés problémája Dávid hozzászólásánál is ugyanaz.
Elsőre nekem az ugrik be (főleg ha már docker, elosztott rendszer), hogy a keresgélésre eleve külön szolgáltatást használni (pl ElasticSearch), ami csak UserId - listát ad vissza, akikre van találat. Nyilván ez adatduplikációval jár, meg jónéhány más problémával, de nem terheli maga a keresés db-t, a találat valódi adatainak a kinyerését pedig már végezheti ugyanaz az egy kód.
Stream-elésre nincs sajnos konkrét ötletem, szerintem nem fogod megúszni, hogy az indítása előtt a teljes fájlt kikódold. Egyébként - tekintve, hogy fájl - nem biztos, hogy db-ben tárolnám.
Mindenesetre hajrá, várom a fejleményeket! ;)
(Jól mozgatja a kis szürke agysejteket, érdekel a téma)
Ezzel mit tud kezdeni a User?
Ha ez szempont akkor azt is alá lehet írni, hogy milyen a böngészője meg hogy mi az IP címe, de a mai világban már bármi változhat kb. Mindenesetre ha ezek megváltoznak, akkor onnantól nem stimmel az aláírás és vége a munkamenetnek. Ugyanúgy bele lehet rakni egy expiration értéket is, pl 10 percet, amit ha nem újít meg egy újabb kéréssel, akkor lejárt a munkamenete. Persze minden kliens generálhat magának random azonosítót, és azt is alá lehet írni szerver oldalon és számon tartani, hogy kiadtuk a munkamenetet x felhasználónak y kliens azonosítóval, aztán amíg nem telik le a 10 perc az utolsó kérés után, addig nem lehet új munkamenetet kiadni. Viszont én ennek nem látom sok értelmét, nem hiszem, hogy biztosítható lenne ez a klónozás mentesség, legalábbis js-ben biztosan nem. A kapott azonosítókat a digitális aláírással szét lehet küldeni több kliens gépre, ha valaki nagyon akarja. Ha websockets-et használok, akkor meg lehet tunnelezni az egy kapcsolaton keresztül az összes kliens gépről érkező kérést az account-hoz, szóval bármit csinálok, simán törhető, ha belenyúlnak kliens oldalról. Max megnehezíteni lehet a dolgot obfuszkált kóddal, letiltással, ha látom, hogy túl sűrűn jönnek a kérések, vagy ha látom, hogy több eltérő IP-ről, több eltérő böngészővel használják, stb. Kérdés, hogy ez belefér e egy üzleti modellbe, hogy azért vesztesz ügyfelet, mert eggyel többen használják az accountot, mint kellene. Sok helyen nem fér bele, és inkább lenyeli a cég, pl vírusirtóknál is ha 2 gépre szóló licenszt veszel, akkor nem szólnak be, ha 3-5 gépen használod. Nyilván 1000 gépnél már letiltják a licenszt, de azért elég tág a tűréshatáruk.
Adatbázis függő lehet, de pl pgsql-nél csak az a session látja a temp táblát, ami létrehozta, szóval azt kell biztosítani, hogy minden felhasználó dedikált db session-t kapjon, és megoldva a dolog. Ez mondjuk nagyon sok felhasználónál nem feltétlen járható út. A temp táblát egyébként tranzakció vagy session végén dobja az adatbázis, attól függően, hogy hol hoztad létre. A másik lehetőség, hogy a kevésbé érzékeny részeket pl létrehozási idő, témakör, stb. publikussá tesszük, hogy kereshetőek legyenek, viszont ezekből sokszor lehet következtetni, arra, hogy mi van a titkosított adatban, és lehet célirányosan támadni, szóval talán annyira nem bölcs az ilyesmi.
Nem veszik el. Tekintve, hogy
Ja igazad van, máshol is azt írják, hogy a container törlésekor veszik el. Valamiért úgy rémlett, hogy újraindításkor is. Még mindig nem jutottam el odáig, hogy kipróbáljam, de ami késik nem múlik.
Szólj, ha segítsek
Indulásból javaslom, hogy csak alap ngnix-php, mysql és esetleg egy pma konténert csinálj.
Aztán lehet extrázni. :)
Köszi a felajánlást! Alapot
Kerdezzetek
+1
(Jelenleg elég nekem a fejlesztői környezet, még messze az élesítés, de már itt is vannak kérdések, csak időm nincs rá...)
Nyiss neki új fórum
Járt utat járatlanért
Tudnak például változó műveletigényt. 1-2 évente a hardver fejlődéséhez igazíthatod a hash funkciód "nehézségi" paraméterét, hogy még mindig ne lehessen (ne érje meg) offline módban pörgetni a jelszavakat.
Védelem időzítéses támadások ellen. Egy jó implementációt sok szakértő szem vizslatott már, hogy ne szivárogjon ki információ például abból, mennyi ideig tart két string összehasonlítása (slow equals függvény).
A módszerrel amit írsz például offline módban találhatok olyan jelszavakat, amik parzolható JSON-t eredményeznek. Vajon milyen működést fog eredményezni egy olyan user rekord a programod különböző részein, amiben nincs benne egy várt kulcs, vagy benne van egy váratlan? Annyira gyanúsan fogod kezelni majd mindenhol, mint bármelyik user inutot?
A "jó megoldás" mindneképpen egy dedikált hardver write-only salt paraméterrel, így még root jogokkal sem lesznek kinyerhetők, offline törhetők a plaintext jelszavak. Ezek ma már nem olyan drágák. Válassz ezzel kompatibilis megoldást, hogy szükség esetén updatelhető legyen erre a rendszered.
Mindez és sok más:
Salted Password Hashing - Doing it Right
Miért ne?
Szerintem a hardveres salt nem szükséges, ha eléggé egyedi a titkosításod - hash algoritmusod, akkor a db birtokában is túl sok időt igényel a crack, plusz még megismerve az algoritmust sem tudod, hogy ezen az egy alkalmazáson kívül mit - hol tudsz megtörni vele. Ebből az okból én kimondottan kedvelem a "járatlan utakat".
A cikk érdekes, köszi a linket, egy dologgal azonban nagyon nem tudok egyetérteni:
Csak egyszerűen ne :)
Amíg a terület szakértői is azt modják, hogy ne használj sajátot, hanem inkább egy open source, évek feltörési kísérleteit kibíró megoldást, akkor abban csak van valami.
Egy idegsebésszel sem állsz le azon vitázni (laikusként), hogy majd te megmondod, hogyan végezze el az agy-/gerincműtétet.
Don't roll your own.
Security through obscurity.
Kifejtenéd, hogy abban mi a
Amire oda kell figyelni az annyi, hogy milyen beállításokkal használod ezeket az algoritmusokat, pl hogy az initial vector eltérő legyen minden kódolt adatnál, különben ha azonos két adat eleje és ugyanazzal a kulccsal kódolod le, akkor a cipher text-ek elejei is azonosak lesznek. Vagy pl hogy a random érték true random legyen az érzékeny helyeken, mert különben ki lehet következtetni elég sok bitet pl a dátumból. Az ilyesmihez egyáltalán nem kell expert-nek lenni, bőven elég a kicsit tájékozottabb laikus szint, a tényleges munkát meg rá lehet bízni a szakértőkre, ahogy te is írod.
Nem igazán ennek a módszernek
Az más kérdés, ha a feladatod "egyedi", és arra keresel megfelelő kripto eljárást a kontextusnak megfelelően.
A lényeg, hogy járjon utána az ember, és best practice megoldást válasszon, ne pedig olyat, amit maga talált ki az alapján, hogy ő mit nem tudna feltörni :)
Itt van némi félreértés
A cikk írója - amennyiben jól értem - az idézett mondattal azt állítja, hogy ne használj olyan algoritmust, amit Te írtál.
Én pedig azt mondom, hogy ne használj 1 - 1 - ben még "jól bevált gyári" crypt függvényeket.
Az igaz, hogy nem hangsúlyoztam ki külön a "gyári" algoritmusok fontoságát:
DES
Te valamit nagyon osszekeversz. A DES-t az SSH2-vel kivezettek, es a 3DES is kifele tart a vilagbol. DES, 3DES, MD5 es SHA1 komponenseket tartalmazo algoritmusokat egy felelos rendszergazda kiconfolja az SSH szerverebol. Lasd meg: https://wiki.mozilla.org/Security/Guidelines/OpenSSH#Modern_.28OpenSSH_6.7.2B.29
Igen, de a "kicsit utana olvasas" utan maximum a jelenlegi best practicek implementalasa vallalhato mint munka, nem pedig az, hogy kitalalsz egy sajat jelszo titkositasi strategiat. Maradjunk annyiban, hogy 100-bol 97 biztonsagi szakember azt fogja neked mondani, hogy legy oly kedves hashelest hasznalni tisztesseges sozassal es megfelelo szamu korrel (es a sot minden korben illik hozzaadni), minden masra pedig felvenni egy szakembert aki tudja hogy hol lehet pofara esni. A maradek 3 biztonsagi szakember meg epp k*va reszeg.
Arra, hogy mi mindent lehet elb*ni egy ilyen "custom" jelszo titkositassal, az Adobe nagyon jo pelda.
Te valamit nagyon
Nem kevertem össze, csak nem akartam fél oldalt írni róla, úgyhogy inkább sarkítottam. Az elv egyébként mindegyiknél ugyanaz, csak más az algoritmus, amivel titkosítják a kulcsot a passphrase-el. Én csak ezt az elvet vettem át.
Egyrészt nem titkosítok jelszót, másrészt már létező elveket alkalmazok, harmadrészt meg utánanéztem, és ami nem volt világos (pl hogy know plain text attack-ra mennyire sebezhetőek a mostani algoritmusok), azzal kapcsolatban megkérdeztem szakértőket. De ha konstruktív szeretnél lenni, akkor mutass rá egy sebezhetőségre ezzel a megoldással kapcsolatban. Esetleg ha tudsz már kész létező keretrendszert arra, amivel egy adatbázisban bizonyos rekordokat le tudok titkosítani, akkor nyugodtan megírhatod azt is. Én nem találtam.
Nincs
Ha user adatokat akarsz titkositani, akkor bajban vagy, mert vagy az van hogy a user a jelszo elvesztese eseten elveszti az adataihoz valo hozzafereset is, vagy pedig nem lesz biztonsagos a rendszer. Raadasul a titkositott adatbazis ertelmesen nem keresheto. Ha pedig indexet epitesz ra, akkor potencialisan adatot leakelsz.
Csinalhatod azt, hogy minden userre nyitsz kulon DB-t, pl. ilyen az SQLCipher SQLite-ra, vagy tehetsz HSQLDB-t titkositott fileba (es kuzdhetsz azzal hogy ne maradjon memoriaban a plain text adat), vagy akar titkosithatsz egyedi rekordokat is, megoldhatod a userek kozotti adatatadast ketkulcsos titkositassal, de szolgaltatoi oldalon erre tenyleg bevalt, bombabiztos megoldas nincs. Kulonos keppen, hogy az adat es a jelszo atmegy a halozaton az alkalmazasodban ott lesz memoriaban es a modern nyelvek nem gondoskodnak arrol, hogy tenyleg ki is takarodjon a memoriabol ha vegeztek a feldolgozassal.
Lehet erolkodni a kerdesen, de a nap vegen el kell dontened hogy mi a fontosabb: a kenyelem vagy a biztonsag. Ha a biztonsag, akkor a kliensen dekodolod az adatokat es a szerver nem is tud a kulcsrol. Ha meg a kenyelem, akkor...
Mindkettő
Az egyik lényeg az elvében, hogy magát a jelszót semmilyen hash-elt - varázsolt formában sem akarja tárolni.
Viszont felhívtad az én figyelmem is egy olyan problémára, amire még nem gondoltam:
Kezd egy kicsit zsákutca - érzésem lenni, szerencsére inf3rno nem adja fel könnyen. :)
Nem
Ennel durvabb a helyzet. Ha a jelszo reszet kepezi a titkosito kulcsnak, akkor a jelszo elvesztese automatikusan az adat hasznalhatatlanna tetelet is jelenti. Ha akarsz elfelejtett jelszo funkciot, az magaban foglalja azt is, hogy az uzemeltetonek kell egy "backdoor" amin keresztul a jelszo ismerete nelkul fel tudja oldani a titkositast.
Pontosan így van. Egyébként
No jött válasz közben. Ha
szerk:
Azt a választ kaptam, hogy a PBKDF2 megoldja a jelszó átalakítását megfelelő hosszúra megfelelő sebességgel, hogy ne legyen brute force-olható a beléptető része. Ránézésre nincs gyengesége a megoldásnak, de nem ajánlják, hogy használjam, mert ez nem zárja ki, hogy nincs valami rejtett gyengesége, ami csak akkor kerül ki, ha sokan sokáig használják. Amire nekem kell, arra elég lesz ez is szerintem. Még átgondolom, hogy akarok e valami default kulcsot tárolni a titkosított JSON-ban vagy sem. Ha nem, akkor maradhat a sima hash-elős megoldás a beléptetésre, ha igen, akkor meg ez lesz beléptetésre is, nem csak kulcs titkosításra.
Így néz ki a dolog elég elnagyoltan (nyilván crypto modult használom majd nodejs-el):
regisztráció / jelszó csere:
Ha csak a jelszóról akarunk
Ezt jól látod, választani kell a biztonság vagy aközött, hogy esetleg elvesznek a titkosított adatok, ha elfelejti a jelszót. Én inkább az utóbbira szavazok. Ennek tükrözni kell azt is, hogy milyen jelszót követelsz meg, pl legyen benne szám, speciális karakter, legyen x hosszú, stb. Ha túl cifra, akkor könnyebben elfelejti, viszont biztonságosabb. Nehéz ebben megtalálni az egyensúlyt, be kell vallanom sok jelszót én is leírok papírra, mert nem tudnám fejben tartani őket.
Igen, ez a másik dolog, amivel küzdök, de majd csak kitalálok rá valamit. Ugye itt egyik oldalról van, hogy leak-elek, de gyors lesz, vagy nem leak-elek, és lehet, hogy használhatatlanul lassú lesz. Ebben is meg kell találni az egyensúlyt.
Ja, jól látod. Szvsz meg kell vizsgálni, hogy mik a valószínűbb támadási módok, pl hogy valaki ellopja a vinyót vagy hogy valaki hálózatról feltöri a cuccot, és azokra felkészülni úgy, hogy lehetőleg a kényelem ne lássa kárát.
Jellemzoen
Ez ugyan nem biztosit vedelmet minden ellen, de egy SQL injection altali leak eseten megvedi az adatokat.
Bár normál adatbázis index-et
Arra gondolsz, hogy
Mondjuk, hogy olvastam ezt a topicot, és tudom, hogy inf3rno rajong ezért a módszerét, vagy dühös exalkalmazott vagyok, akinek nincs hozzáférése a kulcsokhoz.
Lásd feljebb.
Létező módszer, hogy a userenként változó (random, nem email cím) még egy db-n kívüli komponense is van a sónak. A legtöbb db leak esetén nem férnek hozzá a fájlrendszerhez, memóriához (bocsi forrást most nem tudok).
Erre tesz rá egy lapáttal a hsm amiből nem szedhető ki a titkos komponens.
Röviden a saját módszerről: ha ki is indulsz egy tisztességes hash algoritmusból, amikor elkezdesz variálni csökkenteni fogod az entrópiát; az így kapott hash-eid szóródása nem lesz annyira egyenletes, mint az eredeti algó esetén. Rosszabb esetben más mellékhatásokat is behozol.
Pont ezért kérdeztem meg
Threat model
Igen, én is ezt írtam
Ezt mondom :)
Viszont elkanyarodtunk, inf3rno gondját nem oldja meg.
inf3rno gondját nem oldja
Én csak felhoztam a témát, egyébként már a nyitás előtt nagyjából körvonalazódott, hogy mit és hogyan fogok csinálni. Szóval nincs gond, amit meg kéne oldani. :-)