python实现模拟身份验证服务器综合系统设计

2023年4月8日08:05:11

完成一个 Python 程序,实现密码存储和验证,用于模拟身份验证服务器,以便破解数据库的对手无法获得用户的明文密码。实现基本的注册和登录功能。

测试样例如下:

input

R
timerring
i love cryptography
L
timerring
i love cryptography
L
timerring
i love cipher
L
Who
i love cryptography
Q

该系统的源码如下:

source code

from __future__ import annotations
from typing import Dict
import getpass
import hashlib
import os

database: Dict[str, UserPassword] = dict()


class UserPassword:
    def __init__(self, in_username, in_password_hash, in_salt):
        self.username: str = in_username
        self.password_hash: bytes = in_password_hash
        self.salt: bytes = in_salt
        self.method: str = 'scrypt'

    # define verify_password function
    def verify_password(self, password: str) -> bool:
        password_ver: bytes = password.encode("utf-8")
        # use the same salt
        salt_ver: bytes = self.salt
        # set corresponding parameters
        n: int = 4
        r: int = 8
        p: int = 16
        password_hash_ver: bytes = hashlib.scrypt(password_ver, salt=salt_ver, n=n, r=r, p=p)
        # verify the hash value of the password
        if password_hash_ver == self.password_hash:
            return True
        else:
            return False


def database_add_item(user: UserPassword) -> None:
    if user.username in database:
        raise Exception('User {} already exists.'.format(user.username))
    database[user.username] = user


def login_user(username: str, password_plaintext: str) -> bool:
    if username not in database:
        raise Exception('User {} does not exist.'.format(username))
    return database[username].verify_password(password_plaintext)


def register_user(username: str, password_plaintext: str) -> None:
    password_bytes: bytes = password_plaintext.encode("utf-8")
    # The os.urandom function is used to obtain random bytes of a specified length
    # generate the salt bytes
    salt_bytes: bytes = os.urandom(64)
    # set corresponding parameters
    n: int = 4
    r: int = 8
    p: int = 16
    # Hash encryption
    password_hash: bytes = hashlib.scrypt(password_bytes, salt=salt_bytes, n=n, r=r, p=p)
    # construct instance object
    User: UserPassword = UserPassword(username, password_hash, salt_bytes)
    # Add to database
    database_add_item(User)


if __name__ == '__main__':
    while True:
        try:
            print('Usage:')
            print('\tR - register a new user')
            print('\tL - login with an existing user')
            print('\tQ - exit')
            print('')
            command: str = input('Input command:')
            if command == 'Q':
                exit(0)
            elif command == 'R' or command == 'L':
                username: str = input('Input username:')
                # password: str = getpass.getpass('Input password:') # will not work properly for PyCharm, IDLE, etc.
                password: str = input('Input password:')
                if command == 'R':
                    register_user(username, password)
                    print('User created successfully.')
                elif command == 'L':
                    login_valid: bool = login_user(username, password)
                    if login_valid:
                        print('User logged in successfully.')
                    else:
                        print('Password verification failed. Can not logged in.')
                else:
                    assert False
            else:
                raise Exception('Invalid command.')
        except Exception as e:
            print('Error: {}'.format(e))

output

Usage:
	R - register a new user
	L - login with an existing user
	Q - exit

Input command:R
Input username:timerring
Input password:i love cryptography
User created successfully.
Usage:
	R - register a new user
	L - login with an existing user
	Q - exit

Input command:L
Input username:timerring
Input password:i love cryptography
User logged in successfully.
Usage:
	R - register a new user
	L - login with an existing user
	Q - exit

Input command:L
Input username:timerring
Input password:i love cipher
Password verification failed. Can not logged in.
Usage:
	R - register a new user
	L - login with an existing user
	Q - exit

Input command:L
Input username:Who
Input password:i love cryptography
Error: User Who does not exist.
Usage:
	R - register a new user
	L - login with an existing user
	Q - exit

Input command:Q

进程已结束,退出代码为 0

由输出可知,系统功能一切正常。

受于文本篇幅原因,本文相关算法实现工程例如环境及相关库,无法展示出来,现已将资源上传,可自行点击下方链接下载。

python实现模拟身份验证服务器综合系统工程文件

  • 作者:timerring
  • 原文链接:https://timerring.blog.csdn.net/article/details/125696545
    更新时间:2023年4月8日08:05:11 ,共 3262 字。