2024. március 29., péntek

Gyorskeresés

Jelszó generálás biztonságosan

Írta: | Kulcsszavak: security . biztonság . jelszó . rng . prng

[ ÚJ BEJEGYZÉS ]

Alapozás

Azt hiszem, nem árulok el nagy titkot, ha azt mondom, körülbelül az utolsó két évtizedben az informatika robbanásszerű fejlődésnek indult, ezzel együtt egyre több és több szolgáltatás épül rá (gondoljunk csak a használható streaming szolgáltatásokra, felhőkre, online fizetési megoldásokra). Mivel egyre többen férnek hozzá a technikai fejlődés vívmányaihoz, minden eddiginél fontosabbá vált a különböző érzékeny adatok védelme. Ez természetesen azt jelenti - a technikai fejlődéssel egyetemben -, hogy a védelemnek is fejlődnie kell. Egyre szélesebb körű és egyre több rétegből álló védelmet kell felállítanunk ahhoz, hogy a fontos információk ne kerülhessenek illetéktelen kezekbe.

Ennek a védelemnek az egyik legrégibb eleme a biztonságos jelszó - megragadnám az alkalmat, hogy azonnal tisztázzam is, mire gondolok, mert a fenti kijelentés eléggé kétértelmű. Nos, mindkettőre gondolok:

- a jelenlegi kutatások szerint a minimális biztonságos jelszóhossz 12 karakter, kisbetűkből, nagybetűkből és számokból áll. Fontos különbség a korábbiakhoz képest, hogy újabban a speciális karaktereket nem tartják fontosnak a kutatók - és azt is érdemes megjegyezni, hogy sok webes szolgáltatás nem is támogatja ezek használatát
- a másik fontos szempont, hogy biztonságos algoritmus generálja a jelszavakat.

Mit takar ez utóbbi kitétel? Jelszavakat sokféle módon lehet generálni, de minden biztonsági rendszer az IT-ban kriptográfiára épül. Nos, a biztonságos algoritmus olyan kriptográfiai elemekre épül, ahol az algoritmus kimenete nem jósolható meg előre. A jelszó generálás olyan terület, ahol fontos ez a kitétel, így nem mindegy, milyen eszközöket használunk.
A művelet alapja, hogy a kiválasztott karakterek véletlenszerűen kerüljenek a jelszóba. És itt komoly problémába ütközünk: az igazi véletlenszerűséghez valamilyen állandóan változó környezeti állapotot használó hardveres generátor kell, ami drága, egyébként be kell érnünk a sokkal gyengébb pszeudo-generátorral, ahol véletlenszerűnek tűnik a generálás, viszont a generátor állapotának ismeretében a kimenet kiszámítható. Nincs azonban veszve minden, biztonsági szempontból megkülönböztethetünk pszeudo-generátorokat és kriptográfiailag biztonságos pszeudo-generátorokat.

Nos, jelszavak generálásához kizárólag az utóbbi csoport jöhet szóba.
Tegyük fel, hogy saját magunk szórakoztatására némi programozási gyakorlatot végzünk és jelszavakat szeretnénk generálni - mutatok egy rossz és egy jó megoldást is Pythonban.


A Cloudflare lávalámpákból álló fala, amit véletlenszám-generáláshoz használnak. Forrás: https://blog.cloudflare.com

Egy megoldás

Időnként bele-belekontárkodom Python programozásba, kisebb magán projekteket csináltam eddig, saját portscannert (programozási gyakorlatként az nmap modul nélkül), network discovery-t, ngSIEM rendszerek tesztelésére használható eszközöket (cryptor, keylogger stb.) és próbaképpen jelszó generátort.

Utóbbinál merült fel a gondolat: biztos, hogy a Python random modulja elég random? Nos, lássuk!

A Google kereső első 4 találata a "password generator python" keresőkifejezésre tulajdonképpen ugyanazt a megoldást adja apró implementációs különbségekről eltekintve, nagyon hasonlók az alábbi kódhoz:

import string
import random

uCC = string.ascii_uppercase
lCC = string.ascii_lowercase
num = string.digits
all = uCC + lCC + num
password = ''

for i in range(12):
password += random.choice(all)
print(password)

A fenti pár sor tényleg csak demonstrációs célokat szolgál - többek között demonstrálja, hogyan ne generáljunk jelszavakat.
A Python random modulja ugyanis kriptográfiailag nem biztonságos, az általa generált véletlenszerű számok előre megjósolhatók. Maxim Kochukov írt egy Python modult ennek bizonyítására randcrack néven. Mindössze 624 darab 32 bites szám generálása után a randcrack képes az ún. Mersenne Twister mátrix állapotának felismerésére, ezáltal teljesen szinkronba kerül a random modullal. Ha ekkor generáltatunk "véletlenszerű" számokat, mind a random, mind a randcrack ugyanazokat a kimeneteket adja. Megjegyzés: Maxim szerint a randcrack pontossága 50K szám generálása esetén csökken 50% környékére, 10K körül még 95%.

