Ein Passwortgenerator in PL/SQL

Hier habe ich eine kleine, einfache Funktion programmiert, die ein Passwort generiert. Dazu kann man die gewünschte Passwortlänge übergeben und die zu vewendenden Zeichen-Arten (numerische, alphanumerische und Sonderzeichen). Das ganze wurde getestet eine Oracle Datenbank 11.

Passwortgenerator-Funktion

CREATE OR REPLACE FUNCTION generate_password( p_laenge IN NUMBER DEFAULT 0, p_art IN NUMBER DEFAULT 1 )
  RETURN VARCHAR2
/*
   Parameter:   p_laenge:       Die gewünschte Länge des Passwortes
                                Min.:     1
                                Max.:  1000
                p_art:          Werte:    1 = numerische Werte
                                          2 = alphanumerische Werte
                                          3 = Sonderzeichen [!#$%/-]
                                         12 = Liste 1 & 2
                                         13 = Liste 1 & 3
                                         23 = Liste 2 & 3
                                        123 = Liste 1,2 & 3
*/
IS
  passwd_laenge             NUMBER := p_laenge; -- L
  passwd_art                NUMBER := p_art; -- A
  passwd                    VARCHAR2( 1000 CHAR ) := '';

  TYPE erlaubt IS VARRAY( 1000 ) OF VARCHAR2( 1 CHAR );
  array_zeichen erlaubt;

  zeichenposition           NUMBER; -- N
BEGIN
  IF p_laenge <= 0 THEN
    RETURN 'Fehler: Die Passwortlänge muss mindestens 1 sein.';
  ELSIF p_laenge > 1000 THEN
    RETURN 'Fehler: Die Passwortlänge darf höchstens 1000 sein.';
  END IF;

    CASE
      WHEN passwd_art = 1 THEN
         array_zeichen := erlaubt( '1','2','3','4','5','6','7','8','9','0' );
      WHEN passwd_art = 2 THEN
        array_zeichen := erlaubt( 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
                                  'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' );
      WHEN passwd_art = 3 THEN
         array_zeichen := erlaubt( '!','#','$','%','/','-' );
      WHEN passwd_art = 12 THEN
         array_zeichen := erlaubt( '1','2','3','4','5','6','7','8','9','0',
                                   'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
                                   'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' );
      WHEN passwd_art = 13 THEN
         array_zeichen := erlaubt( '1','2','3','4','5','6','7','8','9','0',
                                   '!','#','$','%','/','-' );
      WHEN passwd_art = 23 THEN
         array_zeichen := erlaubt( 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
                                   'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
                                   '!','#','$','%','/','-' );
      WHEN passwd_art = 123 THEN
         array_zeichen := erlaubt( '1','2','3','4','5','6','7','8','9','0',
                                   'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
                                   'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
                                   '!','#','$','%','/','-' );
      ELSE
         RETURN 'Fehler: Die Passwortart ist falsch.';
   END CASE;

  FOR i IN 1 .. passwd_laenge LOOP
    zeichenposition := ROUND( DBMS_RANDOM.VALUE( 1, array_zeichen.COUNT ) );
    passwd := passwd || array_zeichen( zeichenposition );
  END LOOP;
   
  RETURN passwd;
EXCEPTION
  WHEN OTHERS THEN
    RETURN '[Exeption]: OTHERS.';
END;
/

AUFRUF DER FUNKTION

BEGIN
   FOR i IN 1 .. 10
   LOOP
     DBMS_OUTPUT.PUT_LINE( generate_password( 18, 13 ) );
   END LOOP;
END;

BEISPIELAUSGABE

$%0#!563724!/9%#24
%%86#$457$81!0-629
5%132259$949626778
/23-946-#775447%%3
5385%/606$3%90!360
#9%#9868#472!03$!5
7508$!2$079#%/#507
090485//380$4/%502
5$774143788-753$-3
974$/685#8!3$2#3!$

Schreibe einen Kommentar