I made code for signing in users and storing data about them. Everything is fully encrypted and secure also, it is meant to be imported into other code. I'm looking for ways to improve it and to fix any bugs people might find.
import pickle
import base64
class user():
def __init__(self, username, password, user_data):
self.username = username
self.password = password
self.user_data = user_data
def get_user():
try:
user_saves = open("users", 'rb')
users = dict(pickle.load(user_saves))
user_saves.close
name, password, users = sign_in(users)
except:
name, password, users = new_user(True)
name = base64.b64decode(name.decode('utf-8'))
password = base64.b64decode(password.decode('utf-8'))
return name, password, users
def new_user(is_first = False, users=None):
print('Creating account... ')
if users != None:
loop = True
while loop:
name = input('What is your username: ')
name = base64.b64encode(name.encode('utf-8'))
if name in users:
print('Already taken.')
else:
loop = False
password = input('What is your password: ')
password = base64.b64encode(password.encode('utf-8'))
else:
name = input('What is your username: ')
name = base64.b64encode(name.encode('utf-8'))
password = input('What is your password: ')
password = base64.b64encode(password.encode('utf-8'))
if is_first == True:
user = {name:password}
user_saves = open("users", 'wb')
pickle.dump(user, user_saves)
add_user_data('', password, True)
return name, password, user
else:
add_user_data('', password)
users.update({name:password})
user_saves = open("users", 'wb')
pickle.dump(users, user_saves)
return name, password, users
user_saves.close
def sign_in(users):
nsi = True #not signed in
while nsi == True:
username = input('What is your username: ')
username = base64.b64encode(username.encode('utf-8'))
if username in users:
password = input('What is your password: ')
password = base64.b64encode(password.encode('utf-8'))
if password == users.get(username):
print('working')
nsi = False
return username, password
else:
print('Wrong password.')
else:
yn = y_or_n('y or n, are you a new user: ')
if yn == True:
nsi = False
name, password = new_user(users=users)
return name, password
def y_or_n(promt):
ni = True #no input
while ni:
yn = input(promt).lower()
if yn == 'y':
return True
elif yn == 'n':
return False
else:
print('y or n')
def add_user_data(data, password, is_first=False):
password = base64.b64encode(password.encode('utf-8'))
data = base64.b64encode(data.encode('utf-8'))
if is_first == True:
user_data = {password:data}
users_data = open("users_data", 'wb')
pickle.dump(user_data, users_data)
else:
user_data.update({password:data})
users_data = open("users_data", 'wb')
pickle.dump(user_data, users_data)
users_data.close
def get_user_data(password):
password = base64.b64encode(password.encode('utf-8'))
user_data = pickle.load('user_data')
user_data = base64.b64decode(user_data.decode('utf-8'))
return user_data
def delete_user(name, data, ):
data.pop('name', None)
name, password, users = get_user()
data = get_user_data(password)
print(data)
user_stats = user(name, password, data)
1 Answer 1
Security
Everything is fully encrypted and secure
Oh, really? I hope that you aren't confusing encoding with encryption. I don't see any encryption taking place.
This is a huge topic, so you have some reading to do - but the bar for 'secure password store' is significantly above where this program currently resides.
Class syntax
This:
class user():
should be
class User:
Also, you're currently using it as a struct with no methods. That should change - you should move some of your code to be methods on that class.
Break
This:
loop = True
while loop:
should be reworked. You can use a while True
, and replace the loop = False
with a break
at the end of that if
block.
File handles
Rather than explicitly closing your files, you should usually use them in a with
block. Also, this:
user_saves.close
doesn't do what you think it does; in fact it does nothing. For the function call to occur, you need to add ()
.
Redundant else
This:
return name, password, user
else:
doesn't need an else
, because you've returned in the previous block.
Write a main
method
...to pull this code out of global scope:
name, password, users = get_user()
data = get_user_data(password)
print(data)
user_stats = user(name, password, data)
Explore related questions
See similar questions with these tags.