- - PR -
暗号化したデータの存在するテーブルのインポート、エクスポート
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-06-04 10:20
Oracle9i Release 9.2.0.7.0 でdbms_obfuscation_toolkit.des3encrypt
により文字列を暗号化してAというテーブルに格納しています。 バックアップのテストの為、以下の作業を行いました。 (1)expユーティリティを使用してAテーブルのdmpを作成 (2)AテーブルをDrop (3)impユーティリティによりAテーブルを復元 結果、imp処理自体は正常終了するのですが、特定の暗号化した文字列が 複合化できなくなってしまいました。 複合化できないレコードは全体の2割程度です。 複合化できない項目をDUMP関数により比較して見ると、以下の通りLenが 足りていません。 (元データ) Typ=1 Len=16: (impデータ)Typ=1 Len=15: どうすれば、正常な形でexp,imp出来るのでしょうか? 出来れば、dmp形式で日々のバックアップを取っていきたいのですが正常 にimp出来ないとなると他の方法を考えなくてはいけません。 よろしくお願いします。 |
|
投稿日時: 2007-06-05 15:04
dbms_obfuscation_toolkit.des3encrypt を設定している列がデータ型か分からないので何ともいえませんが、 3DES の結果は通常バイナリなので、VARCHAR2 とかではダメで、RAW や BLOB 型とかにしなければならないかと思うのですが、大丈夫ですか?
|
|
投稿日時: 2007-06-05 20:06
あんとれさん、返信ありがとうございます。
>3DES の結果は通常バイナリ 指摘された通り、Varchar2に格納していました。 具体的な処理は、↓の感じです。 ※この例では、imp,expしても問題は起こりません。 実際に問題が起こるデータは掲せられないので…すいません。 --テーブル定義 create table a( b varchar2(16)); declare encstr varchar2(255); --暗号化文字列 decstr varchar2(16); --複合化文字列 keystr varchar2(24) := 'key0123456789abcdefghijk'; --暗号キー begin --文字列 '0123456789012345'を暗号化 dbms_obfuscation_toolkit.des3encrypt( input_string => '0123456789012345', key_string => keystr, encrypted_string => encstr, which => 1 ); --暗号化した文字を出力 dbms_output.put_line('暗号:' || encstr); --Aテーブルに格納 insert into a(b) values(encstr); commit; --暗号化文字列を複合化 dbms_obfuscation_toolkit.des3decrypt( input_string => encstr, key_string => keystr, decrypted_string => decstr, which => 1 ); --複合化した文字を出力 dbms_output.put_line('複合:' || decstr); end; 暗号化の戻り値を無理やりRAWに変更しても 『ORA-06502: PL/SQL: 数値または値のエラー: 16進からRAWへの変換エラー』 が発生してしまいます。 >RAW や BLOB 型とかにしなければならないかと思うのですが 根本的に使い方が間違っているのでしょうか… |
|
投稿日時: 2007-06-06 07:04
文字の場合DBとクライアントの文字コードが
ことなる場合に文字コードの変換が発生します 文字コードが異なり、データに半角カナがあるのでは? DBの文字コードでエクスポートを実行すれば 変換は発生しません |
|
投稿日時: 2007-06-06 12:44
99riさん、ありがとうございます。
> 文字の場合DBとクライアントの文字コードが >ことなる場合に文字コードの変換が発生します なるほど! DBの文字コードを調べてみました。 NLS_CHARACTERSET:JA16SJIS NLS_LANGUAGE:AMERICAN NLS_TERRITORY:AMERICA そこで、 SET NLS_LANG = AMERICAN_AMERICA.JA16SJIS を実行してからエクスポート処理をしました。 インポート処理の時も同じNLS_LANGをセットしてから行ったのですが 問題点は改善されませんでした。 >>DUMP関数により比較して見ると、以下の通りLenが >>足りていません。 >>(元データ) Typ=1 Len=16: >>(impデータ)Typ=1 Len=15: 色々試してみたのですがOracle8iクライアントの環境ならば 上手くimp,exp出来ることに気づきました。 Oracle9iクライアントと8iクライアント下でのメッセージの違いは以下の通りです。 Oracle8iクライアント(8.1.7): エクスポート・ファイルは従来型のパス経由でEXPORT:V08.01.07が作成しました。 JA16SJISキャラクタ・セットとUTF8 NCHARキャラクタ・セットでインポートが完了しました。 Oracle9iクライアント(9.2): エクスポート・ファイルはEXPORT:V09.02.00によって従来型パス経由で作成されました JA16SJISキャラクタ・セットおよびAL16UTF16 NCHARキャラクタ・セットでインポートが 完了しました NCHARのキャラクタ・セットが異なっているように見えるのですが、 何処で設定すれば良いのでしょうか? |
|
投稿日時: 2007-06-06 13:34
暗号化した後の元データとインポート後のデータのdumpコードが無理なら
バイナリベースで何が何に変わったのかは提示できませんか? [ メッセージ編集済み 編集者: Tetra 編集日時 2007-06-06 13:39 ] |
|
投稿日時: 2007-06-06 14:52
Tetraさん、ありがとうございます。
データのDUMPですが異なる点は以下の通りです。(0はマスク値) 15桁目まではimp前後で同じですが、インポートすると最終桁が抜け落ちます。 元データ Typ=1 Len=16: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,248 Typ=1 Len=16: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,132 Typ=1 Len=16: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,153 Typ=1 Len=16: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,147 Typ=1 Len=16: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,249 Typ=1 Len=16: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,142 Typ=1 Len=16: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,233 Typ=1 Len=16: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,227 Typ=1 Len=16: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,158 impデータ Typ=1 Len=15: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 Typ=1 Len=15: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 Typ=1 Len=15: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 Typ=1 Len=15: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 Typ=1 Len=15: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 Typ=1 Len=15: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 Typ=1 Len=15: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 Typ=1 Len=15: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 Typ=1 Len=15: 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 >バイナリベースで何が何に変わったのかは提示できませんか? 解釈が間違っていたらすいません。 後、エクスポートしたdmpファイルを解析したところ、ファイル自体は正常でした。 Oracle9iクライアント環境でインポートした時に、最終桁が抜け落ちてしまうようです。 |
|
投稿日時: 2007-06-06 16:33
ちょっと気になったので
×複合化 ○復号化 |