程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 一個生成Oracle用戶密碼的通用小程序

一個生成Oracle用戶密碼的通用小程序

編輯:Oracle數據庫基礎

做為Unix 系統管理員,Oracle 數據庫管理員,Oracle ERP 應用系統管理員,需要不定期地更改各系統中重要用戶的密碼,以保證系統及數據的安全。

但是,由於所管理的小型機及數據庫、應用系統較多,每月更改近百個用戶的密碼,不論是密碼的生成,還是密碼的更改,工作量均很大,尤其是密碼的生成,為了加強安全性,密碼不能太簡單,最好為字母與數字的隨機組合。但大量的密碼,若不借助自動生成,則其編排是Oracle ERP 系統中應用系統用戶(指各子系統的用戶,非指具體應用用戶)同時也是Oracle 數據庫用戶(如應收模塊,用戶為 AR,AR既是數據庫用戶,又是應用用戶),而且,只有 applsyspub(登錄系統的公用用戶),applsys(應用基礎用戶),aPPS(具體應用操作用戶)為必須為應用系統中密碼與數據庫密碼一致外,其它應用的數據庫用戶密碼可以與應用系統中密碼中不一致,只需在對應用系統進行打 patch 工作時才需將其改為一致。因而,可在打 patch 前,在應用系統中將應用系統用戶密碼修改為與數據庫一致即可,平時不用修改其密碼,這樣一則減少了工作量,二則加強了系統的安全性。

更改數據庫用戶密碼可通過在 sqlplus 執行 alter user identifIEd by 密碼 的命令而實現,因而,可以通過自動生成密碼腳本的方式,高效地完成密碼的更改工作。而 Unix 用戶密碼則由於需由管理員負責更改密碼的並不多,故可在自動生成後,手工進行修改。

為了生成較為復雜的密碼,同時提高工作效率,我用 Excel 自帶的 VBA 編寫了一個小腳本,運行該程序,則自動生成一個更改用戶密碼的腳本,同時,將用戶密碼記錄在工作表上,以便於打印出來,保存在密碼本中,做為記錄。

首先,需在工作表中第一列輸入各個要修改密碼的數據庫用戶的用戶名,在第三列輸入各

然後,運行腳本 gen_pass_oracle ,則自動生成Oracle 用戶的相應的密碼;運行腳本gen_pass_unix ,則自動生成unix 操作系統用戶的相應的密碼。 生成的Oracle 數據庫用戶密碼保存在 change_pass.sql 中,可在 sqlplus 中調用該腳本。生成的Unix 用戶密碼保存在change_pass.txt 中,需手工逐個地更改密碼。 可通過在程序首部修改 pass_length 的值的方法,確定生成的密碼的長度;可通過在程序首部修改 start_asc 的方法,確定密碼的組成 0-9,A-Z還是僅 A-Z其主要實現為:通過檢查工作表中每一行第1列(或第3列)是否為空,判斷是否結束密碼生成工作。若非空,即有用戶名,則進行循環,生成在程序頭部定義的指定長度的密碼串。密碼串中的字符為通過起始字符的 ascii 值加上隨機數產生的隨機值得到的新的 ascii 值,再將其轉換為字符型,並加入密碼串中。當密碼串的長度達到指定長度時,將其組合為一個sql 語句寫入文件中,同時,在該行的第2列(或第4列)中寫入該密碼串。

