2014-10-23 14 views
5

Jak można utworzyć funkcję w ORACLE, aby sprawdzić hasło?Utwórz funkcję weryfikacji hasła Oracle 10g

Hasło powinno zawierać:

  • przynajmniej 1 wielkimi literami

  • przynajmniej 1 małą długo

  • przynajmniej 1 cyfra

  • co najmniej 8 znaków

  • nie zawierają 3 kolejne litery nazwy użytkownika

Dotychczas dotarłem następujące:

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 

To jest mój pierwszy raz współpracuje z wyrażeń regularnych i potrzebuję pomocy ustaleniu rozwiązanie dla ostatniego wymagania, a także chcę wiedzieć, czy jestem na dobrej drodze

+0

Więc trzeba pomóc w wyrażeniu regularnym lub pomóc „jak egzekwować hasło złożoność w Oracle”? –

+0

Czy wymuszenie hasła nie jest tym, czego potrzebuję, aby dodać funkcję weryfikacji do pożądanego profilu? Potrzebuję pomocy z wyrażeniem regularnym lub zwykłym PL/SQL w tworzeniu tej funkcji. – WT86

+1

@NicholasKrasnov Każdy pomysł lub pomoc? – WT86

Odpowiedz

1

Dobrze znalazłem to rozwiązanie pracować

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

Czy nie powinien to być "DŁUGOŚĆ (PWD) - 2"? –

+0

Co by się stało, gdyby tak zostało? Przetestowałem to i jego działanie ... – WT86

+0

Ostatnie dwie iteracje nie są wymagane. –

2

Oracle zapewnia funkcję do kompilacji w ramach SYS w celu weryfikacji hasła i jego złożoności. Znajdziesz go w $ORACLE_HOME/rdbms/admin/utlpwdmg.sql.

Przy różnych wersjach funkcja została zmodyfikowana i dodano nowe funkcje. W 10g kontrola złożoności była dość prosta. Przed 12c istniały dwie funkcje: verify_function (10g) i verify_function_11G (11g). W przypadku wersji 12c istnieją jeszcze cztery funkcje: ora12c_verify_function, ora12c_strong_verify_function i dwie funkcje pomocnicze: complexity_check i string_distance.

Ponieważ jesteś na 10g, możesz napisać swoją UDF, aby wymusić silniejszą complexity check w password verification. Wyszukaj funkcje i zawartość w nowszych wersjach i zastosuj podobną logikę w swoim UDF. Spójrz na http://www.oradba.ch/2013/07/oracle-12c-new-password-verify-function/

+0

Dziękuję za poradę, ale ten plik nie zawiera żadnego przykładu dotyczącego kolejnych liter – WT86

+0

Tak, właśnie do tego trzeba napisać własną logikę. I dodaj go do UDF. Daj mi znać, jeśli nie jesteś w stanie napisać na to logiki. –

+0

Nie jestem w stanie, próbuję użyć wyrażenia regularnego, ale nie mogę się tam dostać ... Nie mam nic przeciwko, bez względu na to, czy używam wyrażenia regularnego, czy poleceń PL/SQL – WT86

0

Jako ogólne rozwiązanie, chciałbym naciskać (zbyt) w kierunku korzystania z Password Complexity Verification function. Jeśli chodzi o ostatni wymóg:

  • ...
  • nie zawierają 3 kolejne litery nazwy użytkownika

Potrzebuję pomocy w znalezieniu się rozwiązanie ostatniego wymogu [. ..]

Jeśli występy nie są problemem, prawdopodobnie można rozwiązać to na poziomie SQL. Na przykład:

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 
) 

Jeśli nbr_matching_chunk wynosi 0, nie ma dopasowania sekwencja 3-literowe.

Oczywiście ze względu na czytelność, mam zakodowane na stałe username i password, ale powinieneś być w stanie zastąpić to przez rzeczywiste zmienne PL/SQL.

Potem trzeba tylko owinąć że w profilu znajduje PASSWORD_VERIFY_FUNCTION.

Powiązane problemy