当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。
記事そのもののリンクについてはご自由に行っていただいてよいです。

テクてく Lotus 技術者 Slack に参加しよう!

2017年3月31日金曜日

IDボールトによる文書の暗号化(3)・・・XPagesで文書を暗号化する

皆さん、こんにちは。

今日で3月も終わり。明日からは2017年度になるという企業も多いことでしょう。
私も明日から社会人28年目になります。
これだけの年数、働いてきているので、もう少し大人っぽい発言や文章の書き方はできないものかなぁ?とも思うのですが、如何せん、そういうことが嫌いなので、このままのスタイルでやっていこうという所存です。


さて、今日も前回の予告通り、IBM Notes/Domino 9.0.1 Feature Pack8 の新機能であるXPagesでの文書の暗号化について書いていきます。

前回までの記事のリンクはこちらです。
IDボールトによる文書の暗号化(1)・・・LotusScriptでIDボールトの情報を取得する
IDボールトによる文書の暗号化(2)・・・XPagesで文書の暗号化/復号化を行う条件


今日はいよいよ、XPagesで文書の暗号化を行う方法について具体的に書いていきます。
サンプルコードも出していきますので必見ですよ!


1.XPagesの暗号化の仕様

まず、XPagesでの文書暗号化の仕様について確認しましょう。

IBM Knowledge Center内にあるencrypt(NotesDocument - Javascript)のヘルプ
https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/reference/r_domino_Document_encrypt.html

によると、XPagesでの文書の暗号化の手順は以下のようになります。


  1. IDVault オブジェクトを取り出します。
  2. getUserIDFile メソッドを使用して、IDVault から特定ユーザーの UserID オブジェクトを取り出します。
  3. getEncryptionKeys メソッドを使用して、UserID とともに使用可能な秘密鍵の名前のリストを取得します。
  4. setEncryptionKeys メソッドを使用して、文書の暗号化に使用する鍵を指定します。
  5. setEncryptionKeys とともに encrypt メソッドを使用して、指定の暗号キーセットで文書を暗号化します。


2.サンプルプログラム

次に、実際のサンプルコードを見ていきましょう。

上記をコード化したものが以下のサンプルです。

// 文書にセットする暗号キー(複数セット可能なのでVector型で定義する)
var secKeys:java.util.Vector = new java.util.Vector();

// NotesXspDocumentでは動作しなかったのでNotesDocumentを利用する
var docBackend:NotesDocument = document1.getDocument( true );

var secKey = "画面上で選択した暗号キー";

// dominoIDVaultBeanからサーバ名、ユーザ名、パスワードを取得する
var svname = dominoIDVaultBean.getServerName();
var uname = dominoIDVaultBean.getUserName();
var pswd = dominoIDVaultBean.getUserPassword();

// パスワードと暗号キーが取得できた場合だけ、文書を暗号化する
if ( pswd != null && secKey != "" ) {
    // IDボールト情報を取得する
    var idvault:NotesIDVault = session.getIDVault();
    
    // IDボールトからユーザIDを取得する
    var userid:NotesUserID = idvault.getUserID( uname, pswd, svname );
    
    // 暗号キーを文書にセットする
    secKeys.addElement( secKey );
    docBackend.setEncryptionKeys( secKeys );
    
    // 文書をユーザIDで暗号化する
    docBackend.encrypt( userid );
}
docBackend.save( true, true, true );



コードの説明はコメント行で説明している通りです。
1-12行目は文書を暗号化するにあたっての準備です。

実際の暗号化処理は14行目からになります。
まず、IDVaultの情報が取得できないといけないので、パスワード情報がdominoIDVaultBeanから取得できない場合、さらには文書にセットする暗号キーの情報が取得できない場合は、暗号化を行いません。
※暗号キー情報の取得方法は後述します。

17行目でIDVaultオブジェクトを取得しています。

20行目でIDボールトからユーザID情報を取得しています。
ヘルプでは、「getUserIDFile メソッドを使用して・・・」とありますが、これでは実現できませんので注意してください。
なお、 getUserIDFileメソッドはIDボールトからNotesユーザIDファイルをダウンロードするというものです。
実際のユーザIDファイルが破損したときに利用するものでしょう。
ここは、getUserIDというメソッドを使用します。
引数はユーザ名、パスワード、サーバ名の順番です。
パスワードは、HTTPパスワードではなく、ユーザIDのパスワードになるので注意してください。

23-24行目で暗号キーを文書にセットしています。
この暗号キーはシークレットキーと呼ばれるもので、あらかじめユーザIDに格納しておく必要があります。