Teszt kód:

import random, time
from randcrack import RandCrack

random.seed(time.time())

rc = RandCrack()

for i in range(624):
rc.submit(random.getrandbits(32))
# Could be filled with random.randint(0,4294967294) or random.randrange(0,4294967294)

print("Random result: {}\nCracker result: {}"
.format(random.randrange(0, 4294967295), rc.predict_randrange(0, 4294967295)))

Egy másik megoldás

Fentiekből elég könnyen leszűrhető, hogy a Python random modulja nem alkalmas jelszavak generálására. Lássunk egy jobb, kriptográfiailag biztonságos megoldást.

import string
import secrets

uCC = string.ascii_uppercase
lCC = string.ascii_lowercase
num = string.digits

all = uCC + lCC + num
password = ''

for i in range(12):
password += secrets.choice(all)

print(password)

A Python secrets modulja az operációs rendszer által használt véletlenszám generátorokra alapul - jelen ismereteink szerint ezek megfelelően biztonságosak ahhoz, hogy a különböző védelmi megoldásokban, például jelszó generátorokban használhassuk.

A fentiek alapján ha netán nem tudunk időben félreugrani a hasonló feladatok elől, érdemes pro és kontra kutatásokat végezni, mielőtt egy implementációt az asztalra tennénk.

Miért nem a CoreInfinity.Tech blogon van az írás?

Sokan talán meglepetéssel veszik észre, hogy ide készült az írás a hazai pálya helyett. Nos, az indoklás elég egyszerű: ez egy technikai cikk, a CoreInfinity.Tech blogot pedig szeretném megtartani a magasabb szintű írások helyszíneként.

Hozzászólások

