- PR -

暗号化したデータの存在するテーブルのインポート、エクスポート

投稿者投稿内容
a-zma
会議室デビュー日: 2007/06/04
投稿数: 16
投稿日時: 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出来ないとなると他の方法を考えなくてはいけません。
よろしくお願いします。
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2007-06-05 15:04
dbms_obfuscation_toolkit.des3encrypt を設定している列がデータ型か分からないので何ともいえませんが、 3DES の結果は通常バイナリなので、VARCHAR2 とかではダメで、RAW や BLOB 型とかにしなければならないかと思うのですが、大丈夫ですか?
a-zma
会議室デビュー日: 2007/06/04
投稿数: 16
投稿日時: 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 型とかにしなければならないかと思うのですが
根本的に使い方が間違っているのでしょうか…
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2007-06-06 07:04
文字の場合DBとクライアントの文字コードが
ことなる場合に文字コードの変換が発生します

文字コードが異なり、データに半角カナがあるのでは?

DBの文字コードでエクスポートを実行すれば
変換は発生しません
a-zma
会議室デビュー日: 2007/06/04
投稿数: 16
投稿日時: 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のキャラクタ・セットが異なっているように見えるのですが、
何処で設定すれば良いのでしょうか?
未記入
会議室デビュー日: 2006/03/22
投稿数: 19
投稿日時: 2007-06-06 13:34
暗号化した後の元データとインポート後のデータのdumpコードが無理なら
バイナリベースで何が何に変わったのかは提示できませんか?

[ メッセージ編集済み 編集者: Tetra 編集日時 2007-06-06 13:39 ]
a-zma
会議室デビュー日: 2007/06/04
投稿数: 16
投稿日時: 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クライアント環境でインポートした時に、最終桁が抜け落ちてしまうようです。
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2007-06-06 16:33
ちょっと気になったので

×複合化
○復号化

スキルアップ/キャリアアップ(JOB@IT)