Ebben a programban mi lehet a baj? (python) (egyszerűen hiába nézem nem jövök rá a problémára, (most kezdtem) ) rossz kifogás de ez van.
password = 'apple'
bemenet = input('What is password?')
proba = 0
while bemenet != password:
proba += 1
if proba == 3:
print('System closed!')
break
print('incorrect password, try again!')
bemenet = input('What is password?')
if bemenet == password:
print('Access given!')
1. Ezért érdemes kódmegosztó oldalt használni - ha már a Gyakorikérdések rendszere eltünteti az indentálási szóközöket. Feltöltöttem a kódot ide:
2. Jó lenne tudni, milyen hibát ad vissza, mikor futtatod kedves kérdező, vagy mi nem működik.
A gyanúm szerint vagy az lehet a gond, hogy Python 2 alatt a kód nem fut le - sajnos a Python 2 input függvénye:
máshogy működik, mint a Python 3-ban:
vagy valami indentálási hiba lép fel a kérdezőnél (amit meg sajnos nem láthatunk.
Bár nem a kérdésedhez tartozik, erre az utasításra egy kicsit térjünk ki:
password = 'apple'
A rendszered akkor lesz biztonságos, ha a jelszót, amivel hozzá lehet férni, titkosítva tárolod. Titkosításnak két fajtája van:
1) Kétirányú titkosítás - vagyis az adatot egy kulcsot használva titkosítod, és ugyanezt a kulcsot használva vissza is tudod nyerni az eredeti adatot. Ilyen például az RSA és az AES.
2) Egyirányú titkosítás - más néven hash-elés, aminek az a lényege, hogy a titkosítás kulcs nélkül történik, de ezáltal az eredeti adatot soha nem kapod vissza. Ilyen például a CRC, az MD5 és az SHA-1/256/512.
Mindkét változat esetében nyilvánosan ismert az algoritmus, tehát az adatot úgy kell tudnia titkosítani az algoritmusnak, hogy a használt algoritmus ismeretében se érje meg feltörni a rendszert.
Nekünk az egyirányú módszer az érdekes. Úgy működik az elképzelésünk ugyanis, hogy a titkosítandó adatból egy algoritmus egy számot generál, például az "apple" szóhoz a 32-t kapod, vagy a "pear"-hoz a 81-et. A módszer biztonsága függ attól, hogy mekkora a legnagyobb hozzárendelhető szám - ha például a legkisebb érték a 0 és a legnagyobb a 10, akkor nagyon hamar előfordulhat az az eset, hogy az algoritmus az "apple" és a "pear" szavakra ugyanúgy 5-öt ad eredményül - tehát a programodba minden olyan jelszóval be lehet lépni, amire a titkosító algoritmus ugyanazt a számot adja eredményül. Mint bizonyára kitaláltad, mindig lehet ilyen bemenetpárokat találni, aminek ugyanaz az eredménye. A biztonság tehát nem azt jelenti, hogy a rendszer feltörhető-e vagy sem - mert mindig feltörhető. Sokkal inkább az a lényeg, hogy a titkosításhoz használt algoritmus ismeretében nagyobb nyereséghez jutunk-e a rendszer feltörése után, mint amennyi költséget a rendszer feltörésébe fektetünk be.
Ha jelszót tárolsz, valójában a programod számára teljesen felesleges az eredeti jelszó, jelen esetben az "apple". Bőven elég helyette az a két információ, hogy mi az eredeti jelszó hash-e és milyen módszerrel hash-elted. Ezt a két információt nyugodtan tárolhatod egymás mellett. Azért van szükségünk az egyirányú titkosításra, mert a jelszavainkat tároló adatbázist sikeresen fel fogják törni, a tárolt jelszavaink ki fognak kerülni, ezért fejlesztőként nem tárolhatjuk magukat a jelszavakat, mert az azonnali hozzáférést ad a támadónak. Ugyanakkor ez a módszer önmagában még mindig nem biztonságos, ha érdekel, miért és hogyan lehet még biztonságosabb, ezt a cikket olvasd el:
Mindez Python-ban valahogy így néz ki:
#!coding: utf-8
import hashlib
def check_password(hashed_value, user_input, hash_method):
.. hash_calc = None
..
.. if hash_method == 'SHA-512':
.. .. hash_calc = hashlib.new('sha512')
.. #elif-fel vehetsz fel más módszereket
.. else:
.. .. return False #semmilyen specifikus hibaüzenet nem jelenhet meg a jelszót illetően!
.. ..
.. hash_calc.update(user_input)
.. return hash_calc.hexdigest().upper() == hashed_value.upper()
password = 'A336F671080FBF4F2A230F313560DDF0D0C12DFCF1741E49E8722A234673037DC493CAA8D291D8025F71089D63CEA809CC8AE53E5B17054806837DBE4099C4CA'
hash_method = 'SHA-512'
user_input = 'mypassword' #ezt írta be a felhasználó
if (check_password(password, user_input, hash_method)):
.. print 'Successfully logged in'
.. #pro tip: ha közben áttértél egy új titkosító módszerre (mert mondjuk kiderült, hogy az SHA-512 már nem biztonságos), ezen a ponton újra tudod hash-elni a felhasználó jelszavát az új módszerrel - ezért kell mindig tárolni, hogy melyik hash algoritmust használtad
else:
.. print 'Wrong username or password'
Utolsó: amíg a kérdező ilyen hányás kódot ír, kár ezt a titkosítás témát erőltetni.
Kérdező,a kódod lefut gond nélkül 3.6.5-ös Python alatt, egy kicsit átírtam mert ez így elég ocsmány.
Így fél fokkal tűrhetőbb és értelmesebb is.
Kizárólag angol változóneveket használj, így mixelni a magyart meg az angolt borzalmas.
"Így fél fokkal tűrhetőbb és értelmesebb is."
Igen, így áttekinthetőbb. Apró szépséghibája, hogy ha 3x rossz kódot írnak be, akkor a 4x is bekéri a jelszót, és utána rögtön kiírja, hoghy System closed!
:)
Vagy elég a tries += 1-et az if tries == 3: elé tenni és akkor már indítható 0-ról, előbb növeli, aztán fut le minden vizsgálat. Ez így még logikusabb is.
Jól megbeszéltem magammal.
Kapcsolódó 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!