同時,考慮到在 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(50) As String '用戶名 
   dim pass_length as integer '定義生成的密碼的長度 
   dim start_asc as integer ' 定義從哪個字符開始生成 
   pass_length = 8 ' 設定密碼長度為 8 位 
   Rem start_asc = 48 ' 設定密碼從 0 開始 
   start_asc = 65 ' 設定密碼從 A 開始 
   rem 由於 Oracle 數據庫用戶密碼不區分大小寫,故,視所選擇的起始字母,決定隨機數
   rnd_base = 90 - start_asc 
   ? 
   rem 打開文件,用於輸出生成的改密碼的腳本 
   Open "c:change_pass.sql" For Output As #1 
   rem 同時,在工作表上記錄相應的密碼,以便打印出來備作為記錄,此處為先寫標題 
   Cells(1, 1) = "Username": Cells(1, 2) = "Password" 
   Cells(1, 3) = "Username": Cells(1, 4) = "Password" 
   rem 先生成 apps 的密碼,但腳本中加上注釋,因 aPPS密碼必須與應用程序一起改 
   rem 先初始化密碼串為空白 
   temp_str = "" 
   For bit_count = 1 To pass_length 
   char_value = start_asc + Int(Rnd(1) * rnd_base) 
   rem 此處為為防=號引起 Excel 誤認為是公式,從而程序出錯。 
   If char_value = 61 Then 
   char_value = 62 
   End If 
   rem 組合成密碼 
   temp_str = temp_str + Chr$(char_value) 
   Next bit_count 
   rem 將生成的 apps 密碼輸出到腳本文件 
   Print #1, "REM alter user apps" + " identified by " + temp_str + ";" 
   rem 同時,記錄在工作表上 
   Cells(2, 3) = "APPS": Cells(2, 4) = temp_str 
   rem 需生成密碼的用戶名從 row_num 行開始 
   row_num = 2 
   rem 若第一列非空,則創建密碼,否則退出   Do While Cells(row_num, 1) <> "" 
   temp_str = "" 
   For bit_count = 1 To pass_length 
   char_value = start_asc + Int(Rnd(1) * rnd_base) 
   If char_value = 61 Then 
   char_value = 62 
   End If 
   temp_str = temp_str + Chr$(char_value) 
   Next bit_count 
   Print #1, "alter user " + Cells(row_num, 1) + " identifIEd by " + temp_str + 
   Cells(row_num, 2) = temp_str 
   rem 獲取下一行 
   row_num = row_num + 1 
   Loop 
   rem 所有用戶的密碼已生成,關閉文件 
   Close #1 
   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(50) As String '用戶名 
   dim pass_length as integer '定義生成的密碼的長度 
   dim start_asc as integer ' 定義從哪個字符開始生成 
   pass_length = 8 
   start_asc = 48 ' 0 
   Rem start_asc = 65 ' A 
   rem 由於 unix 密碼支持大小寫,故,視所選擇的起始字母,決定隨機數的范圍,以確保
   rnd_base = 122 - start_asc 
   ? 
   rem 打開文件,用於輸出生成的改密碼的腳本 
   Open "c:change_pass.txt" For Output As #1 
  rem 同時,在工作表上記錄相應的密碼,以便打印出來備作為記錄,此處為先寫標題 
   Cells(1, 3) = "Username": Cells(1, 4) = "PassWord" 
   row_num = 2 
   rem 若第三列非空,則創建密碼,否則退出   Do While Cells(row_num, 3) <> "" 
   temp_str = "" 
   For bit_count = 1 To pass_length 
   char_value = start_asc + Int(Rnd(1) * rnd_base) 

  rem 91-94 為 [ ] ^ _ ` 
   rem 因不願在unix 密碼串中包含該類字符,故,通過減少已增大的計數器以保證密碼的
長度,同時,不將其計入密碼串中,以排除它們 
   If (char_value >= 58 And char_value <= 64) Or (char_value >= 91 And char_value <= 96) Then 
   bit_count = bit_count - 1 
   Else 
   temp_str = temp_str + Chr$(char_value) 
   End If 
   Next bit_count 
   Print #1, "user " + Cells(row_num, 1) + " : " + temp_str 
   Cells(row_num, 4) = temp_str 
   rem 獲取下一行 
   row_num = row_num + 1 
   Loop 
   rem 所有用戶的密碼已生成,關閉文件 
   Close #1 
   End Sub
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved