Python 3.x 在Python3中有没有一种方法,只有在文件中转储数据的用户帐户才有权加载json内容

Python 3.x 在Python3中有没有一种方法,只有在文件中转储数据的用户帐户才有权加载json内容,python-3.x,Python 3.x,我试图通过在一个文件中转储编码的用户名和密码(json格式)来存储凭据,稍后我想使用该文件加载json内容 我能够成功地做到这一点,但我想知道在Python3中是否有一种方法,只有创建了文件并转储了json的用户帐户才能加载数据 我使用cryptography.fernet导入fernet对数据进行加密。 使用json.dump和json.load转储和提取凭据 from cryptography.fernet import Fernet key = Fernet.generate_key()

我试图通过在一个文件中转储编码的用户名和密码(json格式)来存储凭据,稍后我想使用该文件加载json内容

我能够成功地做到这一点,但我想知道在Python3中是否有一种方法,只有创建了文件并转储了json的用户帐户才能加载数据

我使用cryptography.fernet导入fernet对数据进行加密。 使用json.dump和json.load转储和提取凭据

from cryptography.fernet import Fernet
key = Fernet.generate_key()
f = Fernet(key)
UsernameByte = username.encode()
EncryptedUsername = f.encrypt(UsernameByte)

PasswordByte = password.encode()
EncryptedPassword = f.encrypt(PasswordByte)
a = EncryptedUsername.decode("utf-8")
b = EncryptedPassword.decode("utf-8")
c = key.decode("utf-8")

DecryptedUsername = f.decrypt(EncryptedUsername)
DecryptedPassword = f.decrypt(EncryptedPassword)
data = {'Username':a , 'Password':b , 'key':c}
with open("C:\test.txt", 'w') as fp:
    json.dump(data, fp)


    with open("C:\test.txt") as fp:
        data = json.load(fp)
    EncryptedUsername = data['Username'].encode()
    EncryptedPassword = data['Password'].encode()
    key = data['key'].encode()

    f = Fernet(key)
    DecryptedUsernameByte = f.decrypt(EncryptedUsername)
    DecryptedPasswordByte = f.decrypt(EncryptedPassword)

    DecryptedUsername = DecryptedUsernameByte.decode()
    DecryptedPassword = DecryptedPasswordByte.decode()

Python有os模块来处理文件和目录。 您可以管理刚刚创建的文件的权限和所有权

有关更多详细信息,请参阅官方指南

文件所有权

import os
os.chown(path, uid, gid)
uid和gid可以从下面的库中检索

import pwd
import grp

uid = pwd.getpwnam("nobody").pw_uid
gid = grp.getgrnam("nogroup").gr_gid
申请文件权限

os.chmod("filepath", 0o400)
希望这会有所帮助

编辑


注意:正如Holloway所提到的,它将仅针对同一台机器上的用户保护文件。

请记住,这将仅针对同一台机器上没有sudo权限的用户提供保护。如果攻击者可以访问计算机,并且驱动器本身没有加密,那么打开文件就很容易了。@Holloway,是的,你完全正确。我已经更新了我的答案谢谢@Holloway和beer44的回答,但我正在windows平台上执行它,我相信它只适用于Unix。这与问题无关,但如果使用标准命名约定,人们可以更容易地阅读您的代码。请参见PEP8,了解所有这些变量,但主要的一个是使用
snake\u case
命名变量<代码>大写名称通常用于类/类型(请注意语法突出显示使它们的颜色不同)。谢谢@Holloway。我会记住的