Como Validar Senha Regexp_Like?

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
meguelito
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 60
Registrado em: Ter, 17 Jan 2006 1:45 pm
Localização: Santa Catarina
Att.:
Alan Juliano Metzger
Programador Oracle
Inside System Informática
Msn/E-mail: alanjuliano@yahoo.com.br

Bom dia pessoal,

Estou tentando fazer uma validação de restrição de caracteres na senha, ou seja, quero criar uma função que valide se a senha possua letras minusculas, maiusculas, números e caracteres especiais, porém gostaria que independente da ordem o regexp_like validasse.

O máximo que consegui fazer foi uma regra assim:

SELECT *
FROM DUAL
WHERE REGEXP_LIKE('*1aA',
'([a-z][A-Z][0-9][*@#$%]|[A-Z][a-z][0-9][*@#$%]|[0-9][A-Z][a-z][*@#$%]|[0-9][a-z][A-Z][*@#$%]|'||
'[*@#$%][a-z][A-Z][0-9]|[*@#$%][A-Z][a-z][0-9]|[*@#$%][0-9][A-Z][a-z]|[*@#$%][0-9][a-z][A-Z]|'||
'[a-z][*@#$%][A-Z][0-9]|[A-Z][*@#$%][a-z][0-9]|[0-9][*@#$%][A-Z][a-z]|[0-9][*@#$%][a-z][A-Z]|'||
'[a-z][A-Z][*@#$%][0-9]|[A-Z][a-z][*@#$%][0-9]|[0-9][A-Z][*@#$%][a-z]|[0-9][a-z][*@#$%][A-Z])')

Que faz o que eu quero mas achei muito complexa, teria uma forma mais fácil de eu validar a senha assim:

Senha: 'a1A%' - Senha correta.
Senha: 'A1a%' - Senha correta.
Senha: '%Aa1' - Senha correta.
Senha: 'A%1a' - Senha correta.
Senha: 'A1a' - Senha incorreta pois não tem caracter especial.

E assim por diante, então a idéia é que possua ao menos uma ocorrencia de cada validação.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Olá,

Não creio que tenha como especificar numa única expressão regular as várias alternativas... Teria que testar em diversas ordens e testar também que não aparecem caracteres inválidos, fora daqueles permitidos por sua regra.

Na minha opinião fica bem mais legível separar em mais de uma função, com AND:

Selecionar tudo

SQL> with t as (
  2  select 'a1A%' senha from dual union all
  3  select 'A1a%' senha from dual union all
  4  select '%Aa1' senha from dual union all
  5  select 'A%1a' senha from dual union all
  6  select 'A% 1a' senha from dual union all
  7  select 'A% 1a' || chr(13) || chr(10) senha from dual union all
  8  select 'A%á1a'  senha from dual union all
  9  select 'A1a'  senha from dual
 10  ) -- fim dos dados de teste
 11  select senha,
 12         case when regexp_like(senha, '[*@#$%]')
 13                   and regexp_like(senha, '[A-Z]')
 14                   and regexp_like(senha, '[a-z]')
 15                   and regexp_like(senha, '[0-9]')
 16                   and regexp_instr(senha, '[^*@#$%A-Za-z0-9]') = 0
 17           then 'VÁLIDO' else 'INVÁLIDO' end testa_senha
 18    from t;
 
SENHA   TESTA_SENHA
------- -----------
a1A%    VÁLIDO
A1a%    VÁLIDO
%Aa1    VÁLIDO
A%1a    VÁLIDO
A% 1a   INVÁLIDO
A% 1a   INVÁLIDO
A%á1a   VÁLIDO
A1a     INVÁLIDO
 
8 rows selected
Tem tamanho mínimo? Se for o caso, teria que testar o length(senha) between X and Y também.
meguelito
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 60
Registrado em: Ter, 17 Jan 2006 1:45 pm
Localização: Santa Catarina
Att.:
Alan Juliano Metzger
Programador Oracle
Inside System Informática
Msn/E-mail: alanjuliano@yahoo.com.br

Bom não consegui em uma só mas acho que simplifiquei as duas.

SELECT *
FROM dual
WHERE regexp_like('&senha', '^.*[[:upper:]].*$')
AND regexp_like('&senha', '^.*[[:lower:]].*$')
AND regexp_like('&senha', '^.*[0-9].*$')
AND regexp_like('&senha', '^.*[^A-Z,0-9].*$')

Obrigado pela ajuda fsitja.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 17 visitantes