5
\$\begingroup\$

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)
200_success
145k22 gold badges190 silver badges478 bronze badges
asked Mar 28, 2019 at 2:06
\$\endgroup\$

1 Answer 1

4
\$\begingroup\$

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)
answered Mar 28, 2019 at 3:21
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.