天天看點

mysql計算随機密碼_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() 函數的定義與更改分隔符使用如下指令:

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 '[email protected]#$%^&*()_+-=`:;<>,.?/';

DECLARE ALL_STRING VARCHAR(255) DEFAULT 'A[email protected]#$%^&*()_+-=`:;<>,.?/';

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

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