做为Unix 系统管理员Oracle 数据库管理员Oracle ERP 应用系统管理员需要不定期地更改各系统中重要用户的密码以保证系统及数据的安全
但是由于所管理的小型机及数据库应用系统较多每月更改近百个用户的密码不论是密码的生成还是密码的更改工作量均很大尤其是密码的生成为了加强安全性密码不能太简单最好为字母与数字的随机组合但大量的密码若不借助自动生成则其编排是十分困难的
Oracle ERP 系统中应用系统用户(指各子系统的用户非指具体应用用户)同时也是Oracle 数据库用户(如应收模块用户为 ARAR既是数据库用户又是应用用户)而且只有 applsyspub(登录系统的公用用户)applsys(应用基础用户)apps(具体应用操作用户)为必须为应用系统中密码与数据库密码一致外其它应用的数据库用户密码可以与应用系统中密码中不一致只需在对应用系统进行打 patch 工作时才需将其改为一致因而可在打 patch 前在应用系统中将应用系统用户密码修改为与数据库一致即可平时不用修改其密码这样一则减少了工作量二则加强了系统的安全性
更改数据库用户密码可通过在 sqlplus 执行 alter user identified by 密码 的命令而实现因而可以通过自动生成密码脚本的方式高效地完成密码的更改工作而 Unix 用户密码则由于需由管理员负责更改密码的并不多故可在自动生成后手工进行修改
为了生成较为复杂的密码同时提高工作效率我用 Excel 自带的 VBA 编写了一个小脚本运行该程序则自动生成一个更改用户密码的脚本同时将用户密码记录在工作表上以便于打印出来保存在密码本中做为记录
首先需在工作表中第一列输入各个要修改密码的数据库用户的用户名在第三列输入各个要更改密码的操作系统用户的用户名
然后运行脚本 gen_pass_oracle 则自动生成Oracle 用户的相应的密码运行脚本 gen_pass_unix 则自动生成unix 操作系统用户的相应的密码
生成的Oracle 数据库用户密码保存在 change_passsql 中可在 sqlplus 中调用该脚本迅速完成密码的修改工作
生成的Unix 用户密码保存在 change_passtxt 中需手工逐个地更改密码
可通过在程序首部修改 pass_length 的值的方法确定生成的密码的长度可通过在程序首部修改 start_asc 的方法确定密码的组成 AZ还是仅 AZ
其主要实现为通过检查工作表中每一行第列(或第列)是否为空判断是否结束密码生成工作若非空即有用户名则进行循环生成在程序头部定义的指定长度的密码串密码串中的字符为通过起始字符的 ascii 值加上随机数产生的随机值得到的新的 ascii 值再将其转换为字符型并加入密码串中当密码串的长度达到指定长度时将其组合为一个 sql 语句写入文件中同时在该行的第列(或第列)中写入该密码串
同时考虑到在 Excel 中会将=开头的字符串当作公式对待故在生成密码串时将等于=的ascii 值过滤用类似方法可使生成的密码串中不包含其它不想包含的字符
通过使用这种方式生成并修改密码的工作量得到大大减少安全性得到提高
实际上这种方法产生的密码不限于 unix 与 Oracle 可用于各种操作系统中重要用户的密码的生成及各种数据库应用系统的用户密码生成
Sub gen_pass_app()
Dim bit_count as integer 循环变量 密码中位数计数器
dim row_num as integer 需生成密码的用户名信息开始的行号
dim rnd_base As Integer 随机数种子
Dim char_value As Integer 密码中每个字符的 ascii 值
Dim temp_str As String 密码串
Dim username() As String 用户名
dim pass_length as integer 定义生成的密码的长度
dim start_asc as integer 定义从哪个字符开始生成
pass_length = 设定密码长度为 位
Rem start_asc = 设定密码从 开始
start_asc = 设定密码从 A 开始
rem 由于 Oracle 数据库用户密码不区分大小写故视所选择的起始字母决定随机数的范围以确保至 Z 结束
rnd_base = start_asc
rem 打开文件用于输出生成的改密码的脚本
Open c:\change_passsql For Output As #
rem 同时在工作表上记录相应的密码以便打印出来备作为记录此处为先写标题
Cells( ) = Username: Cells( ) = Password
Cells( ) = Username: Cells( ) = Password
rem 先生成 apps 的密码但脚本中加上注释因 apps密码必须与应用程序一起改
rem 先初始化密码串为空白
temp_str =
For bit_count = To pass_length
char_value = start_asc + Int(Rnd() * rnd_base)
rem 此处为为防=号引起 excel 误认为是公式从而程序出错
If char_value = Then
char_value =
End If
rem 组合成密码
temp_str = temp_str + Chr$(char_value)
Next bit_count
rem 将生成的 apps 密码输出到脚本文件
Print # REM alter user apps + identified by + temp_str + ;
rem 同时记录在工作表上
Cells( ) = APPS: Cells( ) = temp_str
rem 需生成密码的用户名从 row_num 行开始
row_num =
rem 若第一列非空则创建密码否则退出
Do While Cells(row_num ) <>
temp_str =
For bit_count = To pass_length
char_value = start_asc + Int(Rnd() * rnd_base)
If char_value = Then
char_value =
End If
temp_str = temp_str + Chr$(char_value)
Next bit_count
Print # alter user + Cells(row_num ) + identified by + temp_str + ;
Cells(row_num ) = temp_str
rem 获取下一行
row_num = row_num +
Loop
rem 所有用户的密码已生成关闭文件
Close #
End Sub
Sub gen_pass_unix()
Dim bit_count as integer 循环变量 密码中位数计数器
dim row_num as integer 需生成密码的用户名信息开始的行号
dim rnd_base As Integer 随机数种子
Dim char_value As Integer 密码中每个字符的 ascii 值
Dim temp_str As String 密码串
Dim username() As String 用户名
dim pass_length as integer 定义生成的密码的长度
dim start_asc as integer 定义从哪个字符开始生成
pass_length =
start_asc =
Rem start_asc = A
rem 由于 unix 密码支持大小写故视所选择的起始字母决定随机数的范围以确保至 z 结束
rnd_base = start_asc
rem 打开文件用于输出生成的改密码的脚本
Open c:\change_passtxt For Output As #
rem 同时在工作表上记录相应的密码以便打印出来备作为记录此处为先写标题
Cells( ) = Username: Cells( ) = Password
row_num =
rem 若第三列非空则创建密码否则退出
Do While Cells(row_num ) <>
temp_str =
For bit_count = To pass_length
char_value = start_asc + Int(Rnd() * rnd_base)
rem 为 : ; < = > ? @
rem 为 [ \ ] ^ _ `
rem 因不愿在unix 密码串中包含该类字符故通过减少已增大的计数器以保证密码的长度同时不将其计入密码串中以排除它们
If (char_value >= And char_value <= ) Or (char_value >= And char_value <= ) Then
bit_count = bit_count
Else
temp_str = temp_str + Chr$(char_value)
End If
Next bit_count
Print # user + Cells(row_num ) + : + temp_str
Cells(row_num ) = temp_str
rem 获取下一行
row_num = row_num +
Loop
rem 所有用户的密码已生成关闭文件
Close #
End Sub