@SANTIK_YT

Хэш и соль пароля в файл?

Я уже сделал гениратор хэша и соли и запись в документ нужно теперь проверить с документа хэш и пароль который вводили, переменную с хэшем(Имменно с тем который в файле.) не могу сделать не знаю как.
Code:
from tkinter import *
from tkinter import messagebox
import tkinter as tk
import pickle
import hashlib, uuid

root = Tk()
root.geometry("300x300")
# root.geometry("300x500")
root.title("Login panel")
root.resizable(width=False, height=False)
Tag1 = Label(text="Login Panel By SANTIK", fg='#0c0')
Tag1.pack()


SEPARATOR = "&"
# generate hash string with salt
def gen_hash(pwd, salt):
    return hashlib.sha512((pwd + salt).encode('utf-8')).hexdigest()

# generage hash password string (for safe to file)
def gen_pw_string(pwd):
    salt = uuid.uuid4().hex
    return salt + SEPARATOR + gen_hash(pwd, salt)

# parse hash password string, split it by salt and password hash
def parse_pw_string(pwstring):
    return pwstring.split(SEPARATOR)

# check password by its password hash string
def check_pwd(pwd, pwstring):
    salt, _pwhash = parse_pw_string(pwstring)
    pwhash = gen_hash(pwd, salt)
    return pwhash == _pwhash

def registration():
    reg_win = Toplevel(root)
    reg_win.geometry("300x300")
    reg_win.title("Login panel")
    reg_win.resizable(width=False, height=False)
    Tag2 = Label(reg_win, text="Login Panel By SANTIK", fg='#0c0')
    text_log = Label(reg_win,text="Введите ваш логин:")
    registr_login = Entry(reg_win, )
    text_password1 = Label(reg_win, text="Введите ваш пароль:")
    registr_password1 = Entry(reg_win, )
    text_password2 = Label(reg_win, text="Подтвердите пароль:")
    registr_password2 = Entry(reg_win, show="")
    button_registr = Button(reg_win, text="Зарегестрироваться!", command=lambda: save())
    text_log1 = Label(reg_win, text="Пароли не совпадают!", fg='#f00')
    text_ntv = Label(reg_win, text="Поля не могут быть пустыми!", fg='#f00')
    Tag2.pack()
    text_log.pack()
    registr_login.pack()
    text_password1.pack()
    registr_password1.pack()
    text_password2.pack()
    registr_password2.pack()
    button_registr.pack()
    def des_but(object):
        object.config(state='disabled')
    def save():
        if registr_password2.get() == "":
            text_log1.place(relx=-5, rely=0)
            text_ntv.pack()
        elif registr_password1.get() == "":
            text_log1.place(relx=-5, rely=0)
            text_ntv.pack()
        elif registr_login.get() == "":
            text_log1.place(relx=-5, rely=0)
            text_ntv.pack()
        else:
            if registr_password2.get() == registr_password1.get():
                des_but(button_registr)
                des_but(button_reg)
                text_log1.destroy()
                text_ntv.destroy()
                text_log = Label(reg_win, text="Поздравляем! Теперь вы можите закрыть это окно!")
                text_log.pack()
                login_pass_save = {}
                pwd1 = registr_login.get()
                pwd2 = registr_password1.get()
                pwstring1 = gen_pw_string(pwd1)
                pwstring2 = gen_pw_string(pwd2)
                print(pwd1, pwstring1)
                print(pwd2, pwstring2)
                print(check_pwd(pwd1, pwstring1))
                print(check_pwd(pwd2, pwstring2))
                login_pass_save[pwstring1]=pwstring2
                f = open("login.txt", "wb")
                pickle.dump(login_pass_save, f)
                f.close()
            else:
                text_ntv.place(relx=-5, rely=0)
                text_log1.pack()


def login():
    log_win = Toplevel(root)
    log_win.geometry("300x300")
    log_win.title("Login panel")
    log_win.resizable(width=False, height=False)
    Tag3 = Label(log_win, text="Login Panel By SANTIK", fg='#0c0')
    text_enter_login = Label(log_win, text="Введите ваш логин:")
    enter_login = Entry(log_win, )
    text_enter_pass = Label(log_win, text="Введите ваш пароль:")
    enter_password= Entry(log_win, show="*")
    button_enter = Button(log_win, text='Войти', command=lambda: log_pass())
    Tag3.pack()
    text_enter_login.pack()
    enter_login.pack()
    text_enter_pass.pack()
    enter_password.pack()
    button_enter.pack()
    def toggle_password():
        if enter_password.cget('show') == '':
            enter_password.config(show='*')
            toggle_btn.config(text='Показать пароль')
        else:
            enter_password.config(show='')
            toggle_btn.config(text='Спрятать пароль')
    toggle_btn = tk.Button(log_win, text='Показать пароль', width=20, command=toggle_password)
    toggle_btn.pack

    def log_pass():
        f = open("login.txt", "rb")
        a = pickle.load(f)
        f.close()
        pwd1 = enter_login.get()
        pwd2 = enter_password.get()
        pwstring1 = gen_pw_string(pwd1)
        pwstring2 = gen_pw_string(pwd2)
        print(pwd1, pwstring1)
        print(pwd2, pwstring2)
        print(check_pwd(pwd1, pwstring1))
        print(check_pwd(pwd2, pwstring2))
        if check_pwd(enter_login.get(), pwstring1) == ("True"):
            if check_pwd(enter_password.get(), pwstring2) == ("True"):
                messagebox.showinfo("Вход выполнен!","Вход успешный! Поздравляю!")
            else:
                messagebox.showerror("Ошибка входа!", "Логин или пароль не верный! Проверте их на наличие ошибки!")
        else:
            messagebox.showerror("Ошибка входа!","Логин или пароль не верный! Проверте их на наличие ошибки!")



button_reg = Button(root, height=10, width=18, text="Зарегистрироваться!", command=registration)
button_reg.place(x=5, y=50)
button_log = Button(root, height=10, width=18, text="Войти!", command=login)
button_log.place(x=150, y=50)


root.mainloop()
  • Вопрос задан
  • 304 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
1. Читаешь из файла соль и хэш пароля.
2. К введенному паролю добавляешь соль (так же, как она была добавлена к сохранённому) и хэшируешь.
3. Сравниваешь два хэша - полученный и прочитанный. Если они совпали, пароль верен.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы