Shell 脚本中的凭据保护

重要更正:Base64 是可逆编码,不是加密,也不能保护密码。任何能读取脚本的人都能立即还原 Base64 内容。本页旧示例只用于解释历史做法,生产脚本不得把密码以明文、Base64、命令行参数或硬编码变量的形式保存。

推荐顺序

  1. 优先使用云厂商 Secret Manager、Vault、Kubernetes Secret 配合加密存储,或系统原生凭据库。
  2. 无集中密钥服务时,使用权限为 600、属主为服务账号的独立凭据文件,并限制备份和日志访问。
  3. 临时交互脚本可用 read -r -s 安全输入,不回显、不写入历史记录。
  4. 环境变量只能作为进程间传递手段,不等于安全存储;部分系统可通过进程信息、崩溃转储或调试接口读取。
  5. 不在 set -x、错误日志、URL、命令行参数和 CI 输出中打印凭据;发生泄露应立即轮换。
#!/usr/bin/env bash
set -euo pipefail
read -r -s -p "请输入密码: " APP_PASSWORD
printf '\n'
export APP_PASSWORD
run_application
unset APP_PASSWORD

下面保留的 Base64 内容仅用于说明“编码不能替代加密”,请勿复制到生产环境。

在日常工作中经常遇到在 shell 中使用明文密码的情形,例如 mysqldump、mysql、redis 等远程操作。

漏洞扫描与代码检测会对明文密码告警

实际工作中不要记录明文密码,也不要用 Base64 伪装成“密文”。重复任务应通过受控凭据文件或专用密钥服务取用凭据。

下面是旧的 Base64 编码示例,只用于识别遗留脚本,不建议继续使用。

shell脚本模板如下:

#!/bin/bash
function b64Code()
{
\#参数1: 需要加密的串
passauth=``$1     #参数2: 加密的次数,次数越多密码越长
    for i in `seq 1 $``2`
    do         # 以下仅为 Python 3 Base64 编码演示,不具备加密能力
        passauth=`echo $``passauth |python -c "import base64;s=input(); print(base64.b64encode(s.encode()).decode());"\`
echo "\[+]第`${i}次加密结果:$`passauth"
done
}

function deCode()
{
\#参数1: 加密串内容
passDstr=``$1     #参数2: 密码解析次数
    for i in `seq 1 $``2`
    do
        passDstr=`echo ``$passDstr |python -c "import base64;s=input(); print(base64.b64decode(s.encode()).decode());"`
        echo "[-]第$``{i}次解密结果:\$passDstr"
done
}

b64Code 123456 10
echo ""
deCode \$passauth 10

模板执行效果如下:

[+]第1次加密结果:MTIzNDU2
[+]第2次加密结果:TVRJek5EVTI=
[+]第3次加密结果:VFZSSmVrNUVWVEk9
[+]第4次加密结果:VkZaU1NtVnJOVVZXVkVrOQ==
[+]第5次加密结果:VmtaYVUxTnRWbkpPVlZaWFZrVnJPUT09
[+]第6次加密结果:Vm10YVlWVXhUblJXYmtwUFZsWmFXRlpyVm5KUFVUMDk=
[+]第7次加密结果:Vm0xMFlWbFdWWGhVYmxKWFltdHdVRlpzV21GWFJscHlWbTVLVUZWVU1Eaz0=
[+]第8次加密结果:Vm0weE1GbFdiRmRXV0doVllteEtXRmx0ZEhkVlJscHpWMjFHV0ZKc2NIbFdiVFZMVlVaV1ZVMUVhejA9
[+]第9次加密结果:Vm0wd2VFMUdiRmRpUm1SWFYwZG9WbGx0ZUV0WFJteDBaRWhrVmxKc2NIcFdNakZIVjBaS2MyTkliRmRpVkZaTVZsVmFWMVpWTVVWaGVqQTk=
[+]第10次加密结果:Vm0wd2QyVkZNVWRpUm1ScFVtMVNXRll3Wkc5V2JHeDBaVVYwV0ZKdGVEQmFSV2hyVm14S2MyTkljRmROYWtaSVZqQmFTMk15VGtsaVJtUnBWa1phVFZac1ZtRldNVnBXVFZWV2FHVnFRVGs9

[-]第1次解密结果:Vm0wd2VFMUdiRmRpUm1SWFYwZG9WbGx0ZUV0WFJteDBaRWhrVmxKc2NIcFdNakZIVjBaS2MyTkliRmRpVkZaTVZsVmFWMVpWTVVWaGVqQTk=
[-]第2次解密结果:Vm0weE1GbFdiRmRXV0doVllteEtXRmx0ZEhkVlJscHpWMjFHV0ZKc2NIbFdiVFZMVlVaV1ZVMUVhejA9
[-]第3次解密结果:Vm0xMFlWbFdWWGhVYmxKWFltdHdVRlpzV21GWFJscHlWbTVLVUZWVU1Eaz0=
[-]第4次解密结果:Vm10YVlWVXhUblJXYmtwUFZsWmFXRlpyVm5KUFVUMDk=
[-]第5次解密结果:VmtaYVUxTnRWbkpPVlZaWFZrVnJPUT09
[-]第6次解密结果:VkZaU1NtVnJOVVZXVkVrOQ==
[-]第7次解密结果:VFZSSmVrNUVWVEk9
[-]第8次解密结果:TVRJek5EVTI=
[-]第9次解密结果:MTIzNDU2
[-]第10次解密结果:123456

模板实际应用

例如快速执行sql文件时,我们在shell脚本中只需要写上加密后的串,并附带解密函数:

#!/bin/bash
function deCode()
{
    #参数1: 加密串内容
    passDstr=$1
    #参数2: 密码解析次数
    for i in `seq 1 $2`
    do
        passDstr=`echo $passDstr |python -c "import base64;s=input(); print(base64.b64decode(s.encode()).decode());"`
    done
}
#使用加密10次的密文
mysqlPass="Vm0wd2QyVkZNVWRpUm1ScFVtMVNXRll3Wkc5V2JHeDBaVVYwV0ZKdGVEQmFSV2hyVm14S2MyTkljRmROYWtaSVZqQmFTMk15VGtsaVJtUnBWa1phVFZac1ZtRldNVnBXVFZWV2FHVnFRVGs9"
deCode $mysqlPass 10

正式环境shell脚本实施如下:

#!/bin/bash

function b64Code()
{
        passauth=$1
        for i in `seq 1 $2`
        do
                passauth=`echo $passauth |python3 -c "import base64;s=input();print(base64.b64encode(s.encode()).decode());"`
                echo "[+]第${i}次加密结果:$passauth"
        done
}

function deCode()
{
        passDstr=$1
        for i in `seq 1 $2`
        do
                passDstr=`echo $passDstr |python3 -c "import base64;s=input();print(base64.b64decode(s.encode()).decode());"`
                echo "[-]第${i}次解密结果:$passDstr"
        done
}

b64Code tsos2024 10
echo ""
deCode $passauth 10

正式环境应用

#!/bin/bash
function deCode()
{
        passDstr=$1
        for i in `seq 1 $2`
        do
                passDstr=`echo $passDstr |python3 -c "import base64;s=input();print(base64.b64decode(s.encode()).decode());"`
        done
}

db_host="127.0.0.1"
db_port="3306"
db_user="root"
db_pass="Vm0wd2VHUXhUWGROVldSWVYwZDRWVll3Wkc5V01WbDNXa1JTVjAxWGVEQmFWVll3VmpKS1NHVkdiR0ZXVjJoeVZtcEdTMk15U2tWVWJHaG9UVmhDVVZadGVGWmxSbGw1Vkd0c2FWSnRVbkJXTUZwTFlqRmFjMVp0UmxkTlZuQlhWRlpXVjJGSFZuRlJWR3M5"
deCode $db_pass 10
db_name="zabbix"
backup_dir="/data/backup/mysql-backup"
date_time=$(date +%Y%m%d_%H%M%S)
mysqldump -h${db_host} -P${db_port} -u${db_user} -p${passDstr} ${db_name} | gzip > ${backup_dir}/${db_name}-${date_time}.sql.gz
Copyright © yan-jian.com 2023 - 2026 · Powered by GitBook更新时间: 2026-10-18 13:28:39

results matching ""

    No results matching ""