Python-我如何避免b"\";在文本文件中使用“写入”;wb";导致线路中断?

Python-我如何避免b"\";在文本文件中使用“写入”;wb";导致线路中断?,python,Python,我的情况如下: # Small hashing script example import hashlib import os def original_pass(Password): salt = os.urandom(64) hashed = hashlib.pbkdf2_hmac("sha512", Password.encode(), salt, 300000, dklen = 124) with open("Hash.txt", "wb") as file:

我的情况如下:

# Small hashing script example
import hashlib
import os

def original_pass(Password):
    salt = os.urandom(64)
    hashed = hashlib.pbkdf2_hmac("sha512", Password.encode(), salt, 300000, dklen = 124)
    with open("Hash.txt", "wb") as file:
        file.write(salt + b"\n" + hashed)
        file.close()

def check_pass(New_Pass):
    with open("Hash.txt", "rb") as file:
            f = file.readlines()
            print (f)
            check_hash = hashlib.pbkdf2_hmac("sha512", New_Pass.encode(), f[0].strip(b"\n"), 300000, dklen = 124)   
            file.close()     
    if check_hash == f[1]:
        return True
    else:
        return False

original_pass("Password")
print (check_pass("Password"))
我的问题是,哈希偶尔会包含\n之类的字符。例如b“x004\n4\no5”。此行被拆分为b“x004\n”,b“4\no5”。当我试图阅读盐之类的东西时,这会导致错误,因为它可能被分成多个部分。有没有办法避免它被这样读,或者只是阻止它那样写

解决重复的备注


我在这里专门处理字节字符串,而不是常规字符串。两者都是不同的数据类型,在python 3(我正在使用的版本)中更是如此,如下所示:。这种区别意味着某些字符串方法,如.encode()不能处理字节字符串。因此,在我处理的数据类型和操作方式等方面存在明显差异。

基于@Blckknght注释,使用固定长度salt知识编写代码:

import hashlib
import os

SALT_LEN = 64

def hash(password,salt):
    return hashlib.pbkdf2_hmac('sha512',password.encode(),salt,300000,dklen=124)

def original_pass(password):
    salt = os.urandom(SALT_LEN)
    hashed = hash(password,salt)    
    with open('hash.bin','wb') as file:
        file.write(salt + hashed)

def check_pass(password):
    with open('hash.bin','rb') as file:
        data = file.read()
    salt,hashed = data[:SALT_LEN],data[SALT_LEN:]
    check_hash = hash(password,salt)    
    return check_hash == hashed

original_pass('Password')
print(check_pass('Password'))

无论如何,为什么要在换行符上拆分?可以在不使用
b'\n'
byte-base64的表示形式中对哈希进行编码,例如,您可以停止使用换行符来确定每个哈希的结束位置。在二进制文件中,逐行读取的可能重复项没有意义。您创建的salt是固定长度的,因此您根本不需要换行分隔符。只需读取前64个字节作为salt,其余作为hash。