Как сравнить хешированный пароль из базы данных и пароль для входа в систему GUI, созданную с помощью tkinter - PullRequest
0 голосов
/ 02 февраля 2020

, поэтому я новичок в Python, но мне пришлось создать систему входа в систему, используя либо python, либо веб-приложение. Я решил go с GUI, используя tkinter, это было сделано за пару дней исследований, так что не стесняйтесь сказать мне, могу ли я что-нибудь сделать лучше с найденным кодом.

Проект создавал систему регистрации и входа в систему, используя ha sh и соль. Ха sh и соль должны быть видны в базе данных при открытии БД. Пока мне это удалось. Я могу зарегистрироваться, и при нажатии входа в систему он проверяет, есть ли строка в БД с такой точной информацией, и возвращает их в консоли, в противном случае он не возвращает ни одного.

from tkinter import *
import os
import sqlite3
import hashlib


# Designing window for registration

def register():
    global register_screen
    register_screen = Toplevel(main_screen)
    register_screen.title("Register")
    register_screen.geometry("300x250")

    global username
    global password
    global salt
    global username_entry
    global password_entry
    global salt_entry
    username = StringVar()
    password = StringVar()
    salt = StringVar()

    Label(register_screen, text="Please enter details below", bg="blue").pack()
    Label(register_screen, text="").pack()
    username_lable = Label(register_screen, text="Username * ")
    username_lable.pack()
    username_entry = Entry(register_screen, textvariable=username)
    username_entry.pack()
    password_lable = Label(register_screen, text="Password * ")
    password_lable.pack()
    password_entry = Entry(register_screen, textvariable=password, show='*')
    password_entry.pack()
    salt_lable = Label(register_screen, text="Salt * ")
    salt_lable.pack()
    salt_entry = Entry(register_screen, textvariable=salt)
    salt_entry.pack()
    Label(register_screen, text="").pack()
    Button(register_screen, text="Register", width=10, height=1, bg="blue", command=register_user).pack()


# Designing window for login

def login():
    global login_screen
    login_screen = Toplevel(main_screen)
    login_screen.title("Login")
    login_screen.geometry("300x250")
    Label(login_screen, text="Please enter details below to login").pack()
    Label(login_screen, text="").pack()

    global username_verify
    global password_verify

    username_verify = StringVar()
    password_verify = StringVar()

    global username_login_entry
    global password_login_entry

    Label(login_screen, text="Username * ").pack()
    username_login_entry = Entry(login_screen, textvariable=username_verify)
    username_login_entry.pack()
    Label(login_screen, text="").pack()
    Label(login_screen, text="Password * ").pack()
    password_login_entry = Entry(login_screen, textvariable=password_verify, show='*')
    password_login_entry.pack()
    Label(login_screen, text="").pack()
    Button(login_screen, text="Login", width=10, height=1, command=login_verify).pack()


# Implementing event on register button

def register_user():
    username_info = username.get()
    password_info = password.get()
    salt_info = salt.get()
    salted = (password_info+salt_info)
    hashed = hashlib.sha256(salted.encode()).hexdigest()


    conn = sqlite3.connect('users.db')
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS user (Username TEXT, Password TEXT, Salt TEXT)')
    c.execute('INSERT INTO user (Username, Password, salt) VALUES(?,?,?)', (username_info, password_info, salted))
    conn.commit()
    conn.close()

    username_entry.delete(0, END)
    password_entry.delete(0, END)

    Label(register_screen, text="Registration Success", fg="green", font=("Calibri", 11)).pack()


# Implementing event on login button

def login_verify():
    username1 = username_verify.get()
    password1 = password_verify.get()
    username_login_entry.delete(0, END)
    password_login_entry.delete(0, END)


    conn = sqlite3.connect('users.db')
    c = conn.cursor()
    c.execute("SELECT * FROM user WHERE Username='%s' AND Password='%s'" % (username1, password1))
    print(c.fetchone())

# Designing popup for login success

