关于python中文件可访问性的建议

如何解决关于python中文件可访问性的建议

我正在尝试使用 python 和 tkinter 制作带有登录系统的密码管理器。为了存储这些密码,我正在使用记事本。但是,问题是,只需打开我用来存储它们的 .txt 文件(无需登录应用程序)即可轻松访问密码。那么,有没有办法让这些文本文件只能通过它访问应用程序或任何更好的方式来存储该信息?请不要介意任何错误

解决方法

我建议您对文件进行加密,以确保人们无法读取您的用户名和密码。加密是将信息转换为某种形式的代码以隐藏其真实内容的过程。访问文件信息的唯一方法是解密它。加密/解密的过程称为密码学。

Cryptogrophy 是 python 中的加密库

所以首先输入 pip install cryptography 来安装密码学库

所以我首先建议你像这样加密你的用户名:

from cryptography.fernet import Fernet

key = Fernet.generate_key()

with open('mykey.key','rb') as mykey:
    key = mykey.read()

print(key)

f = Fernet(key)

with open('grades.csv','rb') as original_file:
    original = original_file.read()

encrypted = f.encrypt(original)

with open ('enc_grades.csv','wb') as encrypted_file:
    encrypted_file.write(encrypted)

with open('mykey.key','wb') as mykey:
    mykey.write(key)

然后我建议你像这样临时解密文件:

class Encryptor():

    def key_create(self):
        key = Fernet.generate_key()
        return key

    def key_write(self,key,key_name):
        with open(key_name,'wb') as mykey:
            mykey.write(key)

    def key_load(self,'rb') as mykey:
            key = mykey.read()
        return key


    def file_encrypt(self,original_file,encrypted_file):
        
        f = Fernet(key)

        with open(original_file,'rb') as file:
            original = file.read()

        encrypted = f.encrypt(original)

        with open (encrypted_file,'wb') as file:
            file.write(encrypted)

    def file_decrypt(self,encrypted_file,decrypted_file):
        
        f = Fernet(key)

        with open(encrypted_file,'rb') as file:
            encrypted = file.read()

        decrypted = f.decrypt(encrypted)

        with open(decrypted_file,'wb') as file:
            file.write(decrypted)

然后在获得用户名后删除解密文件,如下所示:

import os
os.remove(Decrypted_file)
,

您这样做的方式存在一些问题。

首先,您不应该存储实际密码。相反,对它们进行散列并存储散列,然后当您的用户尝试登录时,您对他们提供的密码进行散列并检查它是否与您为他们存储的散列匹配。

其次,您的应用应该在一个服务帐户下运行,并且它需要的任何机密都应该只能由该帐户访问,这样可以防止任何其他用户读取其敏感数据。为了增加保护,您可以禁用该服务帐户的 ssh 和 shell 访问,还可以禁用服务器上的 sudo 和 root 登录,使攻击者更难成为服务帐户(请注意,这并不是不可能的) ,只是更难)。

第三,无论如何您都不应该使用自己的机密管理器。但假设这是某种玩具应用程序或学校项目,您正在做它以学习如何做,请记住一些基本的信息安全规则。您还可以加密保存密码哈希的文件,但不要认为这必然会带来更高的安全性,因为任何可以访问您的服务帐户以读取密码文件的人也可以获得加密密钥。这是 /etc/passwd 和 /etc/shadow 未加密而是受限制性文件权限保护的基本原因。

请注意,纯文本文件中的用户数据库不是特别具有可扩展性,因此虽然它适用于服务器,但拥有大量帐户的应用程序倾向于使用真实数据库,并且您可以使用数据库管理器的内置访问控制和加密功能,以限制对敏感表的访问并加密敏感列。

,

是的,可以这样做! 但为此我们需要使用加密:

使用 zip 文件的优点是会节省一些空间,而且在文本编辑器(二进制数据)中阅读和编辑并不容易。它可以在您的 Python 脚本中轻松操作:

with ZipFile('spam.zip') as myzip:
    with myzip.open('eggs.txt') as myfile:
        print(myfile.read())

就是这么简单!另一方面,临时文件是一个易失性(删除=真/假)文件,一旦完成就可以丢弃。您可以轻松地将其内容复制到另一个文件中,或者在如上所述关闭它之前将其压缩。

with open tempfile.NamedTemporaryFile() as temp:
    temp.write(b"Binary Data")

再次,另一个简单的过程。但是,您必须对其进行压缩或加密才能获得最终结果。现在,继续加密。最简单的方法是 XOR 密码。由于我们只是试图防止“可读性”而不关心安全性,因此您可以执行以下操作: 推荐的解决方案(XOR 密码):

from itertools import cycle


def xorcize(data,key):
    """Return a string of xor mutated data."""
    return "".join(chr(ord(a)^ord(b)) for a,b in zip(data,cycle(key)))


data = "Your secret passwords"
key = "This is the encryption key"

encdata = xorcize(data,key)
decdata = xorcize(encdata,key)

print(data,encdata,decdata,sep="\n")

注意这个函数有多小?将它包含在您的任何脚本中都非常方便。您可以在将所有数据写入文件之前对其进行加密,并使用“.dat”或“.contacts”等文件扩展名或您选择的任何自定义名称进行保存。确保它默认没有在编辑器中打开(例如“.txt”、“.nfo”)。

,

如果您只需要简单的混淆,只需使用 lzma 压缩即可。

import lzma
import pickle

def save_data(data,filename):
    with lzma.open(filename,"wb") as fout:
        pickle.dump(data,fout,pickle.HIGHEST_PROTOCOL)

def read_data(filename):
    with lzma.open(filename,"rb") as fin:
        return pickle.load(fin)


important_data_to_obfuscate = { ... }  # I'm assuming it's some kind of dict
save_data(important_data_to_obfuscate,"userdata.bin")
copy_of_important_data = read_data("userdata.bin")
assert important_data_to_obfuscate == copy_of_important_data

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?