Test 1 - PowerBuilder

PowerBuilder 10.0 における Cryptography の使用
PowerBuilder Engineering, Information Technology and Solutions Group
目次
概要.................................................................................................................................... 3
PBCrypto 非ビジュアル オブジェクトのアーキテクチャ........................................... 3
PowerBuilder Exception へ JCE Exceptions をマッピング ....................................... 4
PBCrypto プロキシ オブジェクトのインスタンスの取得..................................... 4
PBCrypto プロキシ API.................................................................................................... 5
CreateRSAKeyPair ....................................................................................................... 5
DecryptCipherTextUsingBlockCipher ......................................................................... 5
DecryptCipher TextUsingPBE ..................................................................................... 6
DecryptSecretKeyUsingRSAPrivateKey...................................................................... 7
DumpBCProviderList ................................................................................................... 8
EncryptPlainTextUsingBlockCipher ............................................................................ 9
EncryptPlainTextUsingPBE ......................................................................................... 9
EncryptSecretKeyUsingRSAPublicKey ....................................................................... 9
GenerateDigitalSignature............................................................................................ 10
GenerateMessageAuthenticationCode........................................................................ 10
GenerateMessageDigest.............................................................................................. 11
GenerateSecretKey ..................................................................................................... 11
VerifySignature ................................................................................................................ 12
最後に.............................................................................................................................. 13
2
概要
PowerBuilder® はデータベース対応のアプリケーションを構築する豊富な機能を持つ開発環境とし
て飛躍し続けます。DataWindow® は製品のリリースごとに機能を拡張し、今では豊富な XML 生
成と操作機能が追加されました。
インターネット開発は、すべてのルータのすぐ近くから、配線の内側に入り込もうとしたり、
TCP/IP パケットに割り込んで他の誰かのデータにアクセスしてくるなど、危険な方法です。セキ
ュリティは、開発者が無視することができないほど、アプリケーション開発時における重要な要
素となってきています。PowerBuilder 10 以前の環境では、強固に統合した暗号化による問題解決
方法が不足していました。一部の項目に関しては外部 DLL を呼び出すことで実行することもでき
ましたが、PowerBuilder の機能として PowerScript® だけで暗号化の操作を行うことはできません
でした。
PowerBuilder 10 で、新しく PBCrypto プロキシ オブジェクトという暗号化オブジェクトを紹介
します。このプロキシ オブジェクトは、PowerBuilder オブジェクトの中で使用するのに適した豊
富な暗号化処理を公開します。PowerBuilder 開発者は、デジタル署名からメッセージ ダイジェス
トと強力な対称暗号化方式まで、幅広く全ての暗号化操作に容易にアクセスすることができます。
本書の目的は、開発者に利用可能な方式に何があるのかを示し、アーキテクチャの背後にあるデ
ザインの仕様について説明し、そしてこのエキサイティングな新しい PowerBuilder の機能のため
の拡張ポイントなどについて紹介するものです。
本書は、暗号化方式の正しい使い方やその動作について説明するものではありません。本書では、
Jason Weiss 著『Java Cryptography Extensions: Practical Guide for Programmers』(ISBN: 0-12742751-1)を参考資料としています。
PBCrypto プロキシ オブジェクトは実際には見せかけだけであり、Java Cryptography Extension
(JCE)の上に配置するもので、PowerBuilder IDE を使用して Java と統合したものです。このア
ーキテクチャには、多くのベンダから暗号化を実装するためのプラグインを開発することを可能
にしたり、Java の暗号化プラットフォーム上の膨大な量のドキュメントを使用するという多くの
利点があります。
PowerBuilder 10 に含まれている PBCrypto プロキシ オブジェクト は Java と JCE を基礎にし
ていますが、Java と JCE の知識を持たなくても暗号化方式を使用することが可能であるという
ことを認識することは大切です。
PBCrypto 非ビジュアル オブジェクトのアーキテクチャ
暗号化処理では、印刷可能な文字を含む出力結果を伴うことはほとんどありません。PowerBuilder
で暗号化処理を行う上で最初の問題のうちの 1 つは、PowerScript 言語が byte データ型を提供し
ていないことです。この問題に対応するためには、PBCrypto プロキシの中で定義する暗号化処
理のほとんど全てのものを、Base64 エンコードの引数を使用して渡し、Base64 エンコードを使用
して戻します。Base64 エンコーディングは、RFC の中で定義され、8 ビットのバイナリ データを
6 ビットの印刷可能な有効な文字にして返します。
PowerBuilder のライブラリ リストに pbejbclient100.pbd のほかに、PBCrypto プロキシと
n_cst_cryptography 非ビジュアル オブジェクト(pbcryptoclient100.pbd という名前のライブ
ラリ中にあるプロキシ オオブジェクトのインスタンスを作成する方法を持つ)を追加する必要が
あります。これらのライブラリは両方とも ¥Program Files¥Sybase¥Shared¥PowerBuilder ディレクト
リに配置する必要があります。pbcryptoclient100.pbd は、¥Program Files¥Sybase¥PowerBuilder
3
10.0¥Cryptograph にインストールされます。さらに、下記の 3 つの Java アーカイブ ファイル
(.jar)が Java の CLASSPATH 上に存在し、PowerBuilder がアクセス可能であることが必要です。
3 つのライブラリは以下のとおりです。
•
jce.jar にある Java Cryptography Extension ライブラリ。JDK 1.4 以降をインストールするこ
とで入手可能
• JCE プロバイダ。例えば、Bouncy Castle の http://www.bouncycastle.org にある bcprovjdk14-1xx.jar(xx にはバージョン番号が入る)にあるもの
• Java / PowerBuilder のみせかけのライブラリである pbcrypto-1_0.jar
最後のライブラリ pbcrypto-1_0.jar は、PowerBuilder 環境から Java 環境へのエントリ ポイントです。
実際には、PBCrypto プロキシは pbcrypto-1_0.jar ファイルの中で Java クラスの 1 つから生成され
ます。
PowerBuilder Exception に JCE Exception をマッピング
デザインをシンプルにするために、JCE 例外は、開発者が CATCH する必要がある単一の
PowerBuilder 例外に要約しました。その例外は、NoSuchAlgorithmException です。JCE 固
有のプラグイン アーキテクチャは、名前による暗号化方式の呼び出しを可能にし、プロバイダ
ベースのインストールで名前によるアルゴリズムの呼び出しが提供されていない場合には、
NoSuchAlgorithmException が送出されます。
PowerBuilder 環境に 各 JCE 例外をカスケードすることは可能ですが、JCE 固有の操作について開
発者が知識を持っている必要があります。暗号化ライブラリの将来のバージョンの中では、開発
者がプロダクト管理にフィードバックするために、PowerBuilder に例外を戻すよりもカスケード
するようになるかもしれません。
PBCrypto プロキシ オブジェクトのインスタンスの取得
PBCrypto プロキシは、n_cst_cryptography 非ビジュアル オブジェクト(NVO)からのみア
クセス可能です。n_cst_cryptography NVO は、Singleton デザイン方法(PowerBuiler 環境は
NVO のインスタンスが単一であることは保障しません。NVO は AutoInstantiate に true を設定しま
す)を手本にした単一メソッドを宣言します。開発者が暗号化方式を呼び出す必要があるときは
いつでも、n_cst_cryptography で getInstance() メソッドを呼びます。例は次のとおり
です。
n_cst_cryptography lnv_crypto
PBCrypto pbcrypto
TRY
IF lnv_crypto.of_getInstance(pbcrypto) THEN
//
// crypto 呼び出しをここで行う
//
END IF
CATCH (NoSuchAlgorithmException nsae)
MessageBox("Alert", nsae.getMessage())
END TRY
開発担当者の方には、アプリケーションの中で、テンプレートとして前述のコード例を使用する
ことをお勧めします。PowerBuilder 暗号化方式の技術の中での主目的の 1 つは、PowerBuilder 開発
者にとって簡素であることです。このコード例の中にあるように、単一メソッドの呼び出しの 1
つの TRY…CATCH ブロックの中で、PBCrypto プロキシ オブジェクトのインスタンスの取得と暗
号化処理の呼び出しの開始が可能です。
4
PBCrypto プロキシ API
PBCrypto プロキシは、pbcrypto-1_0.jar ライブラリの中で宣言している異なる 13 種類の異なる暗
号化メソッドを内包しています。本節では、それぞれのメソッドに関する詳細について説明し、
呼び出されたメソッドは表示するデモ アプリケーション内のウィンドウを指し示し、開発者がア
ルゴリズムや使い方などを学ぶことができるように『Java Cryptography Extensions: Practical Guide
for Programmers』内の参照先となる章または節を紹介しています。メソッドは、PowerBuilder オ
ブジェクト ブラウザで表示されるのと同じように、アルファベット順で紹介しています。
CreateRSAKeyPair
creatersakeypair ( ) returns any
throws nosuchalgorithmexception
RSA キーの組み合わせは、秘密キーの暗号化というような、プレーンテキストの量がとても少な
いデジタル署名方式や非対称暗号化方式で一般的に使用されます。非対称暗号化については第 3
章で解説し、デジタル署名については第 4 章の 4.4 節と 4.5 節で解説しています。
このメソッドの使い方を示す PBCrypto で提供しているサンプル コードは、
w_digital_signature.cb_create.clicked() メソッドにあります。以下の例は、そのコー
ドを使用しています。
n_cst_cryptography lnv_crypto
PBCrypto pbcrypto
String ls_keys[2]
TRY
IF lnv_crypto.of_getInstance(pbcrypto) THEN
ls_keys = pbcrypto.createRsaKeyPair()
mle_public.text = ls_keys[1]
mle_private.text = ls_keys[2]
END IF
CATCH (NoSuchAlgorithmException nsae)
MessageBox("Alert", nsae.getMessage())
END TRY
暗号化処理では、印刷可能な文字を含む出力結果を伴うことはほとんどなく、
createRsaKeyPair() メソッドからの戻りは自動的に Base64 でエンコードされることを覚えて
おくことはとても大事なことです。RSA キーの組み合わせを作成することは、本当は時間のかか
ることであり、ご使用のマシンのスピードに依存しますが、生成には 15 分 ほどかかります。生
成速度が遅いため、ユーザに何らかのメッセージを表示することをお勧めします。
注意:公開キーは、いつも配列の最初のエントリであり、秘密キーはいつも配列の二番目のエント
リです。
DecryptCipherTextUsingBlockCipher
decryptciphertextusingblockcipher ( string algorithm, string secretKey, string cipherText ) returns string
throws nosuchalgorithmexception
対称ブロック暗号には、NIST により採用された DES の替わりの AES(Advanced Encryption
Standard)のような暗号方式を含んでいます。対称暗号については、 2 章で説明しています。最初
の引数は、AES、DES、Blowfish、または JCE にインストールすることが可能なほかの暗号方式な
5
どの暗号方式の名前です。2 番目の引数は、オリジナル暗号処理で使用する Base64 エンコードの
秘密キーであり、3 番目の引数は、Base64 エンコードの暗号テキストです。
最初の引数で使用可能な方式の詳細については、第 1 章 1.4 節から 1.6 節までを参照してください。
このメソッドの使い方を示す PBCrypto で提供しているサンプル コードは、
w_symmetric_encryption.cb_decrypt.clicked() メソッドにあります。以下の例は、そ
のコードを使用しています。
n_cst_cryptography lnv_crypto
PBCrypto pbcrypto
TRY
IF lnv_crypto.of_getInstance(pbcrypto) AND
(Len(sle_encrypted.text) > 0) THEN
sle_decrypted.text =
pbcrypto.decryptCipherTextUsingBlockCipher("AES",
sle_secretKey.text,
sle_encrypted.text)
ELSE
MessageBox("Alert", "You must encrypt a phrase first!")
END IF
CATCH (NoSuchAlgorithmException nsae)
MessageBox("Alert", nsae.getMessage())
END TRY
秘密キーと暗号テキスト(暗号化されたテキスト)の両方は、渡されたときに Base64 エンコード
されているとみなされます。エンコードされていない値が渡ると、間違った暗号解読の結果とな
ります。メソッドから戻るプレーン テキストは、Base64 エンコードではありません。
メソッドへ渡す引数が null ではないことと、空の文字列ではないことを確認することがとても重
要です。
DecryptCipherTextUsingPBE
decryptciphertextusingpbe ( string algorithm, long salt[], long iters, character passphrase[], string cipherText ) returns string
throws nosuchalgorithmexception
PBE はパスワードに基づいた暗号化(Password Based Encryption)を意味しています。秘密キーが
暗号として安全な擬似乱数ジェネレータを使用して生成されたシステムの場合、ほかの対称暗号
とは異なり、このメソッドは誰かがパスフレーズやパスワードを入力することに依存します。こ
の場合特有の危険性は、パスワードが文字や数字や辞書にない単語の強力な組み合わせではない
かもしれないということです。
PBE は、第 2 章 2.8 節で説明しています。最初の引数は方式の名前であり、2 番目は暗号方式を準
備する乱数の salt 値であり、3 番目は暗号方式を準備中に実行する反復値であり、4 番目はパスフ
レーズを表す文字配列であり、5 番目は Base64 エンコードされた暗号テキストです。プレーン テ
キストはメソッドから戻り、それは Base64 エンコードではありません。
最初の引数で使用可能な方式の詳細については、第 1 章 1.4 節から 1.6 節までを参照してください。
このメソッドの使い方を示す PBCrypto で提供しているサンプル コードは、
w_pbe_encryption.cb_decrypt.clicked() メソッドにあります。以下の例は、そのコード
を使用しています。
6
n_cst_cryptography lnv_crypto
PBCrypto pbcrypto
//salt 値と反復値は暗号化時に同時に使用される必要がある。
//salt 値と反復値は大文字小文字の区別はなく、
//オープンなセキュアではないチャンネルを使用して共有できる。
long salt[] = { 23, 197, 85, 82, 13, 56, 213, 197 }
long iterations = 1000
TRY
IF lnv_crypto.of_getInstance(pbcrypto) AND
(Len(sle_passphrase.text) > 0) AND
(Len(sle_plaintext.text) > 0) THEN
sle_decrypted.text =
pbcrypto.decryptCipherTextUsingPBE("PBEWithMD5AndDES”,
salt,
iterations,
sle_passphrase.text,
sle_encrypted.text)
ELSE
MessageBox("Alert", "最初にパスフレーズまたは、メッセージを入力!")
END IF
CATCH (NoSuchAlgorithmException nsae)
MessageBox("Alert", nsae.getMessage())
END TRY
メソッドへ渡す引数が null ではないことと、空の文字列ではないことを確認することがとても重
要です。
DecryptSecretKeyUsingRSAPrivateKey
decryptsecretkeyusingrsaprivatekey ( string string_1, string string_2 ) returns string
throws nosuchalgorithmexception
限定的であり相対的に少量のデータのみではあるものの、RSA 非対称方式暗号をサポートします。
対称暗号と非対称暗号の組み合わせは、第 5 章 5.4.6 節で説明しています。対称暗号はより速く非
対称暗号よりも多いデータを扱うことができるため、この方法はとても協力です。この例のアー
キテクチャは、暗号の両方の種類の最善の機能の使い方について説明しています。
秘密キーは大きなプレーン テキスト ブロックを暗号化するために使用します。そして、秘密キー
は受取人の公開 RSA キーを使用して暗号化されます。暗号テキストと暗号化された秘密キーを安
全ではないチャネルを越えて配布することが可能となり、受取人は秘密キーを解読するためにプ
ライベート キーを使用し、秘密 キーは暗号テキストを解読するために使用し、メッセージのオリ
ジナルのプレーン テキストが明らかになります。最初の引数は、RSA 公開キーを使用して暗号化
された Base64 エンコードの秘密キーです。メソッドの結果は、秘密キーが Base64 エンコードさ
れて表されます。
このメソッドの使い方を示す PBCrypto で提供しているサンプル コードは、
w_symmetric_asymmetric_combo.cb_decrypt.clicked() メソッドにあります。以下の例
は、そのコードを使用しています。
n_cst_cryptography lnv_crypto
PBCrypto pbcrypto
7
TRY
IF lnv_crypto.of_getInstance(pbcrypto) THEN
sle_decrypted.text =
pbcrypto.decryptSecretKeyUsingRsaPrivateKey(sle_encrypted.text,
mle_private.text)
END IF
CATCH (NoSuchAlgorithmException nsae)
MessageBox("Alert", nsae.getMessage())
END TRY
メソッドへ渡す引数が null ではないことと、空の文字列ではないことを確認することがとても重
要です。このデモ ウィンドウでは、確実に値が存在している場合にのみボタンをクリックできる
ようにする仕様のコントロールを提供しています。
DumpBCProviderList
dumpbcproviderlist ( string engine ) returns string
これは、PowerBuilder 開発者が検索することを助けたり、ある暗号化エンジンで使用可能な方式
を特定するための単なるユーティリティ メソッドです。例えば、メッセージ ダイジェスト方式や、
使用可能な対象暗号方式のチェックなどを行うために使用することができます。使用可能な方式
の詳細については、第 1 章 1.4 節から 1.6 節までを参照してください。メソッドの唯一の引数は、
調べる暗号エンジンの正式な名前です。
このメソッドの使い方を示す PBCrypto で提供しているサンプル コードは、
w_dump_available_algorithms.ddlb_engine.selectionchanged() メソッドにありま
す。以下の例は、そのコードを使用しています。
n_cst_cryptography lnv_crypto
PBCrypto pbcrypto
IF lnv_crypto.of_getInstance(pbcrypto) THEN
mle_dump.text = pbcrypto.dumpBCProviderList(this.text)
END IF
エンジン名は、特定の JCE エンティティです。JCE の本の中でドキュメント化されたほかに使用
可能なエンジンに関しては、http://java.sun.com の「Java Cryptography Extension」ドキュメントを
参照してください。
EncryptPlainTextUsingBlockCipher
encryptplaintextusingblockcipher ( string algorithm, string secretKey, string plainText ) returns string
throws nosuchalgorithmexception
このメソッドは、本書の前半で説明した decryptCipherTextUsingBlockCipher() メソッドに直接関係
するものです。見出しとサンプルの情報については、そのメソッドについて確認してください。
最初の引数は方式名、2 番目は Base64 エンコードされた秘密キー、3 番目は暗号化されるプレー
ン テキストです。メソッドから返る暗号テキストは、Base64 エンコードされます。
以下の例は、このメソッドの呼び出し方を示しています。
n_cst_cryptography lnv_crypto
PBCrypto pbcrypto
8
TRY
IF lnv_crypto.of_getInstance(pbcrypto) AND
(Len(sle_secretKey.text) > 0) THEN
sle_encrypted.text =
pbcrypto.encryptPlainTextUsingBlockCipher("AES",
sle_secretKey.text,
sle_plaintext.text)
ELSE
MessageBox("Alert", "最初に秘密キーを生成する必要があります!")
END IF
CATCH (NoSuchAlgorithmException nsae)
MessageBox("Alert", nsae.getMessage())
END TRY
EncryptPlainTextUsingPBE
encryptplaintextusingpbe ( string algorithm, long salt[], long iters, character passphrase[], string plainText ) returns string
throws nosuchalgorithmexception
このメソッドは、本書の前半で説明した decryptCipherTextUsingPBE() メソッドに直接関係します。
見出しとサンプルの情報については、そのメソッドで確認してください。最初の引数は方式の名
前であり、2 番目は暗号方式を準備する乱数の salt 値であり、3 番目は暗号方式を準備中に実行す
る反復値であり、4 番目はパスフレーズを表す文字配列であり、5 番目は暗号化するプレーン テ
キストです。メソッドから返る暗号テキストは Base64 エンコードです。
以下の例は、このメソッドの呼び出し方を示しています。
n_cst_cryptography lnv_crypto
PBCrypto pbcrypto
long salt[] = { 23, 197, 85, 82, 13, 56, 213, 197 }
long iterations = 1000
//char password[] = { 'a', 'p', 'p', 'l', 'e', 'j', 'a', 'x'}
TRY
IF lnv_crypto.of_getInstance(pbcrypto) AND
(Len(sle_passphrase.text) > 0) AND
(Len(sle_plaintext.text) > 0) THEN
sle_encrypted.text =
pbcrypto.encryptPlainTextUsingPBE("PBEWithMD5AndDES",
salt,
iterations,
sle_passphrase.text,
sle_plaintext.text)
ELSE
MessageBox("Demo Alert", "最初にパスフレーズ/パスワードを入力す
る!")
END IF
CATCH (NoSuchAlgorithmException nsae)
MessageBox("Alert", nsae.getMessage())
END TRY
EncryptSecretKeyUsingRSAPublicKey
encryptsecretkeyusingrsapublickey ( string string_1, string string_2 ) returns string
throws nosuchalgorithmexception
9
このメソッドは、本書の前半で説明した decryptSecretKeyUsingRSAPrivateKey() メソッドに直接関
係します。見出しとサンプルの情報については、そのメソッドを参照してください。最初の引数
は、秘密キーを Base64 エンコードで表したものであり、2 番目の引数は Base64 エンコードの
RSA 公開キーです。メソッドの結果は、暗号化された秘密キーを Base64 エンコードで表現したも
のです。
以下の例は、このメソッドの呼び出し方を示しています。
n_cst_cryptography lnv_crypto
PBCrypto pbcrypto
TRY
IF lnv_crypto.of_getInstance(pbcrypto) THEN
sle_encrypted.text =
pbcrypto.encryptSecretKeyUsingRsaPublicKey(sle_secretkey.text,
mle_public.text)
END IF
CATCH (NoSuchAlgorithmException nsae)
MessageBox("Alert", nsae.getMessage())
END TRY
GenerateDigitalSignature
generatedigitalsignature ( string keyAlgorithm, string signatureAlgorithm, string privateKey, string document ) returns string
デジタル署名は、ある人からほかの人へ転送中に、ドキュメントのテキストや本文が不正に操作
されたり変更されたりすることがないことを確実にするための対称暗号とメッセージ ダイジェス
トのプロパティに依存した強力なメカニズムです。一般的に誤解されていることのひとつとして、
デジタル署名がドキュメントの操作しているということがあります。実際、デジタル署名は、元
の文書とは別に添付した送られたドキュメントのチェックサムとして簡単に考えることができま
す。従って、元の文書は、デジタル署名が生成されるときにどのような方法であっても変更され
ることはありません。
非対称暗号は第 3 章全体で説明しており、デジタル署名は第 4 章 4.4 節と 4.5 節で説明しています。
最初と 2 番目の引数には、キーと署名の方式をそれぞれ含んでいます。3 番目の引数には、
Base64 エンコードで表した RSA 秘密キーであり、4 番目の引数は署名をするドキュメントのプレ
ーン テキスト本文です。結果は、ドキュメントのデジタル署名を Base64 エンコードで表したも
のです。
このメソッドの使い方を示す PBCrypto で提供しているサンプル コードは、
w_digital_signature.cb_sign.clicked() メソッドにあります。以下の例は、そのコード
を使用しています。
n_cst_cryptography lnv_crypto
PBCrypto pbcrypto
TRY
IF lnv_crypto.of_getInstance(pbcrypto) THEN
sle_signature.text =
pbcrypto.generateDigitalSignature("RSA",
"MD5withRSA",
mle_private.text,
mle_message.text)
10
END IF
CATCH (NoSuchAlgorithmException nsae)
MessageBox("Alert", nsae.getMessage())
END TRY
最初の引数と 2 番目の引数に使用可能な方式の詳細については、第 1 章 1.4 節から 1.6 節を参照し
てください。
GenerateMessageAuthenticationCode
generatemessageauthenticationcode ( string algorithm, string secretKey, string document ) returns string
MAC(Message Authentication Codes)は、メッセージ ダイジェストのコンセプトがさらに一歩進
んでいます。Alice と Bob の二人の間でドキュメントとメッセージ ダイジェストを通信している
ときに、第三者の Eve が間に割り込み、ドキュメントを変更し、新しい値を反映するためにメッ
セージのダイジェストを変更することが可能です。MAC は、Alice と Bob の両者間のみで共有す
る秘密キーを内蔵し、メッセージ ダイジェストの計算に秘密キーを追加することで、この問題を
解決しています。このため、Eve がドキュメントまたはメッセージ ダイジェストのどちらかに変
更を加えようとした場合、秘密キーを持たない Eve は変更することができません。ドキュメント
やメッセージ ダイジェストが改ざんされたことは、Bob にはわかります。
MAC(Message Authentication Codes)は、第 4 章 4.3 節で説明しています。最初の引数は、使用す
る方法(アルゴリズム)を指定し、2 番目の引数は差出人と受取人の両者が知っている Base64 エ
ンコードされた秘密キーであり、3 番目の引数は、プレーン テキストのドキュメントです。その
戻りは、Base64 エンコードされたメッセージ ダイジェスト ハッシュです。
このメソッドの使い方を示す PBCrypto で提供しているサンプル コードは、
w_generate_mac.cb_generate.clicked() メソッドにあります。以下の例は、そのコード
を使用しています。
n_cst_cryptography lnv_crypto
PBCrypto pbcrypto
String ls_result
IF lnv_crypto.of_getInstance(pbcrypto) AND (Len(sle_secretKey.text) > 0)
THEN
ls_result =
pbcrypto.generateMessageAuthenticationCode("HMACMD5",
sle_secretKey.text,
sle_hashcode.text)
ELSE
MessageBox("Alert", "最初に秘密キーを生成する!")
END IF
最初の引数と 2 番目の引数に使用可能な方式の詳細については、第 1 章 1.4 節から 1.6 節を参照し
てください。
GenerateMessageDigest
generatemessagedigest ( string algorithm, string document ) returns string
メッセージ ダイジェストは、時間の経過と供にドキュメントに変更があったかどうかを判断する
際に役立ちます。ドキュメントの 1 ビットでも変更がある場合には、根本的にまったく異なる別
のメッセージ ダイジェスト値が戻ります。2 つの有名なメッセージ ダイジェスト方式(アルゴリ
11
ズム)である MD-5 と SHA-1 を使用しています。メッセージ ダイジェストについては、第 4 章で
説明しています。最初の引数では使用している方式(アルゴリズム)を指定し、2 番目の引数に
はプレーン テキスト ドキュメントを指定します。戻りは、Base64 エンコードされたメッセージ
ダイジェスト ハッシュです。
このメソッドの使い方を示す PBCrypto で提供しているサンプル コードは、
w_generate_message_digest.cb_generate.clicked() メソッドにあります。以下の例は、
そのコードを使用しています。
n_cst_cryptography lnv_crypto
PBCrypto pbcrypto
String ls_result
IF lnv_crypto.of_getInstance(pbcrypto) THEN
ls_result = pbcrypto.generateMessageDigest("SHA-1",
sle_hashcode.text)
END IF
最初の引数と 2 番目の引数に使用可能な方式の詳細については、第 1 章 1.4 節から 1.6 節を参照し
てください。
GenerateSecretKey
generatesecretkey ( string algorithm ) returns string
throws nosuchalgorithmexception
対称キーを生成する安全な方法は、暗号的に安全な擬似乱数ジェネレータに秘密キーを生成させ
ることです。このメソッドは、対称ブロック暗号で使用することができる安全な秘密キーを生成
するための JCE KeyGenerator エンジンに依存します。秘密キー ジェネレータについては、第 2
章 2.1 節から 2.4 節を参照してください。
このメソッドの使い方を示す PBCrypto で提供しているサンプル コードは、
w_symmetric_encryption.cb_secretkey.clicked() メソッドにあります。以下の例は、
そのコードを使用しています。
n_cst_cryptography lnv_crypto
PBCrypto pbcrypto
TRY
IF lnv_crypto.of_getInstance(pbcrypto) THEN
sle_secretkey.text = pbcrypto.generateSecretKey("HMACMD5")
END IF
CATCH (NoSuchAlgorithmException nsae)
MessageBox("Alert", nsae.getMessage())
END TRY
最初の引数と 2 番目の引数に使用可能な方式の詳細については、第 1 章 1.4 節から 1.6 節を参照し
てください。
VerifySignature
verifysignature ( string keyAlgorithm, string sigAlgorithm, string pubKey, string document, string signature) returns Boolean
このメソッドは、本書の前半で説明した generateDigitalSignature() メソッドに直接関係
するものです。見出しとサンプルの情報については、そのメソッドにて確認してください。最初
12
と 2 番目の引数は、キーと署名方式(アルゴリズム)をそれぞれ含みます。3 番目の引数は、
RSA 公開キーを Base64 エンコードで表したものです。4 番目の引数は、署名を受けるドキュメン
トのプレーン テキストの本文です。5 番目の引数は、確認のための Base64 エンコードされたデジ
タル署名です。ドキュメントが正常であると確認をし、有効でありと判断できた場合には、
Boolean 値の「true」が戻ります。
以下の例は、このメソッドの呼び出し方を示しています。
n_cst_cryptography lnv_crypto
PBCrypto pbcrypto
boolean lb_valid
TRY
IF lnv_crypto.of_getInstance(pbcrypto) THEN
lb_valid =
pbcrypto.verifySignature("RSA",
"MD5withRSA",
mle_public.text,
mle_message.text,
sle_signature.text)
MessageBox("Signature Verification Results", lb_valid)
END IF
CATCH (NoSuchAlgorithmException nsae)
MessageBox("Alert", nsae.getMessage())
END TRY
デジタル署名を確認する場合、5 番目の引数で渡されるデジタル署名の値を生成したのと同じキ
ーと署名方式(アルゴリズム)を必ず使用しなければなりません。
最後に
暗号化は、1 つの文書では完全にはカバーすることができない項目です。デモ アプリケーション、
本書、『Java Cryptography Extensions: Practical Guide for Programmers』、全体をとおして参照され
ている本などを組み合わせて参考にしてください。PowerBuilder に、開発者が複雑で強固な暗号
化解決方法を組み込む権限を与える完全な情報を、Java Cryptography Extensions が作成します。
「Be safe out there!」を忘れないでください。
13
Sybase, Inc.
Worldwide Headquarters
One Sybase Drive
Dublin, CA 94568-7902 USA
Tel: +800 8 SYBASE
www.sybase.com
Copyright © 2004 Sybase, Inc. All rights reserved. Unpublished rights reserved under U.S. copyright laws. Sybase and the Sybase logo are
trademarks of Sybase, Inc. All other trademarks are property of their respective owners. ® indicates registration in the United States.
Specifications are subject to change without notice. Printed in the U.S.A.
14