zoukankan      html  css  js  c++  java
  • Oracle 生成随机密码

    需求:需要定期更改密码。要求是1、密码位数11位。2、必须包含大小写字母、数字、特殊字符。3、排除一些特殊字符如()、@、&

    oracle数据库中有可已生成随机密码包dbms_random,但是用起来有点儿不方便,满足不了上面的需求。一些网页工具或者小软件,使用起来也不方便。

    所以就想在oracle自己写函数来实现,并且可以建立数据库表方便管理密码,数据做这些事情有天生的优势。

    第一步:在数据库中创建用来管理密码的表。

    举例:生成Linux中oracle、grid用户随机密码

    CREATE TABLE HOST_TAB (HOSTID NUMBER, HOSTNAME VARCHAR2(100), DESCRIPTION VARCHAR2(2000)); --创建业务系统列表

    CREATE TABLE PASSWORD_TAB (HOSTID NUMBER,ORACLE_PASSWORD VARCHAR2(100),GRID_PASSWORD VARCHAR2(100),SHELL_TEXT VARCHAR2(100),CHANGE_DATE DATE) ;--创建密码维护表

    第二步:创建可以随机生成密码的函数。

    随便googel了一把,原来有国外的哥们儿自己写函数实现了,膜拜下… 原文地址如下:同时,希望copy的网友转载博客时说明出处

    http://mahmoudoracle.blogspot.tw/2012/08/generate-random-password-in-oracle.html 

    如果不想用这哥们儿写的函数,也可以学习oracle数据库dbms_random.string函数,学习并修改代码如下:不得不说oracle很值得我们学习

    CREATE OR REPLACE FUNCTION random_password(password_num in varchar2)
      RETURN VARCHAR2
      PARALLEL_ENABLE is
      optx char(1);
      rng  NUMBER;
      n    BINARY_INTEGER;
      ccs  VARCHAR2(128); -- candidate character subset
      xstr VARCHAR2(4000);
    BEGIN
      FOR i IN 1 .. length(password_num) LOOP
        /* Get random integer within specified range */
        n := TRUNC(rng * dbms_random.value) + 1;
        /* Append character to random_password2  */
        xstr := xstr || SUBSTR(ccs, n, 1);
        optx := SUBSTR(password_num, I, 1);
        IF optx = 'u' THEN
          -- upper case alpha characters only
          ccs := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
          rng := 26;
        ELSIF optx = 'l' THEN
          -- lower case alpha characters only
          ccs := 'abcdefghijklmnopqrstuvwxyz';
          rng := 26;
        ELSIF optx = 'a' THEN
          -- alpha characters only (mixed case)
          ccs := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' || 'abcdefghijklmnopqrstuvwxyz';
          rng := 52;
        ELSIF optx = 'n' THEN
          -- any numeric characters (upper)
          ccs := '0123456789';
          rng := 10;
        ELSIF optx = 'x' THEN
          -- any special characters (upper)
          ccs := ' !"#$%&()*+,-./:;<=>?@';
          rng := 23;
        ELSIF optx = 'p' THEN
          -- any printable char (ASCII subset)
          ccs := ' !"#$%&''()*+,-./' || '0123456789' || ':;<=>?@' ||
                 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' || '[]^_`' ||
                 'abcdefghijklmnopqrstuvwxyz' || '{|}~';
          rng := 95;
        ELSE
          ccs := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
          rng := 26; -- default to upper case
        END IF;
     
      END LOOP;
      RETURN xstr;
    END random_password;

    第三步:使用存储过程来实现。并且创建数据库调度任务定期修改密码。

    create or replace procedure change_passwords(host_name varchar2) as

      cursor v_cur is
        select t1.hostid from host_tab t1 where t1.hostname = lower(host_name);
    begin
      for v_i in v_cur loop
        begin
          insert into password_tab
            (hostid, oracle_password, grid_password, shell_text, change_date)
          values
            (v_i.hostid,
             '',
             '',
             'echo oracle:' || RANDOM_PASSWORD(‘ulaxpnlaxpnl’) ||
             '|chpasswd && echo grid:' || RANDOM_PASSWORD('ulaxpnlaxpnl') ||
             '|chpasswd',
             sysdate);
          commit;
        end;
      end loop;
      update password_tab t
         set t.oracle_password = substr(t.shell_text, 13, 11),
             t.grid_password   = substr(t.shell_text, 47, 11);
      commit;
    end;

    使用:

    execute change_passwords(hostname=>’test’); test 为host_tab 表中hostname。

    select t2.hostname,
           t2.description,
           t1.oracle_password,
           t1.grid_password,
           t1.shell_text,
           t1.change_date
      from password_tab t1
      left join host_tab t2
        on t1.hostid = t2.hostid;

    最后在root用户下执行shell_text中的命令。

    也可以通过oracle 的dbms scheduler job 和 crontab来自动实现。

    -------------------------------------------------------------------------------------------------

    允许copy,转载请说明出处….

  • 相关阅读:
    20 个 .NET 6 新增的 API
    巅峰对决!Spring Boot VS .NET 6
    【.NET 遇上 GraphQL】 ChilliCream 平台介绍
    使用 CliWrap 让C#中的命令行交互举重若轻
    微软开源的Web测试和自动化神器 Playwright
    GraphQL 到底有什么魔力?
    win切换jdk版本
    WebBug Java漏洞靶场 Java代码审计
    Docker镜像安全的一些(初级)检测方法
    权限安全管控的设计想法
  • 原文地址:https://www.cnblogs.com/AlbertCQY/p/3267747.html
Copyright © 2011-2022 走看看