Troca de senha de usuário Oracle utilizando hash value
O Oracle permite a troca de senha de um determinado usuário para a senha antiga utilizando hash value. Esta operação é importante quando o DBA não possui o conhecimento da senha atual do usuário e é necessitado ao mesmo a senha desse usuário para se realizar uma determinada operação. No Oracle 10g para se executar essa atividade, só com a DBA_USERS jse torna possível a realização. No entanto, no Oracle 11g, para esta determinada view em questão, o campo PASSWORD que possui o valor em hash (a senha atual do usuário criptografada) retorna em branco. Com isso, no Oracle 11g, se faz necessário o uso da view SYS.USER$. No Oracle 12c, as view para gerenciamento de segurança de usuários são ALL_USERS, CDB_USERS, DBA_USERS, e USER_USERS.
Sendo assim, segue abaixo a troca de de senha para a senha antiga utilizando hash value no Oracle 10/11g utilizando o usuário Scott:
— Se efetua um select na DBA_USERS para obter informações do profile do usuário, nome, status e senha em hash (Note que o valor está em branco, isso se deve ao fato de o banco em questão ser 11g. Se o mesmo fosse 10g, o valor em questão estaria sendo retornado pelo select.)
SQL> Select USERNAME, PROFILE, PASSWORD, ACCOUNT_STATUS FROM DBA_USERS WHERE USERNAME ='SCOTT';
USERNAME PROFILE PASSWORD ACCOUNT_STATUS
------------------------------ ------------------------------ ------------------------------ --------------------------------
SCOTT DEFAULT OPEN
— Utilizando a v$version para demonstração da versão do banco:
SQL> SELECT * FROM V$VERSION;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
— Como já elucidado, o banco de dados em questão é 11g. Para isso, há a necessidade da view SYS.USER$ para obter o valor em Hash representado pelo campo PASSWORD.
SQL> SELECT NAME, PASSWORD,ASTATUS FROM SYS.USER$ WHERE NAME='SCOTT';
NAME PASSWORD ASTATUS
------------------------------ ------------------------------ ----------
SCOTT F894844C34402B67 0
— Efetuando conexão com o usuário Scott para demonstração da senha atual. No entanto, para o post em questào, estamos trabalhando com a hipótese do DBA não ter conhecimento da mesma. Representaçào é para questòes de comprovação da operação mais adiante:
SQL> conn scott/tiger
Connected.
— Alteração da senha do usuário Scott para brunors com o usuário Sys e, teste de conexão com a nova senha:
SQL> conn /as sysdba
Connected.
SQL> alter user scott identified by brunors;
User altered.
SQL> conn scott/brunors
Connected.
— Procedimento para voltar a senha do usuário Scott para a senha antiga via Hash:
— Alteração do profile do usuário para um profile temporário. Visto que determinados profiles podem possuir restrições que impossibilitam a troca de senha do usuário para a senha antiga:
SQL> conn /as sysdba
Connected.
SQL> CREATE PROFILE novoprofilename
LIMIT PASSWORD_REUSE_MAX UNLIMITED
PASSWORD_REUSE_TIME UNLIMITED;
Profile created.
SQL> alter user SCOTT profile novoprofilename;
User altered.
— Voltando a senha do usuário Scott para a senha antiga tiger (Note que o retorno da senha para a senha antiga está sendo passado via hash value):
SQL> alter user SCOTT identified by values 'F894844C34402B67';
User altered.
— Voltando o usuário Scott para seu profile (campo Profile na DBA_USERS):
SQL> alter user SCOTT profile DEFAULT;
User altered.
— Apagando o profile temporário:
SQL> drop profile novoprofilename;
Profile dropped.
— Efetuando teste de conexão com o usuário Scott com a senha antiga tiger:
SQL> conn scott/tiger
Connected.
Espero ter ajudado,
Abraços!