Jól csináltam meg Python-ban, az alábbi jelszó generátort?
A kód:
import string
import random
def generate_password(length):
chars = string.ascii_letters + string.digits + string.punctuation
password = ''.join(random.choice(chars) for i in range(length))
return password
print(generate_password(16))
A random.choice egy pszeudó random generátor, tehát a seed ismeretében ki lehet találni, hogy mi generál.
Itt még írják is, hogy nem javasolják biztonsági dolgokhoz:
"Warning
The pseudo-random generators of this module should not be used for security purposes. For security or cryptographic uses, see the secrets module. "
Jól írja a 2.-ik hozzászóló.
A Crypto.Random.random modulból generálni biztonságosabb, kritpgráfialag erős random generátor: [link]
@13:43
Az a Crypto.Random.random modul ami említettem alapból az operációs rendszer random generátorát használja fel, de paraméterezhető is hogy mi legyen a forrás.
Azért nem javasoltam a nyers os.urandom-ból való nyers bájtokból való közvetlen feldolgozást, hogy ne essen abba a hibába a programozó mint amibe annak a kódnak az írója is esett.
Ehhez a valószínűségszámítási hátterével is képben kell lenni. Aki pedig képbe van vele, nem feltétlen érdemes neki újra implenetálni matematikailag helyesen ami már kész van, elég ha csak használnia kell amit mások implenetáltak helyette és át is ellenőriztek többen is.
Az említett kóddal leírom hogy mi a baj:
A map végig iterál os.urandom(length)-en. Az os.urandom(length) egy bytes típusú objektumot ad vissza, elemenként végigmenve rajta az os random generátorából vett 0-255 közötti egész számokat kapunk.
A 0-255 közötti értékek előfodulása megfelel az egyenletességi hipotézisnek, az oprendeszer készítői garantálják.
Mi a helyezet ezzel ? : lambda x: int(len(symbols)*x/255.0) .
Ez a 0-255 közötti értékeket leképezi 0-len(len(symbols)) értékekké.
A hiba kezdem ami triviális:
password.append(symbols[i]) esetében IndexError kivételt dobhat akkor ha i == len(symbols) feltétel teljesül, mégpedig iterációnként 1:256 valószínűséggel teljesülhet.
Könnyen előidézhető így:
while 1:
__make_random_password()
Ez csak sima implenetációs hiba, de fundamentálisan nem ez a hiba (persze mondhatná a készítő, hogy valószínűségi szempontból fícsör és nem hiba a nem triviális része, de nem igazán hihető duma lenne). Valószínűségszámítási szempontból adott karakterkészlettel adott karakterhosszal akkor maximális az entrópia, ha az előfordulható karakterek valószínűsége megfelel az egyenletességi hipotézisnek.
Ez a feltétel nem teljesül, valamelyik karakternek nagyobb a valószínűsége valamelyiknek pedig kevesebb.
A valószínűségek a lambda x: int(len(symbols)*x/255.0) függénye szerint alakulnak, méghozzá hogy az értékeket 0-255-ről hogy képezi le 0-len(symbols)-ra.
Összeszámoltam hogy mely értékre hányszor képezi le:
Mindre ugyanannyiszor kéne, hogy leképezze ahhoz hogy az egyenletességi hipotézis ne sérüljön.
További kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!