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() 函数的定义与更改分隔符使用如下命令:

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

当然,你运行的结果可能不一样,因为这是随机的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值