简介
在Shell脚本中实现RSA加密解密功能,可以使用多种工具,例如openssl
。openssl
是一个强大的命令行工具,用于执行SSL和TLS协议中的各种任务,同时也支持非对称加密。
生成公钥
#!/bin/bash
# 生成密钥对(2048位)
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem
加密脚本
#!/bin/bash
# 安全配置
PUBLIC_KEY_PATH="${BASH_SOURCE%/*}/public.pem"
OUTPUT_FILE="${BASH_SOURCE%/*}/encrypted_password.dat"
KEY_SIZE=2048 # RSA密钥长度
validate_environment() {
# 检查openssl是否可用
if ! command -v openssl &>/dev/null; then
echo "错误: openssl工具未安装" >&2
exit 127
fi
# 检查公钥文件
[ ! -f "$PUBLIC_KEY_PATH" ] && {
echo "错误: 公钥文件不存在: $PUBLIC_KEY_PATH" >&2
echo "请先生成RSA密钥对:"
echo " openssl genrsa -out private.pem $KEY_SIZE"
echo " openssl rsa -in private.pem -pubout -out public.pem"
exit 1
}
}
# 安全读取密码
read_password() {
read -rsp "请输入要加密的密码: " PASSWORD
echo >&2
echo "$PASSWORD"
}
main() {
validate_environment
local password
password=$(read_password)
# 加密操作
if echo "$password" | openssl rsautl -encrypt -oaep -pubin \
-inkey "$PUBLIC_KEY_PATH" -out "$OUTPUT_FILE" 2>/dev/null; then
echo "密码加密成功!加密结果已保存到: $OUTPUT_FILE"
echo "请妥善保管以下文件:"
echo " 1. 加密文件: $OUTPUT_FILE"
echo " 2. 私钥文件: ${PUBLIC_KEY_PATH%/*}/private.pem"
else
echo "错误: 密码加密失败" >&2
echo "可能原因:" >&2
echo " 1. 公钥格式不正确" >&2
echo " 2. 密码长度超过RSA密钥限制" >&2
exit 1
fi
}
main "$@"
解密脚本
#!/bin/bash
# 安全配置
PRIVATE_KEY_PATH="./private.pem"
ENCRYPTED_PASS_FILE="./encrypted_password.dat"
LOG_FILE="./log.log"
# 增强型解密函数
# 使用openssl解密密码
decrypt_to_string() {
[ ! -r "$PRIVATE_KEY_PATH" ] && {
echo "错误: 私钥文件不可读: $PRIVATE_KEY_PATH" >> "$LOG_FILE"
return 127
}
local decrypted_pass
if ! decrypted_pass=$(openssl rsautl -decrypt -oaep -inkey "$PRIVATE_KEY_PATH" -in "$ENCRYPTED_PASS_FILE" 2>&1); then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 解密失败: $decrypted_pass" >> "$LOG_FILE"
return 1
fi
echo "$decrypted_pass"
}
PGPASSWORD=$(decrypt_to_string)
echo "输出密码:$PGPASSWORD"
echo "$(date) $current_date proc end" >> "$LOG_FILE"
最后解析出正确的密文
总结
1、加密流程:
使用RSA-OAEP填充模式加密;
输入:明文密码 + RSA公钥(public.pem);
输出:加密后的二进制文件(encrypted_password.dat);
关键命令:openssl rsautl -encrypt -oaep -pubin -inkey public.pem;
2、解密流程:
使用对应私钥解密;
输入:加密文件 + RSA私钥(private.pem);
输出:原始明文密码;
关键命令:openssl rsautl -decrypt -oaep -inkey private.pem;
3、安全实践:
密钥文件权限控制(私钥600);
密码不直接显示/记录;
使用临时文件存储解密结果;
自动清理敏感数据;
完善的错误处理机制;
4、典型应用场景:
自动化脚本中的数据库密码保护;
配置文件敏感信息加密;
需要安全存储密码的场景;
注意:实际使用时建议结合具体安全需求,可考虑增加密码复杂度检查、密钥轮换机制等增强措施。
如果小伙伴喜欢这篇文章的话,希望给点赞收藏加关注哦!!! 感谢大家的支持!!😊🙏