Muchas empresas cuentan con políticas de seguridad donde se deben de seguir ciertas reglas.
En oracle 11G estas políticas se pueden implementar mediante una función que valide el password. En este escenario, nuestra política de seguridad consta de tres requerimientos para definir un password, el cuál va a ser controlado por la función VALIDA_PASSWORD.
La primera regla especifica que el password debe constar de al menos seis caracteres, el segundo no permite usar como password el nombre del usuario ni la palabra "password", la tercera regla requiere que el password contenga al menos una letra, un dígito y un signo de puntuación. Si por alguna razón el password que se intenta definir no cumple con estas tres políticas, la función desplegara una excepción y el cambio de password fallara.
Debemos de crear la siguiente función con el usuario SYS.
CREATE OR REPLACE FUNCTION VALIDA_PASSWORD
(username VARCHAR2
,password VARCHAR2
,old_password VARCHAR2
) RETURN BOOLEAN
IS
BEGIN
-- Verifica que contenga al menos seis caracteres
IF LENGTH(password) < 6 THEN
raise_application_error(-20001,
'El password debe de contener al menos seis caracteres');
END IF;
-- Verifica que el password no contenga el nombre del usuario en
-- mayúsculas, minúsculaso la palabra password
IF ( regexp_like(password,username,'i')
OR regexp_like(password,'password','i')) THEN
raise_application_error(-20002,
'El Password no puede contener el nombre del usuario
o la palabra PASSWORD');
END IF;
-- Verifica que el password contenga al menos una letra, un dígito,
-- o algún signo de puntuación
IF NOT( regexp_like(password,'[[:digit:]]')
AND regexp_like(password,'[[:alpha:]]')
AND regexp_like(password,'[[:punct:]]')
) THEN
raise_application_error(-20003,
'El password debe de contener al menos un dígito, letra
o signo de puntuación');
END IF;
-- Si el password cumple con los requerimientos regresar TRUE
RETURN(TRUE);
END;
/
Después de crear la función lo asignamos a un perfil:
ALTER PROFILE perf_usuarios LIMIT password_verify_function VALIDA_PASSWORD;
Cualquier usuario con el perfil perf_usuarios acatarse a las politicas de la función VALIDA_PASSWORD.
En este ejemplo el usuario test con password test, tratara de cambiar su password, es importante notar que se debe de incluir la palabra replace, de lo contrario nos dar el siguiente error:
SQL> alter user test identified by test;
alter user test identified by test
*
ERROR at line 1:
ORA-28221: REPLACE not specified
Estos son los 3 errores que se muestran cuando no se cumple con las políticas.
SQL>alter user test identified by test replace test
*
ERROR at line 1:
ORA-28003: password verification for the specified password failed
ORA-20001: El password debe de contener al menos seis caracteres
SQL> alter user test identified by testtest replace test;
alter user test identified by testtest replace test
*
ERROR at line 1:
ORA-28003: password verification for the specified password failed
ORA-20002: El Password no puede contener el nombre del usuario o la palabra
PASSWORD
SQL> alter user test identified by 123456 replace test;
alter user test identified by 123456 replace test
*
ERROR at line 1:
ORA-28003: password verification for the specified password failed
ORA-20003: El password debe de contener al menos un digito, letra o signo de
puntuacion
Cuando se cumple con todas las políticas el cambio es exitoso.
SQL> alter user test identified by abc123$ replace test;
User altered.
Cualquier usuario con el perfil perf_usuarios deberá acatarse a las politicas de la función VALIDA_PASSWORD.
Oracle 11G provee de un código PL/SQL para crear passwords con cierta complejidad . Este script se encuentra en el directorio ORACLE_HOME/rdbms/admin y se llama utlpwdmg.sql. La función que crea se llama verify_function_11g.