在 MySQL 中根據規則生成隨機密碼
MySQL 5.0 以后的版本開始支持存儲過程,存儲過程具有壹致性、高效性和安全性。MySQL 5.0 之前的版本并不支持存儲過程,然而隨著 MySQL 技術的日趨完善,存儲過程將在以后的項目中得到 廣泛的應用。
在我的應用中,我需要在用戶首次注冊時為該帳號生成一個隨機密碼。所生成的密碼必須滿足一定的要求,這些要求由系統管理員進行配置。
我們提供了下面幾個對密碼的要求規則,這些規則可組合使用:
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') 在MySQL的控制臺編寫函數定義前,先要將數據庫中可能已經存在的此函數定義刪除,然后須將分隔符更改為$,其實我本想將分隔符改成#,后來發現沒有成功,不知道是為什么,在命令行下刪除 RANDOM_PASSWORD() 函數的定義與更改分隔符使用如下命令:
mysql> DROP FUNCTION IF EXISTS RANDOM_PASSWORD; mysql> delimiter $
接下來可以編寫該函數,經過我調試通過的源代碼如下:
CREATE FUNCTION RANDOM_PASSWORD (str VARCHAR(255))
RETURNS VARCHAR(255)
BEGIN
DECLARE UPPER_CASE VARCHAR(26) DEFAULT 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
DECLARE LOWER_CASE VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
DECLARE NUMBERS VARCHAR(10) DEFAULT '0123456789';
DECLARE TEMP_CHARACTER VARCHAR(255) DEFAULT '';
DECLARE NON_ALPHANUMERIC_CHARACTERS VARCHAR(255) DEFAULT '~!@#$%^&*()_+-=`:;<>,.?/';
DECLARE ALL_STRING VARCHAR(255) DEFAULT 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~!@#$%^&*()_+-=`:;<>,.?/';
DECLARE STR_LENGTH INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
DECLARE RANDOM_CHARACTER CHAR(1) DEFAULT ' ';
DECLARE PASSWORD_RETURNED VARCHAR(255) DEFAULT '';
SET STR_LENGTH = CHAR_LENGTH(str);
WHILE i < STR_LENGTH DO
SET TEMP_CHARACTER = SUBSTR(str, i + 1, 1);
CASE TEMP_CHARACTER
WHEN 'N' THEN
SET RANDOM_CHARACTER = SUBSTR(NUMBERS, CEIL( RAND() * ( LENGTH( NUMBERS ) - 1 )), 1);
WHEN 'U' THEN
SET RANDOM_CHARACTER = SUBSTR(UPPER_CASE, CEIL( RAND() * ( LENGTH( UPPER_CASE ) - 1 )), 1);
WHEN 'L' THEN
SET RANDOM_CHARACTER = SUBSTR(LOWER_CASE, CEIL( RAND() * ( LENGTH( LOWER_CASE ) - 1 )), 1);
WHEN 'S' THEN
SET RANDOM_CHARACTER = SUBSTR(NON_ALPHANUMERIC_CHARACTERS, CEIL( RAND() * ( LENGTH( NON_ALPHANUMERIC_CHARACTERS ) - 1 )), 1);
WHEN 'A' THEN
SET RANDOM_CHARACTER = SUBSTR(ALL_STRING, CEIL( RAND() * ( LENGTH( ALL_STRING ) - 1 )), 1);
ELSE
SET RANDOM_CHARACTER = '';
END CASE;
SET PASSWORD_RETURNED = CONCAT(PASSWORD_RETURNED, RANDOM_CHARACTER);
SET i = i + 1;
END WHILE;
RETURN PASSWORD_RETURNED;
END
$ 使用方法:
mysql> select RANDOM_PASSWORD('ULNASN') PASSWORD;
+----------+
| PASSWORD |
+----------+
| Bv1n`8 |
+----------+
1 row in set (0.00 sec) 在我這里將返回的隨機密碼是:Bv1n`8
當然,你運行的結果可能不一樣,因為這是隨機的。
本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!