实用脚本能批量加密吗?

wen 实用脚本 13

本文目录导读:

实用脚本能批量加密吗?

  1. 场景一:使用 Python 脚本批量加密文件(最灵活)
  2. 场景二:使用 Shell + OpenSSL 批量加密(Linux/Mac 适用)
  3. 场景三:批量加密文本行(如 CSV 中的密码列)
  4. 安全提醒
  5. 总结:能否批量加密?

批量加密”的问题,需要先明确您具体指的是“批量加密文件”还是“批量加密文本/数据”,以及您希望使用什么工具(如 Python 脚本、Shell 脚本等)。

以下提供几种常见场景下的实用脚本实现方案,均支持批量处理。

使用 Python 脚本批量加密文件(最灵活)

如果您需要对多个文件(如所有 .txt, .docx, .jpg)进行加密,推荐使用 cryptographypycryptodome 库。

安装依赖库

pip install cryptography

批量加密脚本 (AES-256-GCM)

此脚本会遍历指定目录下的所有文件,并使用同一个密码加密它们,加密后的文件会带上 .encrypted 后缀。

import os
import sys
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
import base64
import secrets
def derive_key(password: str, salt: bytes) -> bytes:
    """使用密码和盐值派生 AES-256 密钥"""
    kdf = PBKDF2HMAC(
        algorithm=hashes.SHA256(),
        length=32,
        salt=salt,
        iterations=100000,  # 迭代次数越高越安全
        backend=default_backend()
    )
    return kdf.derive(password.encode('utf-8'))
def encrypt_file(input_path, output_path, password):
    """加密单个文件"""
    salt = secrets.token_bytes(16)  # 随机盐值
    key = derive_key(password, salt)
    nonce = secrets.token_bytes(12)  # GCM模式需要12字节nonce
    print(f"正在加密: {input_path}")
    try:
        with open(input_path, 'rb') as f:
            data = f.read()
        cipher = Cipher(algorithms.AES(key), modes.GCM(nonce), backend=default_backend())
        encryptor = cipher.encryptor()
        ct = encryptor.update(data) + encryptor.finalize()
        # 格式:盐值(16字节) + nonce(12字节) + tag(16字节) + 密文
        with open(output_path, 'wb') as f:
            f.write(salt + nonce + encryptor.tag + ct)
        print(f"已完成: {output_path}")
        return True
    except Exception as e:
        print(f"加密失败 {input_path}: {e}")
        return False
def batch_encrypt(directory, password):
    """批量加密指定目录下的所有文件"""
    # 创建加密后的存放目录
    output_dir = os.path.join(directory, "encrypted_files")
    os.makedirs(output_dir, exist_ok=True)
    # 过滤掉已经加密的文件和目录本身
    files = [f for f in os.listdir(directory) 
             if os.path.isfile(os.path.join(directory, f)) 
             and not f.endswith('.encrypted')]
    if not files:
        print("目录下没有可加密的文件。")
        return
    print(f"找到 {len(files)} 个文件准备加密...")
    success_count = 0
    for filename in files:
        input_path = os.path.join(directory, filename)
        output_path = os.path.join(output_dir, filename + ".encrypted")
        if encrypt_file(input_path, output_path, password):
            success_count += 1
    print(f"\n加密完成!成功 {success_count}/{len(files)} 个文件。")
    print(f"加密文件保存在: {output_dir}")
if __name__ == "__main__":
    target_dir = input("请输入要加密的目录路径: ").strip()
    if not os.path.isdir(target_dir):
        print("错误:路径不存在或不是目录")
        sys.exit(1)
    password = input("请输入加密密码: ").strip()
    if not password:
        print("密码不能为空")
        sys.exit(1)
    batch_encrypt(target_dir, password)

如何使用:

  • 运行脚本,输入要加密的目录路径和密码。
  • 脚本会在该目录下创建 encrypted_files 文件夹,里面存放所有加密后的文件。
  • 解密时需要对应的解密脚本(可使用相同的库逆向操作,需要 salt, nonce, tag)。

使用 Shell + OpenSSL 批量加密(Linux/Mac 适用)

如果您习惯命令行,且需要批量加密文件(比如备份大量文件),可以使用 OpenSSL 配合 shell 循环。

批量加密脚本 (encrypt_all.sh)

#!/bin/bash
# 批量加密当前目录下的所有指定类型文件
# 用法: ./encrypt_all.sh "your_password"
PASSWORD="$1"
ENCRYPTED_DIR="encrypted_openssl"
# 检查参数
if [ -z "$PASSWORD" ]; then
    echo "用法: $0 <密码>"
    exit 1
fi
# 创建输出目录
mkdir -p "$ENCRYPTED_DIR"
echo "开始批量加密当前目录下的 .txt 和 .docx 文件..."
# 统计进度
total=0
success=0
# 循环处理文件 (可以修改通配符)
for file in *.txt *.docx *.pdf; do
    if [ -f "$file" ]; then
        total=$((total + 1))
        echo "正在加密: $file"
        # 输出文件:原文件名.enc
        if openssl enc -aes-256-cbc -salt -pbkdf2 -iter 100000 \
            -in "$file" \
            -out "${ENCRYPTED_DIR}/${file}.enc" \
            -pass pass:"$PASSWORD" 2>/dev/null; then
            success=$((success + 1))
            echo "  成功: ${file}.enc"
        else
            echo "  失败: $file"
        fi
    fi
done
echo ""
echo "批量加密完成!成功 $success / $total 个文件。"
echo "加密文件保存在:$(pwd)/${ENCRYPTED_DIR}"

如何使用:

  1. 保存为 encrypt_all.sh,并赋予执行权限 chmod +x encrypt_all.sh
  2. 在含有目标文件的目录下运行:./encrypt_all.sh "MySecretPassword123"
  3. 解密命令:openssl enc -d -aes-256-cbc -pbkdf2 -in file.txt.enc -out decrypted_file.txt -pass pass:"MySecretPassword123"

批量加密文本行(如 CSV 中的密码列)

如果您需要加密文本数据(而非文件),比如批量处理 Excel 或 CSV 中的敏感信息,可以使用 Python 脚本逐行加密。

import hashlib
import base64
from cryptography.fernet import Fernet
# 先生成或读取一个密钥 (固定密钥)
# key = Fernet.generate_key()
key = b'your-base64-32-byte-key-here='  # 请替换为实际密钥
cipher_suite = Fernet(key)
def encrypt_text(plain_text: str) -> str:
    """加密单行文本"""
    return cipher_suite.encrypt(plain_text.encode()).decode()
def batch_encrypt_texts(text_list):
    """批量加密文本列表"""
    return [encrypt_text(t) for t in text_list]
# 示例:加密一个密码列表
passwords = ["Pass123", "Admin@2024", "User!Abc"]
encrypted_list = batch_encrypt_texts(passwords)
for original, encrypted in zip(passwords, encrypted_list):
    print(f"原: {original} -> 密: {encrypted}")

安全提醒

  1. 密码强度:脚本内置的密码绝不能是弱密码,建议使用随机生成的高强度密码。
  2. 密钥管理:使用固定密钥比每次都输入密码更安全(但也更需小心保管),建议将密钥存储在环境变量或密钥管理服务中。
  3. 清除明文:批量加密完成后,如果原文件不再需要,请使用安全删除工具(如 shred)删除明文,而不是简单回收站。
  4. 测试恢复:在批量加密重要文件前,务必备份并测试解密脚本是否能成功恢复。

能否批量加密?

能,而且非常实用,上面的 Python 脚本(场景一)是最通用、可定制的方案;Shell + OpenSSL(场景二)适合 Linux 系统管理员快速操作;Python 文本加密(场景三)适合数据处理。

根据您的具体需求(加密什么、用什么平台、需要多强的安全性),选择最适合的一种即可,如果需要我提供对应的解密脚本(比如还原那些 .encrypted 文件),请告诉我,我可以补充。

抱歉,评论功能暂时关闭!