Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle 12c IDENTIFICADO POR VALORES


Desde que me lembro em minha carreira trabalhando com Oracle, consegui modificar a senha de um usuário para o hash de senha. O truque que eu às vezes usava era armazenar o hash de ID do usuário/senha, alterar a senha para algo que eu conhecesse, conectar-se ao banco de dados como esse usuário e fazer meu trabalho. Quando terminar meu trabalho, defina a senha de volta para o que for semelhante ao seguinte:

ALTER USER bob IDENTIFICADO POR VALORES 'asdf1234%^&*qwerty';

Eu nunca precisei saber a senha do usuário para defini-la de volta para o que era, desde que eu soubesse que o valor do hash era. Ontem encontrei algumas informações onde as pessoas estavam recebendo o seguinte erro ao tentar definir uma senha dessa maneira em 12c:



ORA-02153:string de senha VALUES inválida

Se você pesquisar esse erro no My Oracle Support, provavelmente chegará à Nota 2096579.1. Nessa nota, afirma que este método não é mais possível. Ele diz “Esta é uma nova funcionalidade no 12c para forçar os usuários a serem criados da maneira certa”. Mas descobri que isso não é exatamente verdade.

O Oracle 12c introduziu uma nova funcionalidade para tornar os valores de hash de ID de usuário/senha mais seguros. Aqui está um link para o 12c Security Guide onde ele fala sobre o 12c Verifier para senhas. Observe que nessa seção, ele menciona um valor de sal adicionado à senha quando ela é hash. Para ver por que isso é importante, vejamos um exemplo. Vou criar um usuário e ver o hash userid/password armazenado na coluna SPARE4 de SYS.USER$.


SQL> create user bob identified by abc123;
User created.
SQL> grant create session to bob;
Grant succeeded.
SQL> select spare4 from sys.user$ where name='BOB';
SPARE4
--------------------------------------------------------------------------------
S:44F34BA1369D58A6CB262D166587D5238D9148FC9BDD390A98C29A3B6A34;H:FD30F9DA6ECB907
6C10C04D20AFF9492;T:450FF7F2A4BB8104E33E7C09FF1698AEA2DE3EBD60BFA681942057D83EE2
DD773BB4F7B1046355D1CB63EBF256BC7B466BB1B3185A0988D1CBAE3276D1B181756DB27BB40505
8C44152DB2DD41074396



Nas versões anteriores, a coluna SPARE4 não continha tantos caracteres. Isso é definitivamente mais complexo do que as versões pré-12c. Meu palpite, embora não confirmado, é que a parte S:da saída acima é o valor do sal. Não tenho certeza do que H:e T:representam.

Podemos usar o pacote DBMS_METADATA para fazer engenharia reversa de um usuário. Quando fazemos isso, podemos ver que ainda podemos usar a cláusula IDENTIFIED BY VALUES.
SQL> select dbms_metadata.get_ddl('USER','BOB') from dual;
DBMS_METADATA.GET_DDL('USER','BOB')
--------------------------------------------------------------------------------
CREATE USER "BOB" IDENTIFIED BY VALUES 'S:44F34BA1369D58A6CB262D166587D5238D9
148FC9BDD390A98C29A3B6A34;H:FD30F9DA6ECB9076C10C04D20AFF9492;T:450FF7F2A4BB8104E
33E7C09FF1698AEA2DE3EBD60BFA681942057D83EE2DD773BB4F7B1046355D1CB63EBF256BC7B466
BB1B3185A0988D1CBAE3276D1B181756DB27BB405058C44152DB2DD41074396;5844087A3D506FD3
'
 DEFAULT TABLESPACE "USERS"
 TEMPORARY TABLESPACE "TEMP"



E, de fato, isso funciona. Vou alterar a senha do BOB para algo diferente, depois alterá-la para esse valor de hash e conectar com a senha antiga.
SQL> alter user bob identified by newpass;
User altered.
SQL> alter user bob identified by values 'S:44F34BA1369D58A6CB262D166587D5238D9148FC9BDD390A98C29A3B6A34;H:FD30F9DA6ECB9076C10C04D20AFF9492;T:450FF7F2A4BB8104E33E7C09FF1698AEA2DE3EBD60BFA681942057D83EE2DD773BB4F7B1046355D1CB63EBF256BC7B466BB1B3185A0988D1CBAE3276D1B181756DB27BB405058C44152DB2DD41074396;5844087A3D506FD3';
User altered.
SQL> connect bob/abc123
Connected.

Portanto, não perdemos nenhuma funcionalidade, como o MOS Note implicava. Nós apenas temos que lidar com um valor de hash muito mais longo aqui.

Onde isso se torna realmente importante é ao tentar usar exp/imp ou Data Pump para mover usuários de uma versão pré-12c para 12c. Se você fizer uma exportação COMPLETA de um banco de dados Oracle 11g, o dump conterá os valores de hash da senha antiga. Ao importar para o 12c, você receberá o erro ORA-02153. Para contornar esse problema, pré-crie os usuários no banco de dados 12c com senhas conhecidas.