数据安全现在是企业、软件和个人关注的重中之重。这导致数据泄露和窃取的风险显着增加。GitHub 是一个流行的版本控制和协作平台,但在其上存储未受保护的敏感数据可能会产生严重的安全后果。降低这些风险的一种有效解决方案是在将包含敏感数据的文件夹上传到 GitHub 之前对其进行加密。

加密涉及将数据转换为只能使用特定密钥访问的安全格式。

通过加密文件夹,您可以确保对其中包含的数据的未经授权的访问将毫无用处,因为它将不可读。

下面我们一起学习如何使用 Python 和 pypyr,一个简单而强大的自动化工具,来加密文件夹。您还将了解如何自动保护敏感数据,例如编写 Dockerfile。

背景

加密是将纯文本或数据转换为编码或加密形式的行为,该形式只能由授权的个人或实体读取。此技术用于保护密码、财务数据和个人信息等敏感信息不被未经授权的个人访问、窃取或拦截。加密需要使用算法和密钥将原始数据转换为不可读的格式。加密数据只能使用适当的密钥转换回其原始形式。

目标

本文的目标是:

  • 概述加密及其如何帮助保护敏感数据。
  • 指导读者如何使用 Python 和pypyr
  • 演示使用pypyr自动执行加密和解密过程的好处。
  • 提供确保数据安全的最佳实践和技巧。

要求

要使用 Python 加密和解密文件夹,您需要多个工具和模块。这些包括:

  • Python 3.x:建议使用最新版本的 Python。
  • pypyr:一个简单而强大的自动化工具,允许您创建和运行管道以自动执行任务。
  • cryptography:一个 Python 库,用于使用各种加密算法加密和解密数据。
  • 文本编辑器或 IDE:可以使用任何支持 Python 开发的文本编辑器或集成开发环境 (IDE)。

出于多种原因,pypyr使用是自动化加密和解密过程的不错选择。首先,pypyr易于安装和使用,即使对于那些对 Python 知之甚少的人来说也是如此。其次,允许您创建可重用的pipelines,从而轻松自动执行重复性任务。最后,pypyr与其他工具和平台很好地集成,使其成为自动化任务的多功能选择。

设置环境

首先,请确保您的计算机上安装了 Python 3.x。您可以通过访问官方网站获取最新版本的 Python。

然后,打开 bash 终端或 PowerShell,导航到工作目录并运行以下命令。

创建和激活虚拟环境;

$ python -m venv venv
$ source venv/bin/activate

接下来,您需要安装所需的库。

$ pip install pypyr 
$ pip install cryptography

此命令将安装pypyrcryptography ,您将使用它来编写管道以及加密和解密文件夹。

保护敏感数据:使用 Python 加密数据的实用方法_Python

最后,您需要一个密钥。使用cryptography模块,生成用于加密和解密文件夹的密钥。文件夹只能使用用于加密它们的密钥进行解密。

# command to generate secret key
$ python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())

保护敏感数据:使用 Python 加密数据的实用方法_数据安全_02

请务必将生成的密钥存储在安全位置,因为稍后在脚本中将需要它。

请记住,有权访问密钥的任何人都可以解密文件夹并查看其内容,这是您要避免的情况。

配置环境后,您可以继续加密和解密文件夹。

实施

下面我们来介绍如何编写用于加密和解密文件夹/目录的 Python 脚本。你将在pipelines中使用此脚本。该脚本将包含两个不同的函数/方法。

  • 使用密钥加密文件夹/目录的功能。encrypt_dir
  • 使用密钥解密文件夹/目录的功能。decrypt_dir

首先,在当前工作目录中创建一个 Python 文件。您可以随心所欲地命名它。

例如

在当前工作目录中创建一个文件。crypt.py

为了更好地理解,让我们以增量方式填充文件内容。

首先,导入所需的库;

import os
import pathlib
from cryptography.fernet import Fernet

其次,在脚本中包含密钥,如下所示:

secret_key:str = "0TY8Cdx3qAQGk3z6c9PxtQKgoUx3WZWDDaFpG-RJBT0="

此密钥将用于加密和解密文件夹。

但是,将机密数据嵌入到代码中不被视为良好的软件实践。在这种情况下,我们这样做是为了避免不必要的复杂性。建议将机密保存在 .env 文件中,并在运行时将它们加载到程序中。

