Oracleでのキャリアを思い出すことができるので、ユーザーのパスワードをパスワードハッシュに変更することができました。私が時々採用したトリックは、ユーザーID /パスワードハッシュを保存し、パスワードを私が知っているものに変更し、そのユーザーとしてデータベースに接続してから、作業を行うことでした。作業が終わったら、パスワードを次のようなものに戻します。
値「asdf1234%^&*qwerty」で識別されるALTERUSER bob;
ハッシュ値がわかっている限り、ユーザーのパスワードを知って元のパスワードに戻す必要はありませんでした。昨日、12cでこの方法でパスワードを設定しようとすると、次のエラーが表示されるという情報を見つけました。
ORA-02153:VALUESパスワードstringが無効です
My Oracle Supportでこのエラーを検索すると、Note2096579.1に到達する可能性が高くなります。そのメモでは、この方法はもはや不可能であると述べています。 「これは、ユーザーを正しい方法で作成するように強制する12cの新機能です」と書かれています。しかし、これは正確には当てはまらないことがわかりました。
Oracle 12cは、ユーザーID/パスワードのハッシュ値をより安全にするための新機能を導入しました。これは、パスワードの12cベリファイアについて説明している12cセキュリティガイドへのリンクです。そのセクションでは、パスワードがハッシュされるときにパスワードに追加されるソルト値について言及していることに注意してください。これが重要である理由を理解するために、例を見てみましょう。ユーザーを作成し、SYS.USER$のSPARE4列に保存されているユーザーID/パスワードハッシュを確認します。
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
以前のバージョンでは、SPARE4列にはそれほど多くの文字が含まれていませんでした。これは、12cより前のバージョンよりも明らかに複雑です。私の推測では、未確認ですが、上記の出力のS:部分はソルト値であると思います。 H:とT:が何を表しているのかわかりません。
DBMS_METADATAパッケージを使用して、ユーザーをリバースエンジニアリングできます。これを行うと、IDENTIFIEDBYVALUES句を引き続き使用できることがわかります。
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"
そして実際、それは機能します。 BOBのパスワードを別のパスワードに変更してから、このハッシュ値に変更して、古いパスワードで接続します。
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.
したがって、MOSNoteが示すように機能が失われることはありません。ここでは、はるかに長いハッシュ値を処理する必要があります。
これが非常に重要になるのは、exp/impまたはDataPumpを使用してユーザーを12cより前のバージョンから12cに移動しようとする場合です。 Oracle 11gデータベースの完全エクスポートを実行すると、ダンプには古いパスワードハッシュ値が含まれます。 12cにインポートすると、ORA-02153エラーが発生します。この問題を回避するには、既知のパスワードを使用して12cデータベースにユーザーを事前に作成します。