数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

一个生成Oracle用户密码的通用小程序


发布日期:2022年02月06日
 
一个生成Oracle用户密码的通用小程序

做为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

               

上一篇:Oracle10g学习之闪回数据库

下一篇:如何移动表达到减小数据文件大小的目的