如何在bash脚本中加密和解密oracle数据库的用户密码

问题描述

问题:我想为 oracle 数据库创建用户。为此,我创建了 shell 脚本,它会要求输入用户名和密码。然后这些变量将存储在 sql 查询中以获取输出。请找到以下命令:

**这里的密码是纯文本的。请告诉如何加密和解密输入表单中给出的密码。 ? **

**echo -n "输入要创建的用户"
读取用户名

echo -n "输入新密码"
读取密码

output=`sqlplus -s '/as sysdba' 创建由“$PASSWORD”标识的用户“$USERNAME”
认表空间“$DETAB”
临时表空间温度
配置文件
账户解锁;
出口;

EOF`**

解决方法

从安全角度来看,您对 shell 变量的使用通常是一个问题。一旦您将密码存储在 shell 变量中,系统上的其他用户就可以读取它。更好的方法是提示用户输入作为 SQL 脚本的一部分,而不是在 shell 中:

create_user.sql:

-- get username
accept username char prompt 'Enter user to be created > ';

-- get password and hide value from screen 
accept password char prompt 'Enter password > ' HIDE;

-- get default tablespace
accept detab char prompt 'Enter default tablespace > ';

set echo off;

CREATE USER &&username IDENTIFIED BY &&password
DEFAULT TABLESPACE &&detab
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;

exit;

然后像这样运行脚本:

sqlplus / as sysdba @create_user.sql

该脚本现在可以运行,而无需将密码值暴露给 shell,也不会被回显到屏幕上。

我以前写过关于这些类型的问题。请参阅此处了解更多信息:https://pmdba.wordpress.com/2020/01/13/how-to-hide-oracle-passwords-in-a-script/

,

正如评论中所建议的,这里是修改后的脚本

echo -n "Enter user to be created"
read USERNAME

echo -n "Enter new password"
read PASSWORD

output=`sqlplus -s '/nolog' >/dev/null 2>/dev/null <<EOF
WHENEVER SQLERROR EXIT SQL.SQLCODE
connect / as sysdba
CREATE USER "$USERNAME" IDENTIFIED BY "$PASSWORD"
DEFAULT TABLESPACE "$DETAB"
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;
exit; 
EOF`
success=`echo $? `
unset PASSWORD
echo $USERNAME
echo $success
echo $output
echo $PASSWORD

如果 $success 返回 0,一切正常。如果不是有错误。 但是 $output$PASSWORD 在执行结束时为空 出于调试目的,不要重定向到 /dev/null 但您会看到密码。

密码已加密存储在 Oracle 内部,正如其他帮助您的人在评论中所述

其他建议 我认为更好的解决方案是强制用户在第一次/下次登录时更改密码

例如创建用户:

  1. 选项 by a password expire
  2. 一个虚拟密码和 password expire 选项
  3. 使用命令 alter user $USERNAME password expire; 使密码过期。

通过这样做,Oracle 将要求用户在第一次或下一次连接时更新他的密码。密码问题将由sqlplus直接(或其他工具)管理。

您可以在脚本中添加 conn $USENAME/<dummypwd> 和 sqlplus 会提示输入新密码