【问题标题】:Encrypt and protect file with python使用python加密和保护文件
【发布时间】:2021-02-16 03:30:12
【问题描述】:

我想在 python3 程序中创建一个文件,我想在其中存储一些我不希望用户看到或操作的信息。但是,在执行时我需要读取和修改它的内容,确保用户不能修改文件的内容。我怎样才能做到这一点?

【问题讨论】:

    标签: python encryption cryptography pycrypto


    【解决方案1】:

    最终用户设备上存储的所有信息最终都可以被操纵。
    一种选择是将您不希望用户操作的数据存储在网络服务器上,并在需要时检索/更新它。 这种方法的缺点是您的代码无法离线工作。

    【讨论】:

    • 您有参考资料,我可以在其中找到如何执行此操作吗?是否可以在本地保存信息并在连接可用时发送?
    • 存储在最终用户设备上的所有信息最终都可能被操纵”,所以不,我没有任何建议这样做。
    • 我的意思是,我在哪里可以找到如何将其发送到网络服务器并在需要时检索
    • 使用requestssocket 模块。
    【解决方案2】:

    您可以将私有信息存储在 python 对象中,例如字典等然后编译(.py-->.pyc),加密源文件(.py-->.py.cpt)最后发布仅编译后的文件,可选择使用其加密对(同时将加密密钥安全地保存给自己)。

    您可以找到更多详细信息here

    【讨论】:

      【解决方案3】:

      在此示例中,我使用了 Fernet 和使用密码“硬编码”创建的密钥。 您可以加密文件并仅在必要时解密其中的信息。 如果你必须修改信息,你可以再次调用加密函数。

      from cryptography.fernet import Fernet
      import base64, hashlib
      
      
      def encrypt(filename, key):
          f = Fernet(key)
          with open(filename, "rb") as file:
              # read the encrypted data
              file_data = file.read()
          # encrypt data
          encrypted_data = f.encrypt(file_data)
          # write the encrypted file
          with open(filename, "wb") as file:
              file.write(encrypted_data)
          
          
      def decrypt(filename, key):
          f = Fernet(key)
          with open(filename, "rb") as file:
              # read the encrypted data
              encrypted_data = file.read()
          # decrypt data
          decrypted_data = f.decrypt(encrypted_data)
          print(decrypted_data)
      
      my_password = 'mypassword'.encode()
      key = hashlib.md5(my_password).hexdigest()
      key_64 = base64.urlsafe_b64encode(key.encode("utf-8"))
      
      # file name
      file = "test.txt"
      # encrypt it
      encrypt(file, key_64)
      with open("test.txt", "rb") as f:
          print(f.read())
      decrypt(file, key_64)
      

      【讨论】:

      • 您打算硬编码密码或密钥吗?如果是这样的话,这绝对是不是要走的路。
      • @PedroLobito 这只是一个关于 Fernet 工作原理的例子。当然,可以创建更好的密钥而不使用硬编码的密码。
      • @PedroLobito 但是,在某些情况下,您可以使用“网络服务器并在需要时检索/更新它”,就像在 ChatoPaka 的回答中一样,以及您无法使用该解决方案的情况。就我而言,客户在非常大的制作中使用我的软件,其中有很多操作员可以访问我的配置文件。不可能说“不要碰那些文件”,因为 100% 有人会碰它们。在这些情况下,我认为“愚蠢”的加密保护足以阻止这个问题。
      • 不明白:在这个例子中软件不需要硬编码密码“my_password”,是操作员需要存储它?还是我不明白?
      • 当你使用时:“key = hashlib.md5(encoded_Pwd).hexdigest()”是从私钥“encoded_Pw”创建公钥吗?
      猜你喜欢
      • 2019-05-06
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      相关资源
      最近更新 更多