Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from tkinter import *
- import tkinter.messagebox
- import pymysql
- import uuid
- import hashlib
- # salausfunktiot
- # http://pythoncentral.io/hashing-strings-with-python/
- def hash_password(password):
- # uuid is used to generate a random number
- salt = uuid.uuid4().hex
- return hashlib.sha256(salt.encode() + password.encode()).hexdigest() \
- + ':' + salt
- def check_password(hashed_password, user_password):
- password, salt = hashed_password.split(':')
- return password == hashlib.sha256(salt.encode() + \
- user_password.encode()).hexdigest()
- # käytetään alla olevaa MYSQL-tietokantaa ja yhtä taulua
- #
- # edelliseen verrattuna kasvatettu salasanan pituutta, koska
- # kryptattu salasana on tavallista pidempi
- """
- CREATE DATABASE koekanta1;
- CREATE TABLE IF NOT EXISTS `koekanta1`.`Tunnustaulu` (
- `tunnusID` INT NOT NULL AUTO_INCREMENT,
- `tunnus` VARCHAR(8) NOT NULL,
- `salasana` VARCHAR(1024) NOT NULL,
- PRIMARY KEY (`tunnusID`),
- UNIQUE INDEX `tunnus_UNIQUE` (`tunnus` ASC));
- """
- # MySQL-palvelimen kirjautumistiedot
- PALVELIN='192.168.99.99'
- MYSQLKAYTTAJA='python'
- MYSQLSALASANA='python'
- TUNNUSTIETOKANTA='koekanta1'
- # Muutama testitunnus
- testitunnukset = [["testeri1","salasana1"],
- ["testeri2","salasana2"],
- ["testeri3","salasana3"]]
- class Kirjautumisikkuna:
- def __init__(self):
- self.__ikkuna=Tk()
- self.__ikkuna.title("Syötä käyttäjätunnus ja salasana")
- self.__label_tunnus=Label(self.__ikkuna,text="Käyttäjätunnus:")
- self.__entry_tunnus=Entry(self.__ikkuna,width=24)
- self.__label_salasana=Label(self.__ikkuna,text="Salasana:")
- # show="*" näyttää salasanan merkit tähtinä
- self.__entry_salasana=Entry(self.__ikkuna,width=24,show="*")
- self.__nappi_kirjaudu=Button(self.__ikkuna,
- text="Kirjaudu",
- command=self.kirjaudu)
- self.__label_tunnus.grid(row=0,column=0,sticky='W')
- self.__entry_tunnus.grid(row=0,column=1)
- self.__label_salasana.grid(row=1,column=0,sticky='W')
- self.__entry_salasana.grid(row=1,column=1)
- self.__nappi_kirjaudu.grid(row=2,columnspan=2)
- mainloop()
- def kirjaudu(self):
- tunnus=self.__entry_tunnus.get()
- salasana=self.__entry_salasana.get()
- if len(tunnus)==0 or len(salasana)==0:
- messagebox.showinfo("VIRHE", "Käyttäjätunnus ja salasana ei kelpaa")
- else:
- tunnusID=tarkasta(tunnus,salasana)
- if tunnusID==None:
- messagebox.showinfo("VIRHE","Kirjautuminen epäonnistui")
- else:
- messagebox.showinfo("Kirjautuminen OK",\
- "tunnusID={0}".format(tunnusID))
- def tarkasta(kirjautumistunnus,kirjautumissalasana):
- jatketaanko=False
- try:
- # aukaistaan kanta
- conn = pymysql.connect(host=PALVELIN,
- port=3306,
- user=MYSQLKAYTTAJA,
- passwd=MYSQLSALASANA,
- db=TUNNUSTIETOKANTA)
- jatketaanko=True
- except Exception as e:
- print("Yhteyden aukaisu tietokantaan epäonnistui")
- print(str(e))
- if jatketaanko:
- try:
- cur = conn.cursor()
- cur.execute("SELECT * FROM Tunnustaulu")
- except Exception as e:
- print("Virhe luettaessa tietokantaa")
- print(str(e))
- jatketaanko=False
- conn.close()
- if jatketaanko:
- # jos kanta on tyhjä, niin lisätään testitunnukset
- if cur.rowcount==0:
- for rivi in testitunnukset:
- # salataan kantaan tallennettavat salasanat
- # käyttämällä Python Centralin valmista
- # hash_password()-funktiota, joka käyttää
- # sha256 ja satunnaislukua, mikä saadaan
- # uuid-kirjastosta
- sql="INSERT INTO Tunnustaulu(tunnus,salasana) "\
- "VALUES ('{0}','{1}')"\
- .format(rivi[0],hash_password(rivi[1]))
- try:
- cur.execute(sql)
- conn.commit()
- print("Tunnus",rivi[0],"lisätty tietokantaan")
- except Exception as e:
- conn.rollback()
- print("Tapahtui virhe suorittaessa SQL-komentoa:\n",sql)
- print(str(e))
- # varsinainen tunnuksen ja salasanan tarkastus
- # ilman salausta
- # sql="SELECT tunnusID FROM Tunnustaulu WHERE "\
- # "tunnus = '{0}' AND salasana = '{1}'"\
- # .format(kirjautumistunnus,kirjautumissalasana)
- # salauksen kanssa
- # haetaan kannasta käyttäjätunnuksen perusteella tunnusID
- # ja sha256-koodattu salasana
- sql="SELECT tunnusID,salasana FROM Tunnustaulu WHERE "\
- "tunnus = '{0}'"\
- .format(kirjautumistunnus)
- kirjautumistunnusID=None # palautettava ID-numero tauluun
- try:
- cur.execute(sql)
- # jos löytyi yksi käyttäjätunnus, niin tarkastetaan salasana
- if cur.rowcount==1:
- hakurivi=cur.fetchone()
- # käytetään Python Cenralin check_password-funktiota
- # salasanan tarkastukseen, hakurivi[1] on kannasta
- # saatu krypattu, ja kirjautumissalasana käyttäjän
- # ikkunaan kirjoittama salasana
- if check_password(hakurivi[1],kirjautumissalasana):
- kirjautumistunnusID=hakurivi[0]
- except Exception as e:
- print("Tapahtui virhe luettassa tietokantaa")
- print(str(e))
- cur.close()
- conn.close()
- return kirjautumistunnusID
- # käynnistys
- kirjautumisikkuna = Kirjautumisikkuna()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement