使用Bash脚本RSA公钥加密算法对密码进行加密解密方法

简介

       在Shell脚本中实现RSA加密解密功能,可以使用多种工具,例如opensslopenssl是一个强大的命令行工具,用于执行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、典型应用场景:
     自动化脚本中的数据库密码保护;
     配置文件敏感信息加密;
     需要安全存储密码的场景;
注意:实际使用时建议结合具体安全需求,可考虑增加密码复杂度检查、密钥轮换机制等增强措施。

如果小伙伴喜欢这篇文章的话,希望给点赞收藏加关注哦!!! 感谢大家的支持!!😊🙏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

angelasp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值