在 MySQL 中根據規則生成隨機密碼

MySQL 5.0 之後的版本開始支持存儲過程,存儲過程具備壹致性、高效性和安全性。MySQL 5.0 以前的版本並不支持存儲過程,然而隨着 MySQL 技術的日趨完善,存儲過程將在之後的項目中獲得普遍的應用。mysql

在個人應用中,我須要在用戶首次註冊時爲該賬號生成一個隨機密碼。所生成的密碼必須知足必定的要求,這些要求由系統管理員進行配置。sql

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

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

5- 必須有非字母和數字的字符 NON_ALPHANUMERIC_CHARACTER =====> 縮寫 [S]安全

所以我想經過建立一個動態函數 "RANDOM_PASSWORD" 來根據要求返回隨機的密碼。函數

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

例如要求以下:命令行

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

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

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

你可使用下面的方法來調用這個函數:code

RANDOM_PASSWORD('ULNASN')

在MySQL的控制檯編寫函數定義前,先要將數據庫中可能已經存在的此函數定義刪除,而後須將分隔符更改成$,其實我本想將分隔符改爲#,後來發現沒有成功,不知道是爲何,在命令行下刪除 RANDOM_PASSWORD() 函數的定義與更改分隔符使用以下命令:it

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

固然,你運行的結果可能不同,由於這是隨機的。

相關文章
相關標籤/搜索