Kezdőoldal » Számítástechnika » Programozás » Jól csináltam meg Python-ban,...

Jól csináltam meg Python-ban, az alábbi jelszó generátort?

Figyelt kérdés

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))



2023. jan. 28. 17:28
 1/9 anonim ***** válasza:
89%
elofordulhat hogy 16 'a' betut general jelszonak. vagy hogy nincs benne kis betu vagy szam. generalj vele pl. 1000 jelszot es biztos lesz kozte olyan amibe mondjuk nincs szam. de ha ez nem gond akkor teljesen jo!
2023. jan. 28. 17:52
Hasznos számodra ez a válasz?
 2/9 anonim ***** válasza:
69%

A random.choice egy pszeudó random generátor, tehát a seed ismeretében ki lehet találni, hogy mi generál.


[link]

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. "

2023. jan. 28. 18:18
Hasznos számodra ez a válasz?
 3/9 anonim ***** válasza:
100%

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]

2023. jan. 28. 20:50
Hasznos számodra ez a válasz?
 4/9 A kérdező kommentje:
Köszönöm szépen mindenkinek!
2023. jan. 29. 10:54
 5/9 anonim ***** válasza:
Na akkor miért is lettem lepontozva, ha a 3-mas nem?
2023. jan. 29. 11:45
Hasznos számodra ez a válasz?
 6/9 A kérdező kommentje:
Én nem pontoztam le senkit.
2023. jan. 29. 16:09
 7/9 anonim ***** válasza:
Egyrészt fontos utilizálni az említett crypto random modult, másrészt én modulárisabbá tenném, hogy megadhatóblegyen hogy milyen karakterekkel, hosszal generáljon.
2023. jan. 30. 09:46
Hasznos számodra ez a válasz?
 8/9 anonim ***** válasza:
35%
Szerintem felesleges ezért külön lib-et telepíteni. Minden OS rendelkezik erős random generátorral, amit fel lehet használni ahhoz, hogy véletlenszerűséget generálj. Python-ban ezt as os.urandom segítségével tudod elérni. Ez a gist elég faszán megoldja: [link]
2023. febr. 1. 13:43
Hasznos számodra ez a válasz?
 9/9 anonim ***** válasza:

@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:

[link]

Mindre ugyanannyiszor kéne, hogy leképezze ahhoz hogy az egyenletességi hipotézis ne sérüljön.

2023. febr. 1. 14:53
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!