Python ASCII控制字符28、29、30和31

Python ASCII控制字符28、29、30和31,python,utf-8,ascii,Python,Utf 8,Ascii,我正在为学校的一个项目创建一个简单的数据库风格的程序,我正在使用一个简单的哈希和salt算法来存储密码。我想使用单位分隔符和记录分隔符ASCII代码来分隔数据库中的属性和记录,但在Python中找不到任何关于它们的内容。以下是我目前的代码: import os import hashlib import sys users = {} def new_user(): while True: username = str(input('Please Enter Your

我正在为学校的一个项目创建一个简单的数据库风格的程序,我正在使用一个简单的哈希和salt算法来存储密码。我想使用单位分隔符和记录分隔符ASCII代码来分隔数据库中的属性和记录,但在Python中找不到任何关于它们的内容。以下是我目前的代码:

import os
import hashlib
import sys

users = {}

def new_user():
    while True:
        username = str(input('Please Enter Your Desired Username > '))
        if username in users.keys():
            print('Username already exists, please try again')
        else:
            break
    while True:
        password = str(input('Please Enter a Password Longer than 5 Characters > '))
        if len(password) < 6:
            print('Too Short, Try Again')
        else:
            break
    password = str.encode(password)
    salt = os.urandom(256)
    hashed = hashlib.sha256(password+salt).hexdigest()
    new = {'username' : username,
           'password' : hashed,
           'salt' : salt }
    users[username] = new
    towrite = new['username']+'\x1f'+new['password']+'\x1f'+str(new['salt'])+'\x1e'
    with open('users.txt', 'a') as userfile:
        userfile.write(towrite)
    print('New User Created: Welcome %s' % username)
    return()

def login():
    while True:
        with open('users.txt', 'r') as userfile:
            users = userfile.read().split('\x1e')
            for user in users:
                user = user.split('\x1f')
        username = str(input('Please Enter Your Username > '))
        password = str(input('Please Enter Your Password > '))
        salt = user[2]
        password = hashlib.sha256(password + salt).hexdigest()
        for user in users:
            if (username == user[0]) and (password == user[1]):
                print('You\'re In!')
                return()
        print('Invalid Username or Password')

while True:
    choice = str(input('Continue Adding? > '))
    if choice == 'n':
        break
    else:
        new_user()

while True:
    choice = str(input('Continue Logging? > '))
    if choice == 'n':
        break
    else:
        login()
导入操作系统
导入hashlib
导入系统
用户={}
def new_user():
尽管如此:
username=str(输入('请输入所需的用户名>'))
如果users.keys()中的用户名为:
打印('用户名已存在,请重试')
其他:
打破
尽管如此:
password=str(输入('请输入超过5个字符的密码>'))
如果len(密码)<6:
打印('太短,请重试')
其他:
打破
密码=str.encode(密码)
salt=os.urandom(256)
hashed=hashlib.sha256(密码+salt).hexdigest()
new={'username':用户名,
“密码”:散列,
“salt”:salt}
用户[用户名]=新建
towrite=new['username']+'\x1f'+new['password']+'\x1f'+str(new['salt'])+'\x1e'
打开('users.txt','a')作为用户文件:
userfile.write(towrite)
打印('创建的新用户:欢迎%s'%username)
返回()
def login():
尽管如此:
以open('users.txt','r')作为用户文件:
users=userfile.read().split('\x1e')
对于用户中的用户:
user=user.split('\x1f')
username=str(输入('请输入您的用户名>'))
password=str(输入('请输入您的密码>'))
盐=用户[2]
password=hashlib.sha256(password+salt).hexdigest()
对于用户中的用户:
如果(用户名==用户[0])和(密码==用户[1]):
打印('你在!')
返回()
打印('无效的用户名或密码')
尽管如此:
choice=str(输入('继续添加?>'))
如果选项=='n':
打破
其他:
新用户()
尽管如此:
choice=str(输入('Continue Logging?>'))
如果选项=='n':
打破
其他:
登录()

这里的问题是,当在new_user()函数中加入属性时,写入文件的字符串不包含“\x1e”或“\x1f”。如何修复此问题或以其他方式实现这些控制代码?

使用控制字符作为分隔符是从一个更简单、更原始的时代开始的。尝试以不同的方式将字段分开。另外,以二进制模式打开文件可能会解决您的问题。您有何建议?使用其他字符可能会很尴尬,因为它们可能包含在用户名中,甚至包含在salt的字符串表示中。由于这是一个学校项目,因此可能适合使用简单而原始的方案。任何取代它的东西都可能更加复杂。如果我打开(“myfile.txt”,“w”).write('\x1f'),然后hextump文件,我看到:
68 65 6c 6c 6f 1f 74 68 65 72 65
,那么你确定你的输出不包含控制字符吗?@AlastairMcCormack:或者存储哈希的十六进制或base64编码。。