【问题标题】:Suggestions regarding accessiblity of files in python关于python中文件可访问性的建议
【发布时间】:2021-01-01 10:57:10
【问题描述】:

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

【问题讨论】:

  • 为什么不加密文本文件让程序解密密码
  • @TERMINATOR 非常感谢先生!!
  • 它没有任何帮助
  • 我提供了一个安全的答案,不会像使用 zip 文件那样被破解

标签: python python-3.x tkinter text notepad++


【解决方案1】:

您执行此操作的方式存在一些问题。

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

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

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

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

【讨论】:

    【解决方案2】:

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

    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, key_name):
            with open(key_name, 'rb') as mykey:
                key = mykey.read()
            return key
    
    
        def file_encrypt(self, key, 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, key, 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)
    

    【讨论】:

    • 为什么选择 Fernet?为什么不用 PyCryptodome?
    • 因为 Fernet 是一个名为 cryptogrohpy 的更大更主流的库的一部分,但 PyCryptodome 也可以工作
    【解决方案3】:

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

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

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

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

    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”)。

    【讨论】:

    • 如果有人无法用记事本打开它,他们可以在终端中使用 nano 来自定义文件扩展名
    • Zip 不是一种可靠的加密方法,请寻找可靠的解决方案
    • 是的,但是终端中的记事本和 nano 在尝试显示纯文本 .txt 文件时显示相同的内容
    • 但是nano可以打开自定义扩展,这就是我的意思
    • 但最后,我认为Zip还是会比其他解决方案简单很多。
    【解决方案4】:

    如果您只需要简单的混淆,只需使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多