質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

Q&A

解決済

2回答

1076閲覧

Javaでの暗号化について

shibaken

総合スコア13

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

0グッド

1クリップ

投稿2018/12/04 00:47

編集2018/12/04 08:00

PLSQL、Javaどちらでも、文字列を暗号化、復号化できるようにしたいのですが、
下記のPLSQLをJava化する方法をご教示お願いします。

CREATE OR REPLACE FUNCTION TEXT_ENCRYPT( P_TEXT VARCHAR2, P_PASSWORD VARCHAR2 ) RETURN VARCHAR2 IS vEncrypted RAW(2000); BEGIN vEncrypted := DBMS_CRYPTO.ENCRYPT( src => UTL_I18N.STRING_TO_RAW (P_TEXT, 'AL32UTF8'), typ => DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5, key => UTL_I18N.STRING_TO_RAW(RPAD(P_PASSWORD, 32, CHR(0)), 'AL32UTF8')); RETURN UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(vEncrypted)); END; /

Cipherを利用してPGを試してみましたが
ivなどの部分をどうすればよいのかわかりませんでした。
またRPAD(P_PASSWORD, 32, CHR(0))の部分はJavaではどういうことになるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/12/04 00:53

念のため「PL/SQL」をタグに追加しておいてください。また「SQLをJava化する」というのはフィールドが違うものなので、あくまで「JavaからPL/SQLを利用する」スタンスになるのではと思いますが、メインの処理はどういう用途なのでしょうか。
shibaken

2018/12/04 01:22

複数のシステム間で暗号化したまま文字列の受け渡しをして利用する形となります。片方はOracleでないので、Java側で暗号化や複合化したいということになります。
m.ts10806

2018/12/04 01:23

質問は編集できるので適宜追記してください
guest

回答2

0

ベストアンサー

Initialization vector の扱いについて

ivなどの部分をどうすればよいのかわかりませんでした。

Oracle の DBMS_CRYPTO.ENCRYPT 関数についてのドキュメント を参照する限り、 iv 引数が省略された場合、 Initialization vector としては NULL が使用される と記載があります。 Null IV はゼロフィルされたバイト列を IV として使用することを意味します (IV を使わないと言っているようなものです) 。

AES はブロック長が 16 bytes (128 bits) ですから、 NULL バイトを 16 個並べたものに等しく、要するに iv => HEXTORAW('00000000000000000000000000000000') という引数を与えるのと等価 です。

Java の javax.crypto.Cipher を使ってこれを復号化するのであれば、 (Java の byte は特に指定しなければ 0 で初期化されている為) 次のようにして 空の byte 配列を引数に IvParameterSpec のインスタンスを作成 すればよいのではないでしょうか。

java

1IvParameterSpec iv = new IvParameterSpec(new byte[16]);

※ IV の長さについては、 Cipher のインスタンスを作成してから Cipher.getBlockSize() を呼んでやっても良いと思います

キー長のパディングについて

RPAD(P_PASSWORD, 32, CHR(0))の部分はJavaではどういうことになるのでしょうか?

CHR(0)ドキュメント を読むと、コードポイント 0 の文字を、つまり NULL バイトを返しますRPADドキュメント を読めば単純なもので、結局のところ、 P_PASSWORD が 32 bytes になるよう、必要に応じて右側 (文字列終端側) に NULL バイトを詰め込んで、桁そろえをしている だけです。

つまりパスワード (キー) を AES-256 のキー長である 32 bytes (256 bits) に揃えている処理ですね。残念ながら Java に同等の機能を提供するクラスは無かったように思いますが、別段難しい処理ではないので、例えば次のようにして適当に実装してしまえばよいかと思います。

java

1String password = "My-password"; 2 3SecretKeySpec key = new SecretKeySpec( 4 (password + new String(new byte[32])).substring(0, 32).getBytes(), 5 "AES" 6);

おまけ

尚、御呈示の PL/SQL コードでは暗号文を Base64 でエンコードして返しているので、当然ながら Java 側でも Base64 でデコードしてから複合処理を行う必要があります。お忘れなく。

投稿2018/12/04 16:30

argparse

総合スコア1017

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shibaken

2018/12/05 00:50

詳しいご説明ありがとうございました。 上記のコードに変更し、JavaをAES256を使える環境にしたら無事に対応できました
guest

0

直接的な回答ではないので恐縮ですが。
個人的に、暗号化を行う処理をシステム内で複数持つ仕様は致命的なバグを生み出しかねないので、やめたほうがいいと思います。
PL/SQLで暗号化を行う処理だけ書き出したものを用意し、Javaから呼ぶ際もそのPL/SQLを経由させるようにするなどして、あくまで暗号・復号化する処理は一つにしておくべきかと思います。

投稿2018/12/04 01:04

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問