2014-10-23 21 views
5

Come è possibile creare una funzione in ORACLE per verificare la password?Crea funzione di verifica password Oracle 10g

La password deve contenere:

  • almeno 1 maiuscolo

  • contenere almeno 1 caso lungo

  • almeno 1 cifra

  • almeno 8 caratteri

  • non contiene 3 lettere consecutive del nome utente

Finora, ho raggiunto il seguente:

CREATE OR REPLACE FUNCTION dd_pwd_fun(username varchar2, password varchar2) 
RETURN BOOLEAN IS 

PWD_STR VARCHAR2 
USER_NAME 

BEGIN 

PWD_STR = password; 
USER_NAME=username; 

IF LENGTH(PWD_STR) < 8 THEN 
RETURN FALSE; 
END IF; 

if regexp_like(:PWD_STR, '^.*[a-z].*$') -- this is for small letter from a -z 
and regexp_like(:PWD_STR, '^.*[A-Z].*$') -- this is for capital letters 
and regexp_like(:PWD_STR, '^.*[0-9].*$') -- this is for numbers 

Questa è la mia prima volta a lavorare con le espressioni regolari e ho bisogno di aiuto scoprire una soluzione per l'ultimo requisito e voglio anche sapere se sono sulla strada giusta

+0

Quindi hai bisogno di aiuto con l'espressione regolare o di aiuto con "come far rispettare la complessità delle password in Oracle"? –

+0

Per forzare la password, non è quello che mi serve aggiungere la funzione di verifica al profilo desiderato? Ho bisogno di aiuto con le espressioni regolari o il normale PL/SQL per creare questa funzione. – WT86

+1

@NicholasKrasnov Qualche idea o aiuto? – WT86

risposta

1

Beh ho trovato questa soluzione per lavorare

FOR i IN 1..LENGTH(PWD_STR)-2 LOOP 
IF INSTR(LOWER(USER_NAME),SUBSTR(LOWER(PWD_STR),i,3)) > 0 THEN 
RETURN FALSE; 
END IF; 
END LOOP; 
+0

Non dovrebbe essere 'LENGTH (PWD) - 2'? –

+0

Cosa accadrebbe se lasciato così? L'ho provato e funziona ... – WT86

+0

Le ultime due iterazioni non sono necessarie. –

2

Oracle fornisce una funzione da compilare in SYS per la verifica della password e la sua complessità. Lo troverai in $ORACLE_HOME/rdbms/admin/utlpwdmg.sql.

Con versioni diverse, la funzione è stata modificata e sono state aggiunte nuove funzioni. In 10g, il controllo della complessità era abbastanza semplice. Prima della 12c c'erano due funzioni verify_function (10g) e verify_function_11G (11g). Con 12c ci sono altre quattro funzioni, ora12c_verify_function, ora12c_strong_verify_function e due funzioni di supporto complexity_check e string_distance.

Dato che si è in 10g, è possibile scrivere il UDF per rinforzare loin password verification. Cerca le funzioni e il contenuto nelle versioni più recenti e applica una logica simile nella tua UDF. Date un'occhiata a http://www.oradba.ch/2013/07/oracle-12c-new-password-verify-function/

+0

Grazie per il suggerimento, ma quel file non contiene alcun esempio riguardante le lettere consecutive – WT86

+0

Sì, solo per quella cosa devi scrivere la tua logica. E aggiungilo all'UDF. Fammi sapere se non sei in grado di scrivere la logica per questo. –

+0

Non riesco, sto cercando di usare l'espressione regolare ma non riesco ad arrivarci ... Non mi dispiace in alcun modo, sia usando l'espressione regolare o i comandi PL/SQL – WT86

0

Come soluzione generale, vorrei spingere (troppo) verso l'utilizzo di un Password Complexity Verification function. Per quanto riguarda il tuo ultimo requisito:

  • ...
  • non contiene 3 lettere consecutive del nome utente

Ho bisogno di aiuto per trovare una soluzione per l'ultimo requisito [. ..]

Se le prestazioni non sono un problema, è possibile risolverlo a livello di SQL. Ad esempio:

SELECT COUNT(*) INTO nbr_matching_chunk FROM (
    -- Split name in 3 chars chunks 
    SELECT SUBSTR('Sylvain', LEVEL, 3) chunk 
    FROM DUAL CONNECT BY LEVEL <= LENGTH('Sylvain')-2 
) 
NATURAL JOIN 
(
    -- Split password in 3 chars chunks 
    SELECT SUBSTR('painsword', LEVEL, 3) chunk 
    FROM DUAL CONNECT BY LEVEL <= LENGTH('painsword')-2 
) 

Se nbr_matching_chunk è 0, non vi corrispondenza sequenza 3 lettere.

O corso per amore di leggibilità ho hard-coded username e password, ma si dovrebbe essere in grado di sostituire quella dai vostri attuali variabili PL/SQL.

Quindi, devi solo per avvolgere che nel del PASSWORD_VERIFY_FUNCTION tuo profilo.