Pular para o conteúdo

Fóruns Banco de dados Oracle REGRA DE SEGURANÇA SENHA ORACLE REGRA DE SEGURANÇA SENHA ORACLE

#85787
Avatar photoRegis Araujo
Participante

    Fala David…

    Legal.. e foi na ideia que ele passou.. que eu bolei um script aqui rapido..
    Da uma olhada e ve se ta bom… por favor….


    create or replace function VALIDASENHA(Senha Varchar2) return BOOLEAN is

    Result BOOLEAN := TRUE;
    isNumericA BOOLEAN := TRUE;
    isNumericB BOOLEAN := TRUE;
    isNumericC BOOLEAN := TRUE;
    isCharactersA BOOLEAN := TRUE;
    isCharactersB BOOLEAN := TRUE;
    isCharactersC BOOLEAN := TRUE;
    isSpecialCharA BOOLEAN := TRUE;
    isSpecialCharB BOOLEAN := TRUE;
    isSpecialCharC BOOLEAN := TRUE;
    isAchouNumeric BOOLEAN := FALSE;
    isAchouChar BOOLEAN := FALSE;
    isAchouSpecialChar BOOLEAN := FALSE;
    tamanho NUMBER;
    BEGIN

    tamanho := length(Senha);

    /*
    SOMENTE PERMITE SENHAS COM NO MÍNIMO 10 CARACTERES...
    */
    IF tamanho < 10 THEN
    Result := FALSE;
    ELSE

    FOR i IN 1..tamanho-2 LOOP

    /*
    Esta validação somente irá permitir que seja digitado 2 números por vez..
    Ex:
    PassWord : A11B22C33
    Alimentando variáveis com as informações obtidas com as verificações do campo da senha...
    Identifica se os valores da senha são do Números.
    */
    isNumericA := substr(Senha,i, 1) IN ('0','1','2','3','4','5','6','7','8','9');
    isNumericB := substr(Senha,i+1,1) IN ('0','1','2','3','4','5','6','7','8','9');
    isNumericC := substr(Senha,i+2,1) IN ('0','1','2','3','4','5','6','7','8','9');

    /*
    Esta validação somente irá permitir que seja digitado 2 letras por vez..
    Ex:
    PassWord : AA11BB22CC33
    Alimentando variáveis com as informações obtidas com as verificações do campo da senha...
    Identifica se os valores da senha são Letras (Maiusculas/Minusculas).
    */

    isCharactersA := substr(Senha,i, 1) IN ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','x','z','w','y',
    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','Z','W','Y');
    isCharactersB := substr(Senha,i+1,1) IN ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','x','z','w','y',
    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','Z','W','Y');
    isCharactersC := substr(Senha,i+2,1) IN ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','x','z','w','y',
    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','Z','W','Y');
    /*
    Esta validação somente irá permitir que seja digitado 2 Caracteres Especiais por vez..
    Ex:
    PassWord : AA11+.BB-*22/=CC?@33
    Alimentando variáveis com as informações obtidas com as verificações do campo da senha...
    Identifica se os valores da senha são do tipo CARACTER ESPECIAL.
    */

    isSpecialCharA := substr(Senha,i, 1) IN (' ','ç','Ç','!','@','#','$','%','^','&','.','{','}','*','(',')','_','/','','|','/','',',',';',':','-','+','=','?','~','"','[',']','|','' || chr(39));
    isSpecialCharB := substr(Senha,i+1,1) IN (' ','ç','Ç','!','@','#','$','%','^','&','.','{','}','*','(',')','_','/','','|','/','',',',';',':','-','+','=','?','~','"','[',']','|','' || chr(39));
    isSpecialCharC := substr(Senha,i+2,1) IN (' ','ç','Ç','!','@','#','$','%','^','&','.','{','}','*','(',')','_','/','','|','/','',',',';',':','-','+','=','?','~','"','[',']','|','' || chr(39));

    IF isNumericA AND isNumericB AND isNumericC THEN
    Result := FALSE;
    END IF;

    IF isCharactersA AND isCharactersB AND isCharactersC THEN
    Result := FALSE;
    END IF;

    IF isSpecialCharA AND isSpecialCharB AND isSpecialCharC THEN
    Result := FALSE;
    END IF;

    END LOOP;

    FOR i IN 1..tamanho LOOP

    /*
    Esta validação somente irá verificar se existe pelo menos 1 caracter de cada tipo, pois é obrigatório a digitação de
    pelo menos 1 (UM) caracter de cada tipo..
    Ex:
    PassWord : AA11+.BB-*22/=CC?@33
    Alimentando variáveis com as informações obtidas com as verificações do campo da senha...
    Identifica se os valores da senha são do tipo NUMEROS, LETRAS (Maiusculas/Minusculas) e CARACTERES ESPECIAIS.
    */

    isNumericA := substr(Senha,i, 1) IN ('0','1','2','3','4','5','6','7','8','9');
    isCharactersA := substr(Senha,i, 1) IN ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','x','z','w','y',
    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','Z','W','Y');
    isSpecialCharA := substr(Senha,i, 1) IN (' ','ç','Ç','!','@','#','$','%','^','&','.','{','}','*','(',')','_','/','','|','/','',',',';',':','-','+','=','?','~','"','[',']','|','' || chr(39));

    IF isNumericA THEN
    isAchouNumeric := TRUE;
    END IF;

    IF isCharactersA THEN
    isAchouChar := TRUE;
    END IF;

    IF isSpecialCharA THEN
    isAchouSpecialChar := TRUE;
    END IF;

    END LOOP;

    IF NOT (isAchouNumeric AND isAchouChar AND isAchouSpecialChar) THEN
    Result := FALSE;
    END IF;

    END IF;

    RETURN(Result);

    END VALIDASENHA;

    Caraca… não achei q fosse ficar tão grande aqui no Post… hauhua.. hauah..!!

    Agora tenho algumas duvidas…
    Esta correto como eu alimento a funcão?? Ou a function deve ser criada de outra maneira?!?!!?

    Eu devo criar esta FUNCTION/PROCEDURE com o usuário SYS ou SYSTEM ou com qualquer usuário que tenha a permissão de SYSDBA ???

    Assim.. eu rodo o comando abaixo…

    SQL> CREATE PROFILE REGIS_TESTE_PROFILE LIMIT
    FAILED_LOGIN_ATTEMPTS 5/1440
    PASSWORD_VERIFY_FUNCTION REGIS.VALIDASENHA;

    SQL> CREATE USER REGIS IDENTIFIED BY REGIS EXPIRE
    DEFAULT TABLESPACE TBSESTUDOSDAT
    TEMPORARY TABLESPACE TBSESTUDOSTEMP
    PROFILE REGIS_TESTE_PROFILE;

    Correto???? Assim eu obrigo ao usuário quando logar ter que digitar uma nova senha correto???

    Abraços…!!!