Da quando posso ricordare nella mia carriera di lavoro con Oracle, sono stato in grado di modificare la password di un utente nell'hash della password. Il trucco che a volte ho utilizzato è stato quello di memorizzare l'hash di userid/password, cambiare la password con qualcosa che conosco, connettermi al database come quell'utente e poi fare il mio lavoro. Al termine del mio lavoro, reimposta la password su qualsiasi cosa fosse simile alla seguente:
ALTER USER bob IDENTIFIED BY VALUES ‘asdf1234%^&*qwerty’;
Non ho mai avuto bisogno di conoscere la password dell'utente per reimpostarla su quello che era finché sapevo che era il valore hash. Ieri ho trovato alcune informazioni in cui le persone ricevevano il seguente errore quando tentavano di impostare una password in questo modo in 12c:
ORA-02153:stringa della password VALUES non valida
Se cerchi questo errore in My Oracle Support, molto probabilmente atterrerai su Note 2096579.1. In tale nota si afferma che questo metodo non è più possibile. Dice "Questa è una nuova funzionalità in 12c per costringere gli utenti a essere creati nel modo giusto". Ma ho scoperto che questo non è esattamente vero.
Oracle 12c ha introdotto una nuova funzionalità per rendere più sicuri i valori hash di userid/password. Ecco un collegamento alla Guida alla sicurezza 12c in cui si parla del verificatore 12c per le password. Nota in quella sezione, menziona un valore salt aggiunto alla password quando viene eseguito l'hashing. Per capire perché questo è importante, diamo un'occhiata a un esempio. Creerò un utente e guarderò l'hash userid/password memorizzato nella colonna SPARE4 di 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
Nelle versioni precedenti, la colonna SPARE4 non conterrebbe così tanti caratteri. Questo è decisamente più complesso delle versioni precedenti alla 12c. La mia ipotesi, sebbene non confermata, è che la parte S:dell'output sopra sia il valore del sale. Non sono sicuro di cosa rappresentino H:e T:.
Possiamo usare il pacchetto DBMS_METADATA per decodificare un utente. Quando lo facciamo, possiamo vedere che possiamo ancora utilizzare la clausola 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 in effetti, funziona. Cambierò la password di BOB in qualcosa di diverso, quindi la cambierò con questo valore hash e mi collegherò con la vecchia password.
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.
Quindi non abbiamo perso alcuna funzionalità come implicava la nota MOS. Qui dobbiamo solo fare i conti con un valore hash molto più lungo.
Dove questo diventa davvero importante è quando si tenta di utilizzare exp/imp o Data Pump per spostare gli utenti da una versione precedente a 12c a 12c. Se si esegue un'esportazione COMPLETA di un database Oracle 11g, il dump conterrà i vecchi valori hash della password. Durante l'importazione in 12c, riceverai l'errore ORA-02153. Per aggirare questo problema, precrea gli utenti nel database 12c con password conosciute.