Karena saya dapat mengingat dalam karir saya bekerja dengan Oracle, saya dapat mengubah kata sandi pengguna menjadi hash kata sandi. Trik yang terkadang saya gunakan adalah menyimpan hash userid/kata sandi, mengubah kata sandi menjadi sesuatu yang saya tahu, menghubungkan ke database sebagai pengguna itu dan kemudian melakukan pekerjaan saya. Setelah selesai dengan pekerjaan saya, setel kembali kata sandi menjadi apa pun yang mirip dengan berikut ini:
ALTER USER bob DIIDENTIFIKASI OLEH NILAI ‘asdf1234%^&*qwerty’;
Saya tidak pernah perlu mengetahui kata sandi pengguna untuk mengaturnya kembali seperti semula selama saya tahu nilai hashnya. Kemarin saya menemukan beberapa informasi di mana orang menerima kesalahan berikut ketika mencoba mengatur kata sandi dengan cara ini di 12c:
ORA-02153:NILAI string kata sandi tidak valid
Jika Anda mencari kesalahan ini di Dukungan Oracle Saya, kemungkinan besar Anda akan mendarat di Note 2096579.1. Dalam catatan itu, disebutkan bahwa metode ini tidak mungkin lagi. Dikatakan "Ini adalah fungsi baru di 12c untuk memaksa pengguna dibuat dengan cara yang benar". Tetapi saya menemukan bahwa ini tidak sepenuhnya benar.
Oracle 12c memperkenalkan fungsionalitas baru untuk membuat nilai hash userid/password lebih aman. Berikut ini tautan ke Panduan Keamanan 12c yang membahas tentang Pemverifikasi 12c untuk kata sandi. Perhatikan di bagian itu, ia menyebutkan nilai garam yang ditambahkan ke kata sandi saat di-hash. Untuk melihat mengapa ini penting, mari kita lihat sebuah contoh. Saya akan membuat pengguna dan melihat hash userid/password yang disimpan di kolom SPARE4 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
Di versi sebelumnya, kolom SPARE4 tidak akan berisi karakter sebanyak itu. Ini jelas lebih kompleks daripada versi pra-12c. Dugaan saya, meskipun belum dikonfirmasi, adalah bahwa bagian S:dari output di atas adalah nilai garam. Saya tidak yakin apa yang diwakili oleh H:dan T:.
Kita dapat menggunakan paket DBMS_METADATA untuk merekayasa balik pengguna. Ketika kita melakukannya, kita dapat melihat bahwa kita masih dapat menggunakan klausa 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"
Dan faktanya, itu berhasil. Saya akan mengubah kata sandi BOB menjadi sesuatu yang berbeda, lalu mengubahnya ke nilai hash ini dan menghubungkannya dengan kata sandi lama.
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.
Jadi kami tidak kehilangan fungsionalitas apa pun seperti yang tersirat dalam Catatan MOS. Kita hanya perlu berurusan dengan nilai hash yang lebih panjang di sini.
Di mana ini menjadi sangat penting adalah ketika mencoba menggunakan exp/imp atau Data Pump untuk memindahkan pengguna dari versi pra-12c ke 12c. Jika Anda melakukan ekspor LENGKAP dari database Oracle 11g, dump akan berisi nilai hash kata sandi lama. Saat mengimpor ke 12c, saat itulah Anda akan menerima kesalahan ORA-02153. Untuk mengatasi masalah ini, buat dulu pengguna di database 12c dengan kata sandi yang diketahui.