第三,对文件夹进行加密的功能;

 def encrypt_dir(input_dir, output_dir):
    # get key
    key = secret_key

    # create Fernet object with key
    fer = Fernet(key)

    # folder to be encrypted
    input_dir = pathlib.Path(input_dir)
    # encrypted folder
    output_dir = pathlib.Path(output_dir)
    # create output dir if does not exist
    output_dir.mkdir(exist_ok=True, parents=True)

    # iterate over input dir and encrypt content
    for path in input_dir.glob("*"):
        _path_bytes = path.read_bytes()
        data = fer.encrypt(_path_bytes)
        rel_path = path.relative_to(input_dir)
        dest_path = output_dir / rel_path
        #write encrypted data to ouput dir
        dest_path.write_bytes(data)

最后,对文件夹执行解密的功能;

def decrypt_dir(input_dir, output_dir):
    key = secret_key

    fer = Fernet(key)

    input_dir = pathlib.Path(input_dir)
    output_dir = pathlib.Path(output_dir)
    output_dir.mkdir(exist_ok=True, parents=True)

    # iterate over input dir and decrypt content
    for path in input_dir.glob("*"):
        _path_bytes = path.read_bytes()
        data = fer.decrypt(_path_bytes)
        rel_path = path.relative_to(input_dir)
        dest_path = output_dir / rel_path
        #write decrypted data to ouput dir
        dest_path.write_bytes(data)

总体而言,此函数采用包含加密文件的输入目录,使用 Fernet 加密算法对其进行解密,并将解密文件写入输出目录。

Pipeline

Pipeline是一组自动执行一系列任务或步骤的指令。在这种情况下,Pipeline会自动执行加密和解密文件夹的过程。

pypyr是一个强大的工具,可让您轻松定义和执行Pipeline。有了这个,我们可以将加密和解密逻辑编写为可重用的步骤,然后将它们链接在一起以形成一个Pipeline。通过这样做,我们可以简化加密和解密过程并使其更易于管理。

加密

在工作目录中创建一个文件并添加以下代码;encrypt.yaml

steps:
  - name: pypyr.steps.pyimport
    in:
      pyImport: |
        import crypt
  - name: pypyr.steps.set
    in:
      set:
        toEncrypt:
          - input_dir: <folder to be encrypted>
            output_dir: <output directory>
          - input_dir: <folder to be encrypted>
            output_dir: <output directory>
  - name: pypyr.steps.py
    run: !py crypt.encrypt_dir(i["input_dir"], i["output_dir"])
    foreach: "{toEncrypt}"

解密

在工作目录中创建一个文件并添加以下代码;decrypt.yaml

steps:
  - name: pypyr.steps.pyimport
    in:
      pyImport: |
        import crypt
  - name: pypyr.steps.set
    in:
      set:
        toDecrypt:
          - input_dir: <folder to be decrypted>
            output_dir: <output directory>
          - input_dir: <folder to be decrypted>
            output_dir: <output directory>
  - name: pypyr.steps.py
    run: !py crypt.decrypt_dir(i["secured_dir"], i["output_dir"])
    foreach: "{toDecrypt}"

运行

若要运行,请将以下行添加到要使用或执行的文件或脚本中。

python -m pypyr encrypt #to encrypt
python -m pypyr decrypt #to decrypt

例如,在 Dockerfile 的情况下;

保护敏感数据:使用 Python 加密数据的实用方法_数据安全_03

您还可以从 CLI 运行以下命令;

$ python -m pypyr encrypt #to encrypt
$ python -m pypyr decrypt #to decrypt

您还可以在运行命令时覆盖管道中设置的变量;

python -m pypyr encrypt input-dir output-dir

但是,无论您碰巧在何处执行命令,请确保它已在工作目录中执行。

结论

在当今的数字时代,保护数据至关重要,采取必要措施保护机密信息至关重要。使用加密作为保护数据的一种手段是一种简单而有效的方法。

Python 和 pypyr 使加密和解密过程的自动化变得简单。按照本文中介绍的分步说明,您可以轻松地加密和解密文件夹,从而保证敏感数据的机密性和安全性。

请记住始终确保您的加密密钥安全,并经常更改它以获得最大程度的保护。此外,即使在开发过程中,也要以加密形式保存您的敏感数据,并避免与未经授权的个人共享未加密的数据。

通过遵守这些最佳实践并采用本文中概述的技术,您可以确保 GitHub 和其他平台上的机密数据的安全性。