はじめに
Oracle Databaseのパスワードは、パスワードベースのキー導出関数(PBKDF2)およびSHA-512暗号化ハッシュ関数を含む非最適化されたアルゴリズムに基づいてハッシュ化されています(Oracle Databaseの組込みパスワード保護の概要)。
その保存されているハッシュ値ベースでもパスワードを設定できるため、その方法を紹介します。
たとえば、パスワードを変更前に戻してほしいが誰もパスワードはわからない、といったケースに利用できます(レアケースですが、、)。
パスワードハッシュ値の確認
今回はOracle XE 21cの環境を利用します。
XEPDB1というPDBにTEST01というユーザを hogehogehoge というパスワードで作成し、接続してみます。
11g辺りまではdba_usersのPASSWORDでハッシュ値が確認できましたが、12c以降はできないです。
SQL> create user test01 identified by hogehogehoge;
ユーザーが作成されました。
SQL> grant create session to test01;
権限付与が成功しました。
SQL> select username, password from dba_users where username like 'TEST%';
USERNAME PASSWORD
------------------------------ --------------------------------------------------------------
TEST01
SQL> conn test01/hogehogehoge@xepdb1;
接続されました。
sysdbaに戻り、ハッシュ値を確認します、一部マスクしてます。
SQL> SELECT name, spare4 FROM sys.user$ where name like 'TEST%';
NAME SPARE4
---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TEST01 S:xxxxxxxxx2570779B32F28E134FA26A64B0EBB68B85904A9xxxxxxxxxxxx;T:xxxxxxxxxxxxxxx3F85932D369AF3113F26310E9BE2DDBE57090A22D0AF7D8355B18B8541D853D5AA87F7E9xxxxxx7B0DBEBF73572861C3F9B4473E43081C4EC099265261342B78AB6F7BCBF67Bxxxxx
ハッシュ値でのパスワード変更
この状態で一度 TEST01 ユーザのパスワードを新パスワード asahidetest01 に変更します。
SQL> alter user test01 identified by asahidetest01;
ユーザーが変更されました。
SQL> conn test01/asahidetest01@xepdb1;
接続されました。
元のパスワード(hogehogehoge)では当然接続できません。
SQL> conn test01/hogehogehoge@xepdb1;
ERROR:
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
警告: Oracleにはもう接続されていません。
ハッシュ値の確認、で確認したパスワードへ戻し(一部マスク化してます)、元のパスワード(hogehogehoge)で再接続してみます。無事接続されました。
SQL> alter user test01 identified by values 'S:xxxxxxxxx2570779B32F28E134FA26A64B0EBB68B85904A9xxxxxxxxxxxx;T:xxxxxxxxxxxxxxx3F85932D369AF3113F26310E9BE2DDBE57090A22D0AF7D8355B18B8541D853D5AA87F7E9xxxxxx7B0DBEBF73572861C3F9B4473E43081C4EC099265261342B78AB6F7BCBF67Bxxxxx';
ユーザーが変更されました。
SQL> conn test01/hogehogehoge@xepdb1;
接続されました。
まとめ
ということで、定期的に sys.user$ の spare4 の値を取得しておくことで、パスワードがわからなくなってもリカバリは可能となります。
あまり使い道はないかもしれませんが、クライアント側でもパスワードを暗号化して保持されていることが増えてきてますので、緊急時には利用できるかもしれません。