def login_sucess():
    global login_success_screen
    login_success_screen = Toplevel(login_screen)
    login_success_screen.title("Success")
    login_success_screen.geometry("150x100")
    Label(login_success_screen, text="Login Success").pack()
    Button(login_success_screen, text="OK", command=delete_login_success).pack()


# Designing popup for login invalid password

def password_not_recognised():
    global password_not_recog_screen
    password_not_recog_screen = Toplevel(login_screen)
    password_not_recog_screen.title("Success")
    password_not_recog_screen.geometry("150x100")
    Label(password_not_recog_screen, text="Invalid Password ").pack()
    Button(password_not_recog_screen, text="OK", command=delete_password_not_recognised).pack()


# Designing popup for user not found

def user_not_found():
    global user_not_found_screen
    user_not_found_screen = Toplevel(login_screen)
    user_not_found_screen.title("Success")
    user_not_found_screen.geometry("150x100")
    Label(user_not_found_screen, text="User Not Found").pack()
    Button(user_not_found_screen, text="OK", command=delete_user_not_found_screen).pack()


# Deleting popups

def delete_login_success():
    login_success_screen.destroy()


def delete_password_not_recognised():
    password_not_recog_screen.destroy()


def delete_user_not_found_screen():
    user_not_found_screen.destroy()


# Designing Main(first) window

def main_account_screen():
    global main_screen
    main_screen = Tk()
    main_screen.geometry("300x250")
    main_screen.title("Account Login")
    Label(text="Select Your Choice", bg="blue", width="300", height="2", font=("Calibri", 13)).pack()
    Label(text="").pack()
    Button(text="Login", height="2", width="30", command=login).pack()
    Label(text="").pack()
    Button(text="Register", height="2", width="30", command=register).pack()

    main_screen.mainloop()


main_account_screen()

С этим кодом это работает, но я хочу удалить пароль из БД, а также соленый пароль и сохранить только хешированный пароль и соль так: имя пользователя; соль ; хешированный пароль Теперь мой вопрос: когда я войду в систему, как мне сделать это, чтобы сравнить хешированный пароль и введенный пароль? Я думал, найти имя пользователя в db> восстановить соль из db> добавить его в пароль введите> сравнить его с хешированным паролем. Или я должен добавить поле «введите соль» в окне входа в систему?

Я изменил 2 блока кода на это:

def register_user():
    username_info = username.get()
    password_info = password.get()
    salt_info = salt.get()
    salted = (password_info+salt_info)
    hashed = hashlib.sha256(salted.encode()).hexdigest()


    conn = sqlite3.connect('users.db')
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS user (Username TEXT, Salt TEXT, Hashed TEXT)')
    c.execute('INSERT INTO user (Username, Salt, Hashed) VALUES(?,?,?)', (username_info, salt_info, hashed))
    conn.commit()
    conn.close()

def login_verify():
    username1 = username_verify.get()
    password1 = password_verify.get()
    username_login_entry.delete(0, END)
    password_login_entry.delete(0, END)


    conn = sqlite3.connect('users.db')
    c = conn.cursor()
    c.execute("SELECT * FROM user WHERE Username='%s' AND Hashed='%s'" % (username1, password1))
    print(c.fetchone())

1 Ответ

0 голосов
/ 02 февраля 2020

Я голосую, чтобы получить соль из базы данных:)

База данных должна иметь соль и хешированный пароль. Лучший совет, который я могу найти о том, как это сделать, это здесь

Мне особенно нравится эта часть:

"Использовать ненулевой столбец существующих действительных данных для построить свою соль (зашифрованная строка имени пользователя blowfi sh, основанная на секретном ключе шифрования, обычно криптографически безопасна). Не используйте отдельный столбец для соли. Если вы не можете использовать существующий столбец, включите свою соль в ту же столбец, чем ваш ха sh. Например, используйте первые 32 символа для вашей 128-битной соли, а затем последние 40 символов для вашей 160-битной га sh. "

...