Eftersom jag kan minnas att jag under min karriär arbetade med Oracle, har jag kunnat ändra en användares lösenord till lösenords-hash. Tricket jag ibland har använt var att lagra användar-id/lösenords-hash, ändra lösenordet till något jag känner till, ansluta till databasen som den användaren och sedan göra mitt arbete. När du är klar med mitt arbete, ställ tillbaka lösenordet till det som liknar följande:
ÄNDRA ANVÄNDARE bob IDENTIFIERAD AV VÄRDEN 'asdf1234%^&*qwerty';
Jag behövde aldrig veta användarens lösenord för att återställa det till vad det var så länge jag visste att hashvärdet var. Igår hittade jag information där folk fick följande felmeddelande när de försökte ställa in ett lösenord på detta sätt i 12c:
ORA-02153:ogiltig VALUES-lösenordssträng
Om du slår upp det här felet i My Oracle Support, kommer du troligen att landa på Note 2096579.1. I den noten står det att denna metod inte längre är möjlig. Det står "Detta är ny funktionalitet i 12c för att tvinga användare att skapas på rätt sätt". Men jag har upptäckt att detta inte är riktigt sant.
Oracle 12c introducerade ny funktionalitet för att göra hash-värdena för användar-id/lösenord säkrare. Här är en länk till 12c Security Guide där den talar om 12c Verifier för lösenord. Observera att i det avsnittet nämns ett saltvärde som läggs till lösenordet när det hashas. För att se varför detta är viktigt, låt oss titta på ett exempel. Jag skapar en användare och tittar på användar-id/lösenords-hash som lagras i SPARE4-kolumnen i 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
I tidigare versioner skulle SPARE4-kolumnen inte innehålla så många tecken. Detta är definitivt mer komplext än pre-12c versioner. Min gissning, även om den är obekräftad, är att S:-delen av utgången ovan är saltvärdet. Jag är inte säker på vad H:och T:representerar.
Vi kan använda paketet DBMS_METADATA för att bakåtkonstruera en användare. När vi gör det kan vi se att vi fortfarande kan använda IDENTIFIED BY VALUES-satsen.
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"
Och det fungerar faktiskt. Jag ändrar BOB:s lösenord till något annat, ändrar sedan det till detta hashvärde och ansluter till det gamla lösenordet.
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.
Så vi har inte förlorat någon funktionalitet som MOS Note antydde. Vi måste bara hantera ett mycket längre hashvärde här.
Där detta blir riktigt viktigt är när man försöker använda exp/imp eller Data Pump för att flytta användare från en pre-12c-version till 12c. Om du gör en HELT export av en Oracle 11g-databas kommer dumpen att innehålla de gamla lösenordshashvärdena. När du importerar till 12c, det är då du får ORA-02153-felet. För att komma runt det här problemet, skapa användarna i 12c-databasen med kända lösenord.