(#1) dqdb


dqdb
nagyúr

[link]
Egy gyakorlati példa arra, hogy hogyan ne generáljunk jelszavakat. "Apró" szépséghiba, hogy ezt egy jelszókezelő alkalmazásban sikerült elkövetni :U

tAm6DAHNIbRMzSEARWxtZW50ZW0gdmFka5RydIJ6bmkuDQoNClOBc4Ek

(#2) Krugszvele


Krugszvele
aktív tag

és az ilyen jelszavakat hogy lehet megjegyezni?
Amennyiben több eszközön szeretnéd használni, akkor jelszómenedzserre lesz szükség.
Nem túl nagy - nagyobb - biztonsági kockázat jelszókezelőt használni, mint inkább normális, megjegyezhető jelszavakat minden weboldalhoz?

(#3) sh4d0w válasza Krugszvele (#2) üzenetére


sh4d0w
nagyúr
LOGOUT blog

Ez örök probléma, a megoldása pedig nagyban függ a metódustól, ahogyan megjegyzed a jelszavaidat. Ha nem vagy képes rá, vagy kényelmesebb, használj jelszómenedzsert, ha meg tudod jegyezni, akkor figyelj oda arra, hogy ne legyenek támadhatók szótárakkal.

https://www.coreinfinity.tech

(#4) zzolika


zzolika
aktív tag

Bocs, lehet én nem értek valamit, de mi szükség van egyáltalán jelszó generálásra???
Egy weboldalon, fórumban, banki belépésnél, ahol regisztráció szükséges, én adom meg a jelszót. Nem automatán az oldal üzemeltetője (vagy akkor az első belépésnél kötelező lecserélni, pl elfelejtett jelszó).
Vagy van olyan aki nem tud mit kitalálni, amit meg is tud jegyezni, hanem e helyett egy random generátorral csinál magának jelszót?

(#5) Kendek válasza zzolika (#4) üzenetére


Kendek
MODERÁTOR

Amit te találsz ki jelszót és meg tudod jegyezni, az nem túl biztonságos. A lényeg, hogy legyen hosszú és ránézésre teljesen véletlenszerű-értelmetlen, és a legfontosabb, hogy mindenhol más jelszót használj.

tr -dc a-zA-Z0-9 </dev/urandom | head -c 16

Én így szoktam generálni, és még ha van is benne bármilyen szintű megjósolhatóság, annak a kiszámításához nem lesz fogódzó. Nem lehet kiszótárazni, és ha mégis ellopják mert valahol sima szövegként tárolták, akkor sem lehet felhasználni máshol.
A kétlépcsős hitelesítésre is leginkább ezért van szükség, mert a jelszavak gyakran túl gyengék az emberi hanyagság miatt.

<-ƘƘ->

(#6) sh4d0w válasza zzolika (#4) üzenetére


sh4d0w
nagyúr
LOGOUT blog

Vannak, akik generalnak jelszavakat. Amikor sok rendszerhez van hozzaferesed, egy ido utan keptelenseg minden jelszot fejben tartani, igy jobb, ha hasznalsz jelszokezelot - ezekben pedig van generator is.

https://www.coreinfinity.tech

(#7) st3v3np3t3r


st3v3np3t3r
veterán

Én erre a célra ezt az oldalt használom:
https://passwordsgenerator.net/

Általában max.16-17 karakterig, de mint látható, 128karakterig képes jelszót generálni.

Galaxy S23 5G 256GB//HP Victus 16+Rog Ally RC71L//Korábbi hsz-eim #97246720 név alatt...

(#8) zzolika válasza Kendek (#5) üzenetére


zzolika
aktív tag

Ezzel nem teljesen értek egyet. Mondjuk pl az Als0G@ty@0523 jelszót pl még meg lehet jegyezni :) jobban mint a random jelszavakat, és nem hiszem hogy szótárban benne van.
A cikkben írt 50K szám generálása esetén csökken 50% környékére, 10K körül még 95%, na ez is van ennyire biztonságos.
Az olyan oldalakon, ahol úgysem adok meg semmi privátot, csak be kell lépni valahogy, az 123 jelszó is megteszi, azt nem felejtem el, ha ellopták is visszaélni nem tudnak mivel.
Természetesen a bankoláshoz, emilhez ettől komolyabb jelszavam van, és a telefonra sms-ben küldött azonosító szerintem elég biztonságot ad.
De láttam olyat is, hogy a 30 karakteres, kis/nagybetű/szám kombós, megjegyezhetetlen jelszó (azt hiszem pont a banki belépéshez), a monitorra volt ragasztva egy postit-tel, hogy el ne felejtsék, na ez az igazi biztonság :DD
Igazad van, az emberi hülyeség, hanyagság ellen sosem lesz elég erős védelem. Ebből van a legtöbb virus/zsarolóvirus bekapása is, amikor a felhasználó nem tudja hogy mi az, de önként kattint rá a telepítésére.

#6: Sokfelé kell jelszó, a fontos helyekre van 1 külön, a többire 3-4-et variálok, ennyit még megjegyzem. A nem fontosra (webshop, fórum) mehet akár az 123 is, vagy megjegyzi a böngésző.
A jelszókezelőkben nem tudom mennyire lehet megbízni, vannak fenntartásaim. Azt honnan tudod azokban milyen generátor van? És ha még tényleg random is, attól még jelenthetnek kifelé bármit... Az összes jelszavad tudják egy helyen (főleg egy ingyenes program, ad valamit ingyen?), ez szerintem sokkal nagyobb biztonsági kockázat, mintha nem elég erős a jelszavad.

(#9) sh4d0w válasza zzolika (#8) üzenetére


sh4d0w
nagyúr
LOGOUT blog

A megoldás egyszerű: vannak cégek, akik jelszómenedzserből élnek, ha a termékük rosszalkodik, az egész üzletnek annyi. Például van termék, amit kompletten hostolhatsz magadnak ingyen, kliensoldali a titkosítás, ha elfelejted a master passwordöt, akkor minden információnak annyi - lásd Bitwarden. Sokkal kisebb kockázat, mint egy gyenge jelszó, amit egy mai modern PC-vel órák alatt meg lehet törni.

https://www.coreinfinity.tech

(#10) zzolika válasza sh4d0w (#9) üzenetére


zzolika
aktív tag

ha a termékük rosszalkodik, az egész üzletnek annyi
Ugye a windowsban/androidban sincs beépített telemetria? Tudja valaki biztosan mit, hova küld? Annyi lett? Hát nem...
A 0$/month ártól még nem érzem magam biztonságban. Miért kapsz valamit ingyen egy profitra épülő cégtől? Valahogy mindig fizetsz, ha nem $-al, akkor az adataiddal. Nem jótékonyságból dolgoznak ők sem.
Értem én hogy egy egyszerűbb jelszót könnyebben fel lehet törni, de ki foglalkozna ezzel? Mit nyernek vele? Beírnak a PH fórumba, vagy az xxx webshopban rendelnek valamit helyettem utánvéttel amit nem veszek át mert nem én rendeltem?
Kicsit túl van lihegve a probléma, mint a spectre/meltdown, amivel senki sem találkozott még, de van rá 0,01% lehetőség, ha valaki még pluszban root passworddel pendriveról telepít valami kártékony programot.

Sokkal nagyobb szopatás, amikor pl a wifi jelszó (jó biztonságos, mint a #7-ben) beírása egy új ügyfélnek 2-5 perc, mert valamit úgyis elüt. És utána úgysem használja többet. Aki rendszeresen rajta van, az itt dolgozik, max 5 méterre tőlem, mert messzebb úgysem ér el a hatótáv.
Persze ha komoly, pl kormányzati helyekre való jelszóról beszélünk az más szitu, de oda is bejut aki nagyon akarja (az orosz hackerek az usa választásba?)

További hozzászólások megtekintése...
Copyright © 2000-2024 PROHARDVER Informatikai Kft.