GUI para generar y almacenar contraseñas en SQLite usando Python

En este siglo hay muchas cuentas de redes sociales, sitios web o cualquier cuenta en línea que necesita una contraseña segura. A menudo usamos la misma contraseña para varias cuentas y el inconveniente básico es que si alguien llega a conocer su contraseña, tendrá acceso a todas sus cuentas. Es difícil recordar todas las contraseñas distintas. Podemos lograrlo creando un programa GUI simple usando python , Tkinter y SQLite

Esta aplicación generará una contraseña basada en la longitud deseada dada como entrada por el usuario. También guardará la contraseña junto con la cuenta user_id y el nombre del sitio en una base de datos. Incluso puede actualizar su contraseña o nombre de usuario anterior. 

Empezando

El usuario especificará la longitud de la contraseña que desea generar. El programa generará una string aleatoria de la longitud especificada utilizando la función aleatoria. El usuario proporcionará los detalles de la ID de usuario y el nombre del sitio asociado con la cuenta, y presionará el botón Guardar en la base de datos, lo que activará la función de inserción() del archivo backend.py que se proporciona en la última parte de este artículo. Por lo tanto, guardar los datos en la base de datos sin escribir ningún comando SQL. 

Módulos utilizados:

  • navegador web : este módulo se utiliza para mostrar el archivo help.txt en el bloc de notas.
  • Tkinter: Tkinter es GUI o paquete de interfaz gráfica de usuario en python. Se utiliza para crear aplicaciones GUI en python.
  • SQLite3: Sqlite es un motor de base de datos liviano y fácil de usar, que sigue una sintaxis similar a la de Postgres SQL. El módulo SQLite3 en python nos ayuda a ejecutar comandos SQL usando códigos de python.
  • ttkbootsrtap:  este módulo cambia la apariencia de la aplicación GUI. Es similar a bootstrap en el desarrollo web, que se utiliza para dar un aspecto prometedor a las páginas web. Este módulo se puede instalar de las siguientes maneras:

Sintaxis:

pip instalar ttkbootstrap

  • csv: Este módulo ayudará a guardar los datos de la base de datos en formato .csv, que luego se visualizarán en excel.

Sintaxis:

pip instalar python-csv

En primer lugar, se importan todos los módulos necesarios. Luego se inicializan 4 listas para representar alfabetos en minúsculas, mayúsculas y símbolos, dentro de la ventana de clase como variables de clase. Luego, todo el diseño de la aplicación se crea bajo la función __init__ para que todos estos objetos Tkinter se creen al momento de declarar un objeto de la ventana de clase. 

El paquete Ttkbootstrap le permite cambiar el estilo de los objetos de Tkinter, esto incluye todo lo que Tkinter tiene para ofrecer. Esto básicamente cambiará el tema de la aplicación. Viene con muchos temas incorporados ej. cyborg, oscuro, etc.  

Sintaxis con ttkbootstrap: 

win=Estilo.tema(‘nombre_tema’).maestro

Sintaxis anterior sin ttkbootstrap:

ganar =Tk()

Generador de contraseñas El generador de funciones() ejecuta un ciclo para la longitud de contraseña elegida /4. La longitud dada por el usuario siempre será múltiplo de 4 ya que esas son las únicas opciones que se dan en el menú desplegable. Con cada iteración, elija un carácter aleatorio de la variable de clase creada, utilizando una función aleatoria. ex. a0=random.choice(list_name). Después de elegir y almacenar los caracteres de 4 listas diferentes (variables de clase) en 4 variables de tipo de datos adecuado, concatene las 4 variables y almacene la suma en otra variable.

A continuación se muestra la implementación:

Programa: Ventana para generar contraseñas

Python3

import random
import webbrowser
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
import back
import csv
from ttkbootstrap import *
 
 
class window:
    # these are lists of initialized characters
    digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
     
     
    lc = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
          'm', 'n', 'o', 'p', 'q',
          'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
     
    uc = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
          'I', 'J', 'K', 'M', 'N', 'O', 'p', 'Q',
          'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
     
    sym = ['@', '#', '$', '%', '=', ':', '?', '.', '/', '|',
           '~', '>', '*', '<']
     
    def __init__(self, root, geo, title) -> None:
        self.root = root
        self.root.title(title)
        self.root.geometry(geo)
        self.root.resizable(width=False, height=False)
 
        Label(self.root, text='Your Password').grid(
            row=0, column=0, padx=10, pady=10)
        Label(self.root, text='Corresponding User_id').grid(
            row=1, column=0, padx=10, pady=10)
        Label(self.root, text='Of').grid(row=2, column=0, padx=10, pady=10)
        self.pa = StringVar()
        self.user_id = StringVar()
        self.site = StringVar()
        ttk.Entry(self.root, width=30, textvariable=self.pa
                 ).grid(row=0, column=1, padx=10, pady=10)
        ttk.Entry(self.root, width=30, textvariable=self.user_id
                 ).grid(row=1, column=1, padx=10, pady=10)
        ttk.Entry(self.root, width=30, textvariable=self.site
                 ).grid(row=2, column=1, padx=10, pady=10)
        self.length = StringVar()
 
        e = ttk.Combobox(self.root, values=['4', '8', '12', '16', '20', '24'],
                         textvariable=self.length)
        e.grid(row=0, column=2)
        e['state'] = 'readonly'
        self.length.set('Set password length')
 
        ttk.Button(self.root, text='Generate', padding=5,
                   style='success.Outline.TButton', width=20,
                   command=self.generate).grid(row=1, column=2)
         
        ttk.Button(self.root, text='Save to Database', style='success.TButton',
                   width=20, padding=5, command=self.save).grid(row=3, column=2)
         
        ttk.Button(self.root, text='Delete', width=20, style='danger.TButton',
                   padding=5, command=self.erase).grid(row=2, column=2)
         
        ttk.Button(self.root, text='Show All', width=20, padding=5,
                   command=self.view).grid(row=3, column=0)
         
        ttk.Button(self.root, text='Update', width=20, padding=5,
                   command=self.update).grid(row=3, column=1)
 
        # ========self.tree view=============
        self.tree = ttk.Treeview(self.root, height=5)
        self.tree['columns'] = ('site', 'user', 'pas')
        self.tree.column('#0', width=0, stretch=NO)
        self.tree.column('site', width=160, anchor=W)
        self.tree.column('user', width=140, anchor=W)
        self.tree.column('pas', width=180, anchor=W)
        self.tree.heading('#0', text='')
        self.tree.heading('site', text='Site name')
        self.tree.heading('user', text='User Id')
        self.tree.heading('pas', text='Password')
        self.tree.grid(row=4, column=0, columnspan=3, pady=10)
        self.tree.bind("<ButtonRelease-1>", self.catch)
        # this command will call the catch function
 
        # this is right click pop-up menu
        self.menu = Menu(self.root, tearoff=False)
        self.menu.add_command(label='Refresh', command=self.refresh)
        self.menu.add_command(label='Insert', command=self.save)
        self.menu.add_command(label='Update', command=self.update)
        self.menu.add_separator()
        self.menu.add_command(label='Show All', command=self.view)
        self.menu.add_command(label='Clear Fields', command=self.clear)
        self.menu.add_command(label='Clear Table', command=self.table)
        self.menu.add_command(label='Export', command=self.export)
        self.menu.add_separator()
        self.menu.add_command(label='Delete', command=self.erase)
        self.menu.add_command(label='Help', command=self.help)
        self.menu.add_separator()
        self.menu.add_command(label='Exit', command=self.root.quit)
        # this binds the button 3 of the mouse with
        self.root.bind("<Button-3>", self.poppin)
        # poppin function
 
    def help(self):
        # this function will open the help.txt in
        # notepad when called
        webbrowser.open('help.txt')
 
    def refresh(self):
        # this function basically refreshes the table
        # or tree view
        self.table()
        self.view()
 
    def table(self):
        # this function will clear all the values
        # displayed in the table
        for r in self.tree.get_children():
            self.tree.delete(r)
 
    def clear(self):
        # this function will clear all the entry
        # fields
        self.pa.set('')
        self.user_id.set('')
        self.site.set('')
 
    def poppin(self, e):
        # it triggers the right click pop-up menu
        self.menu.tk_popup(e.x_root, e.y_root)
 
    def catch(self, event):
        # this function will take all the selected data
        # from the table/ tree view and will fill up the
        # respective entry fields
        self.pa.set('')
        self.user_id.set('')
        self.site.set('')
        selected = self.tree.focus()
        value = self.tree.item(selected, 'value')
        self.site.set(value[0])
        self.user_id.set(value[1])
        self.pa.set(value[2])
 
    def update(self):
        # this function will update database with new
        # values given by the user
        selected = self.tree.focus()
        value = self.tree.item(selected, 'value')
        back.edit(self.site.get(), self.user_id.get(), self.pa.get())
        self.refresh()
 
    def view(self):
        # this will show all the data from the database
        # this is similar to "SELECT * FROM TABLE" sql
        # command
        if back.check() is False:
            messagebox.showerror('Attention Amigo!', 'Database is EMPTY!')
        else:
            for row in back.show():
                self.tree.insert(parent='', text='', index='end',
                                 values=(row[0], row[1], row[2]))
 
    def erase(self):
        # this will delete or remove the selected tuple or
        # row from the database
        selected = self.tree.focus()
        value = self.tree.item(selected, 'value')
        back.Del(value[2])
        self.refresh()
 
    def save(self):
        # this function will insert all the data into the
        # database
        back.enter(self.site.get(), self.user_id.get(), self.pa.get())
        self.tree.insert(parent='', index='end', text='',
                         values=(self.site.get(), self.user_id.get(), self.pa.get()))
 
    def generate(self):
        # this function will produce a random string which
        # will be used as password
        if self.length.get() == 'Set password length':
            messagebox.showerror('Attention!', "You forgot to SELECT")
        else:
            a = ''
            for x in range(int(int(self.length.get())/4)):
                a0 = random.choice(self.uc)
                a1 = random.choice(self.lc)
                a2 = random.choice(self.sym)
                a3 = random.choice(self.digits)
                a = a0+a1+a2+a3+a
                self.pa.set(a)
 
    def export(self):
        # this function will save all the data from the
        # database in a csv format which can be opened
        # in excel
        pop = Toplevel(self.root)
        pop.geometry('300x100')
        self.v = StringVar()
        Label(pop, text='Save File Name as').pack()
        ttk.Entry(pop, textvariable=self.v).pack()
        ttk.Button(pop, text='Save', width=18,
                   command=lambda: exp(self.v.get())).pack(pady=5)
 
        def exp(x):
            with open(x + '.csv', 'w', newline='') as f:
                chompa = csv.writer(f, dialect='excel')
                for r in back.show():
                    chompa.writerow(r)
            messagebox.showinfo("File Saved", "Saved as " + x + ".csv")
 
 
if __name__ == '__main__':
    win = Style(theme='darkly').master
    name = 'Password Generator'
    dimension = '565x320'
 
    app = window(win, dimension, name)
    win.mainloop()

Programa backend usando SQLite: El módulo Sqlite3 de python nos permite ejecutar comandos sol usando Python. La siguiente es la sintaxis

  • Hará una conexión con el archivo de la base de datos SQLite.

con=sqlite3.connect(‘base de datos.db’)  

  • Cursor para el recorrido del conjunto de datos

c=con.cursor() 

  • Para ejecutar los comandos SQL

c.ejecutar(“código SQL”) 

  • Confirmar o guardar los cambios realizados

conn.commit() 

  • Esto para cerrar la conexión creada con el archivo de base de datos SQLite

conn.cerrar() 

Nota: Aquí la contraseña se toma como clave principal. Entonces, para cambiar la contraseña, debe insertar la nueva y eliminar la anterior de la base de datos.

Programa: Programa backend usando SQLite:

Python3

import sqlite3 as sq
 
 
db = 'secure.db'
 
 
def connect():
   
    # used to connect to the secure.db database
    conn = sq.connect(db)
     
    # defined a cursor to retrieve one data/tuple at
    # a time
    c = conn.cursor()
     
    # execute will execute the entire sql command as
    # it is
    c.execute("""
                 CREATE TABLE IF NOT EXISTS data (
                     site text,
                     user text,
                     password text primary key
 
                 )             
    """)
     
     
    # to commit the sql command, it will commit the
    # current transaction or
    conn.commit()
    conn.close()
 
 
def enter(site, user, pas):
    conn = sq.connect(db)
    c = conn.cursor()
    c.execute("INSERT INTO data VALUES(?,?,?)", (site, user, pas))
    conn.commit()
    conn.close()
 
 
def show():
    conn = sq.connect(db)
    c = conn.cursor()
    c.execute("SELECT * FROM data")
     
    # this will store all the data from the table to
    # the variable i in the form of 2d list
    i = c.fetchall()
    conn.commit()
    conn.close()
    return i
 
 
def Del(password):
    conn = sq.connect(db)
    c = conn.cursor()
    c.execute("DELETE FROM data WHERE password=(?)", (password,))
    conn.commit()
    conn.close()
 
 
def edit(site, user, password):
    conn = sq.connect(db)
    c = conn.cursor()
    c.execute("UPDATE data SET site=?, user=(?) WHERE password=(?) ",
              (site, user, password))
    conn.commit()
    conn.close()
 
 
def check():
    # this function will check whether the database
    # is empty or not
    if len(show()) == 0:
        return False
    else:
        return True
 
# calling the connect function to create a table and
# database if it doesn't exists
connect()

Salida :

Publicación traducida automáticamente

Artículo escrito por rajarshiban13 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *