Las contraseñas en dba_users.password están encriptadas, no se puede leer su valor o hacer comparaciones directas. No dices mucho sobre el objetivo del formulario, de todos modos te comento que existen dos modelos para la gestión de usuarios en las aplicaciones.
Por un lado, crear usuarios de base de datos, y según el tipo de aplicación, optar por:
1. No tener un proceso de validación, es decir, intentar una conexión directa con el usuario/contraseña del formulario, y si los datos son incorrectos, capturas el error
ORA-01017: invalid username/password; logon denied para devolverlo como resultado por pantalla. Este caso es común en aplicaciones tipo herramientas de administración de base de datos como por ejemplo SQL Developer, SQL*Plus, etc.
2. Si tener un proceso de validación, esto es, hacer una conexión inicial con un usuario de base de datos (supongamos APPUSER) y a partir de ahí, validar los datos usuario/contraseña del formulario con un procedimiento casero (como ejemplo tienes la función validar_pass). Este caso es para aplicaciones con perfiles de seguridad pero que delegan la gestión a la base de datos, es una solución poco eficiente y además ya no se usa.
Código:
create or replace function validar_pass
(usuario in varchar2, contrasena in varchar2)
return boolean
is
temp_pass1 varchar2(1000);
temp_pass2 varchar2(1000);
begin
--lee la actual contraseña encriptada
select password
into temp_pass1
from dba_users
where username = upper(usuario);
--cambia la contraseña con el valor del parametro contrasena
execute immediate
'alter user ' || usuario || ' identified by ' || contrasena;
--lee la nueva contraseña encriptada
select password
into temp_pass2
from dba_users
where username = upper(usuario);
--reestablece la contraseña al valor original
execute immediate
'alter user ' || usuario || ' identified by values ' ||
chr(39) || temp_pass1 || chr(39);
--devuelve true si la dos contraseñas encriptadas son iguales
return temp_pass1 = temp_pass2;
end;
/
Por otro lado, crear tu propia gestión de seguridad, es decir, hacer todas las conexiones con un único usuario de base de datos (APPUSER), y tener los usuarios de la aplicación como registros de una tabla donde puedes encriptar las contraseñas con el paquete DBMS_OBFUSCATION_TOOLKIT, en este modelo, para validar los datos usuario/contraseña del formulario solo tienes que hacer un SELECT sobre la tabla de usuarios y comparar la contraseña con las funciones DESDECRYPT y DESDECRYPT. Esta solución es la más recomendada.
Saludos