随机密码生成函数

function for random password generate

我想要一个生成随机密码的功能。我会给功能 四个参数为密码将包含多少个数字,密码将包含多少个大写字母,密码将包含多少个小写字母以及密码将包含多少个特殊字符以及 return 密码将是这些输入参数的混合。

create or replace function(
  number_of_digits         in number,
  no_of_special_characters in number,
  no_of_lower              in number,
  no_of_upper              in number
) return varchar2
as
  password

您可以使用函数dbms_random.string('P', length)。根据 Oracle 的文档,P 参数打印所有可打印字符。

这是一个例子:

select replace(dbms_random.string('P', 10), ' ', 'x') str from dual;

我在这个例子中使用了替换,以消除 space 的可能性,因为用户有时很难理解它们。

您可以使用:

create function generate_password(
  no_of_digits             in number,
  no_of_special_characters in number,
  no_of_lower              in number,
  no_of_upper              in number
) return varchar2
AS
  password VARCHAR2(4000);
  digits   CONSTANT VARCHAR2(10) := '0123456789';
  lower    CONSTANT VARCHAR2(26) := 'abcdefghijklmnopqrstuvwxyz';
  upper    CONSTANT VARCHAR2(26) := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  special  CONSTANT VARCHAR2(32) := '!"£$%^&*()-_=+{}[]<>,.\|/?;:''@#';
BEGIN
  SELECT LISTAGG(letter, NULL) WITHIN GROUP (ORDER BY DBMS_RANDOM.VALUE)
  INTO   password
  FROM   (
    SELECT SUBSTR(
             digits,
             FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(digits) + 1)),
             1
           ) AS letter
    FROM   DUAL
    CONNECT BY LEVEL <= no_of_digits
    UNION ALL
    SELECT SUBSTR(
             lower,
             FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(lower) + 1)),
             1
           ) AS letter
    FROM   DUAL
    CONNECT BY LEVEL <= no_of_lower
    UNION ALL
    SELECT SUBSTR(
             upper,
             FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(upper) + 1)),
             1
           ) AS letter
    FROM   DUAL
    CONNECT BY LEVEL <= no_of_upper
    UNION ALL
    SELECT SUBSTR(
             special,
             FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(special) + 1)),
             1
           ) AS letter
    FROM   DUAL
    CONNECT BY LEVEL <= no_of_special_characters
  );
  
  RETURN password;
END;
/

然后:

SELECT generate_password(5,3,4,4)
FROM   DUAL
CONNECT BY LEVEL <= 5;

可能随机输出:

GENERATE_PASSWORD(5,3,4,4)
1>9zq$Qw%E16fJ8B
J$rYKtH2813vt]7}
fRh2bS8U0.55]Vs=
{N6Zd£Or8e5u5R|4
H9c:_5VFmyZ58't7

db<>fiddle here