27行目で文書を暗号化しています。引数はユーザID情報(NotesUserIDオブジェクト)を指定します。
このユーザID情報は上記でセットしたシークレットキーを持っている必要があります。
当たり前ですね。

最後に29行目で文書を保存します。


3.暗号キーの取得

今度は暗号キーの取得方法について見てみましょう。
LotusScriptの場合、NotesUserIDクラスのgetEncryptionKeysメソッドを使って一覧を取得していました。
それをダイアログリストの選択肢として設定することで、エンドユーザが選択できるような実装をしました。
XPagesの場合はどうでしょうか?
拡張ライブラリの中に「Secret Key Picker」というコントロールが用意されていて、それを利用することで暗号キー選択用のダイアログが設定できるようになっています。
Secret Key Pickerコントロール

これをXPageにドラッグ&ドロップすればいいのですが、利用にあたって条件があります。
あらかじめ、XPageにデータソースが定義してあることです。
そのページに直接定義していなくても、上位のページで定義してあればそれでも良いです。

ドラッグ&ドロップすると下図のようなウィザード画面が表示されます。
Secret Key Picker ウィザード画面

「Data source」がデータソースを指定する個所です。
すでにページにデータソースが定義されている場合、自動で選択されます。

「Form compute option」はフォーム検証の実行を設定します。このコントロールを利用する場合、必ず設定する必要があります。

「Add label」はピッカーの横に表示するラベルを設定できます。必要に応じて設定してください。

「Display encryption keys」のチェックを外すと、ピッカーで選択した暗号キーを画面上に表示しなくなります(styleにdisplay:noneが設定されるだけなので、参照する方法はいくらでもありますが・・・)。

「Add message control」 は、複数エラーメッセージコントロールをセットしてくれます。これも必要に応じて設定してください。

「Fomat for Bootstrap」は・・・レスポンシブデザインに対応してくれるのでしょう。済みません。未確認です。

ウィザードの設定が完了すると、下図のように画面上に表示されます。
Secret Key Pickerの画面デザイン


これで使えるように・・・なっていないのです。
上記画面に見える虫メガネをクリックしてソースタブを見ると、

// Your SSJS code to populate the keys goes here, e.g.
@UserSecretKeys();


と書いてあります。
どうやら暗号キーを取得する関数は自分で記述する必要がありそうです。

https://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/reference/r_wpdr_atfunctions_usersecretkeys_r.html によると、@UserSecretKeys()関数は引数なしでもよさそうですが、私の環境では動きませんでした。
※エラーにこそなりませんでしたがピッカーをクリックしても暗号キーの一覧が取得できませんでした。

ここは明示的に引数を設定しましょう。
引数の順序は、サーバ名、パスワード、ユーザ名です。
NotesIDVaultクラスのgetUserIDメソッドとは順番が異なるので注意してください。

※同じような情報を扱うんだから、引数の順序は統一してほしいなぁと思うのはわがままでしょうか・・・

私は下記のように記述しました。
var svname = dominoIDVaultBean.getServerName();
var uname = dominoIDVaultBean.getUserName();
var pswd = dominoIDVaultBean.getUserPassword();
@UserSecretKeys( svname, pswd, uname );


引数はすべてdominoIDVaultBeanから取得するようにしました。
ただし、あらかじめこの管理Beanに値をセットしておいてあります。

これでピッカーをクリックすると指定したユーザIDに格納されている暗号キーが選択できるようになります。
下図は実際にXPagesの画面でピッカーをクリックしたときのものです。
ピッカーをクリックして、暗号キーのリストを表示


4.デモ

では実際にXPagesで暗号化文書を作成したデモをお見せします。
撮影した動画をアップロードしておきます。




デモでは、XPagesの画面でのみの確認としていますが、実際にNotesクライアントで見ても暗号化されていることが分かります。


いかがでしょうか。
XPagesの暗号化の方法が分かっていただけたでしょうか?


このサンプルDBは、2年前の記事を書いた際に作成したものにXPages部分を追加したものです
XPages化するに当たっては既存の部分は手を入れていません(デモ用に見た目など、多少の改善は行っていますが・・・)。
暗号化データを取り扱っているからXPages化できなかったとか、暗号化データを取り扱うのは難しいので今までは避けていた。
というような方でも使えるようになったかと思います。


是非、挑戦してみてください。



次回は、文書の復号化はどのようにして行われたのか(動画ではさらっと流してましたが(笑))について解説しようと思います。



それでは今日はこの辺で・・・




Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

0 件のコメント: