在 Oracle 中生成隨機密碼

openkk 12年前發布 | 21K 次閱讀 Oracle 數據庫服務器

在我的應用中,我需要在用戶首次注冊時為該帳號生成一個隨機密碼。所生成的密碼必須滿足一定的要求,這些要求由系統管理員進行配置。

我們提供了下面幾個對密碼的要求規則,這些規則可組合使用:

1- 要求大寫字母 UPPERCASE            =====> 縮寫 [U]
2- 要求小寫字母 LOWERCASE           =====> 縮寫 [L]
3- 要求使用數字 NUMBER                  =====> 縮寫 [N]
4- 可以是任意字符 any character    =====> 縮寫 [A]

5- 必須有非字母和數字的字符 NON-ALPHANUMERIC character =====> 縮寫 [S]

因此我想通過創建一個動態函數 "RANDOM_PASSWORD" 來根據要求返回隨機的密碼。

系統管理員只需要傳遞所需密碼的規則就會返回對應的隨機密碼。

例如要求如下:

首字符必須大寫             ======> U
第二個字符必須小寫       ======> L
第三個字符必須是數字    ======>N
第四個字符隨意             ======>A
第五個字符必須是非字母和數字  ======>S
第六個字符必須是數字    ======> N   

那么你可以使用 "ULNASN" 參數來獲取隨機密碼。

所生成的密碼程度跟傳遞的參數長度是一致的。在我們這個例子中生成的密碼長度是 6。

你可以使用下面方法來調用這個函數

RANDOM_PASSWORD('ULNASN');
該函數的源碼如下:
CREATE OR REPLACE FUNCTION RANDOM_PASSWORD (IN_TEMPLATE IN VARCHAR2)  
 RETURN VARCHAR2 IS  
 LC$CRITERIA VARCHAR2(1);  
 LC$PASSWORD VARCHAR2(500);  
 LC$PATTERN VARCHAR2(500);  
 LN$INDX NUMBER;  
 BEGIN  
 /*1-Character should be UPPERCASE     =====> Abbreviation [U]  
 2- Character should be LOWERCASE      =====> Abbreviation [L]  
 3- Character should be NUMBER         =====> Abbreviation [N]  
 4- Character should be any character     =====> Abbreviation [A]  
 5- Character should be NON-ALPHANUMERIC character =====> Abbreviation [S]*/  
   LC$CRITERIA := '';  
   LC$PASSWORD := '';  
   FOR I IN 1.. LENGTH(IN_TEMPLATE) LOOP  
     LC$CRITERIA := SUBSTR(IN_TEMPLATE,I,1);  
     IF UPPER(LC$CRITERIA ) = 'U' THEN   
       LC$PATTERN := q'[ABCDEFGHIJKLMNOPQRSTUVWXYZ]';  
     ELSIF UPPER(LC$CRITERIA ) = 'L' THEN   
        LC$PATTERN := q'[abcdefghijklmnopqrstuvwxyz]';  
     ELSIF UPPER(LC$CRITERIA ) = 'N' THEN   
        LC$PATTERN := q'[0123456789]';  
     ELSIF UPPER(LC$CRITERIA ) = 'A' THEN   
        LC$PATTERN := q'[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]';  
     ELSIF UPPER(LC$CRITERIA ) = 'S' THEN   
        LC$PATTERN := q'[~!@#$%^&*()_+-}{|":;?.,<>[]/\]';  
     ELSE  
        LC$PATTERN := q'[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789]';  
     END IF;  
     LN$INDX := TRUNC( LENGTH(LC$PATTERN) * DBMS_RANDOM.VALUE) + 1;  
     LC$PASSWORD := LC$PASSWORD || SUBSTR(LC$PATTERN,LN$INDX,1);  
   END LOOP;  
   RETURN LC$PASSWORD;  
END RANDOM_PASSWORD;  
使用方法:
SELECT RANDOM_PASSWORD ('ULNASN') FROM DUAL;  

在我這里將返回的隨機密碼是:Pq51{0

當然,你運行的結果可能不一樣,因為這是隨機的。

英文原文

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!