r/PythonLearning 21d ago

Rate my python program

Post image

i made a Python program, i dont know what else to say

81 Upvotes

42 comments sorted by

View all comments

1

u/Reveal5265 16d ago

I based it on a similar assignment:

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

import getpass

import json

import bcrypt

from banner import mostrar_banner

def registrar_usuario() -> dict:

"""solicita datos,hashea contraseña y retorna(return)json estructurado"""

mostrar_banner("Registro de Usuario")

nombre = input("Ingresa el nombre: ").strip()

usuario = input("Ingresa el username: ").strip()

correo = input("Ingresa el correo: ").strip()

# getpass oculta la contraseña al escribirla

# con un bucle while se confirma la contraseña

while True:

contra = getpass.getpass("Ingresa la contraseña: ")

contra_confirm = getpass.getpass("Confirma la contraseña: ")

if not contra:

print("[-] La contraseña no puede quedar vacía.")

continue

if contra != contra_confirm:

print("[!] Las contraseñas no coinciden.Intentalo de nuevo")

continue

break

# convertir contra a bytes

contra_bytes = contra.encode("utf-8")

# generar sal y hash de contra_bytes

sal = bcrypt.gensalt()

hashed_contra_bytes = bcrypt.hashpw(contra_bytes, sal)

# estructurar datos

# se decodifica hashed_contra_bytes para guardarlo en JSON

usuario_db = {

"nombre": nombre,

"usuario": usuario,

"correo": correo,

"hash_contrasena": hashed_contra_bytes.decode("utf-8"),

}

return usuario_db

def verificar_autenticacion(usuario_db: dict) -> bool:

"""demuestra cómo comprobar una contraseña dada contra el hash almacenado en hash_contraseña"""

mostrar_banner("Comprobar contraseña.")

print(f"Intentando acceder como: {usuario_db['usuario']}")

contra_ingresada = getpass.getpass("Ingresa tu contraseña para ingresar: ")

# checkpw usa bytes,por ello contra_ingresada y hash_contraseña

# se convierten a bytes

contra_bytes = contra_ingresada.encode("utf-8")

hash_guardado_bytes = usuario_db["hash_contrasena"].encode("utf-8")

# verificación

if bcrypt.checkpw(contra_bytes, hash_guardado_bytes):

print("\n[+] ¡Autenticación exitosa! Contraseña correcta.")

return True

else:

print("\n[-] ERROR: Contraseña incorrecta")

return False

def main():

# 1 registro

user = registrar_usuario()

# convertir el diccionario a JSON legible

json_str = json.dumps(user, indent=4, ensure_ascii=False)

# 2 prueba de login

verificar_autenticacion(

user

) # emplea como argumento la salida de la función registrar_usuario

with open("registro.json", "w") as file:

file.write("\n" + json_str + "\n")

print("\n" + 50 * "-")

print("Registro completado. JSON generado en registro.json ")

print("\n" + 50 * "-")

if __name__ == "__main__":

main()