PLSQL中生成随机密码的函数
Function to generate random password in PLSQL
生成随机密码的函数
Genpass(p 整数,
p大写
p 小写
p 特殊字符)
return 密码 varchar2;
select 生成密码(2,2,1,2)
它包含2个数字,2个大写字符,#等特殊字符和2个数字;
Oracle DBMS_RANDOM.STRING 功能不允许您明确声明需要特殊字符。此外,当您对每种类型的字符使用 DBMS_RANDOM.STRING 时,您最终会得到一个始终具有相同结构的系列(这甚至可能再次成为安全问题)。
但是,如果您不想一直使用相同的结构,则必须编写一些东西(以另一种随机方式)分发结构化密码的字符。
另一种选择是使用我从 AskTom 条目中采用的示例;您利用现有功能并尝试直到获得结果:
create or replace FUNCTION GENPWD(
p_numbers IN NUMBER,
p_specialchar IN NUMBER,
p_lowercase IN NUMBER,
p_uppercase IN NUMBER) return varchar2
IS
v_length number := p_numbers + p_specialchar + p_lowercase + p_uppercase;
v_password varchar2(200);
v_iterations number := 0;
v_max_iterations number := 500;
BEGIN
loop
v_password := dbms_random.string('p',v_length);
v_iterations := v_iterations + 1;
exit when (regexp_count(v_password,'[a-z]') = p_lowercase
and regexp_count(v_password,'[A-Z]') = p_uppercase
and regexp_count(v_password,'[0-9]') = p_numbers)
or v_iterations=v_max_iterations;
end loop;
if v_iterations = v_max_iterations THEN
v_password := '';
end if;
return(v_password);
END;
生成随机密码的函数 Genpass(p 整数, p大写 p 小写 p 特殊字符) return 密码 varchar2; select 生成密码(2,2,1,2) 它包含2个数字,2个大写字符,#等特殊字符和2个数字;
Oracle DBMS_RANDOM.STRING 功能不允许您明确声明需要特殊字符。此外,当您对每种类型的字符使用 DBMS_RANDOM.STRING 时,您最终会得到一个始终具有相同结构的系列(这甚至可能再次成为安全问题)。
但是,如果您不想一直使用相同的结构,则必须编写一些东西(以另一种随机方式)分发结构化密码的字符。
另一种选择是使用我从 AskTom 条目中采用的示例;您利用现有功能并尝试直到获得结果:
create or replace FUNCTION GENPWD(
p_numbers IN NUMBER,
p_specialchar IN NUMBER,
p_lowercase IN NUMBER,
p_uppercase IN NUMBER) return varchar2
IS
v_length number := p_numbers + p_specialchar + p_lowercase + p_uppercase;
v_password varchar2(200);
v_iterations number := 0;
v_max_iterations number := 500;
BEGIN
loop
v_password := dbms_random.string('p',v_length);
v_iterations := v_iterations + 1;
exit when (regexp_count(v_password,'[a-z]') = p_lowercase
and regexp_count(v_password,'[A-Z]') = p_uppercase
and regexp_count(v_password,'[0-9]') = p_numbers)
or v_iterations=v_max_iterations;
end loop;
if v_iterations = v_max_iterations THEN
v_password := '';
end if;
return(v_password);
END;