japan.internet.com The Internet & IT Network


RSSニュース検索
カテゴリ
> トップページ
> Webビジネス
> Eコマース
> Webファイナンス
> Webマーケティング
> パブリック
> Webテクノロジー
> 携帯・ワイヤレス
> Linux Today
> Linux Tutorial
> J.I.C.ブログ
キャリア
> 転職ならen
> 派遣ならen
> アルバイトならen
> IT求人情報
ヘッドライン
> 今日のヘッドライン
> 週間ヘッドライン
Special Link
> フォトコミュニティ
> ストックフォト
> クリップアート
> イラスト
> フェリカ
> Web2.0
> 写真
イベント&セミナー
> イベントカレンダー
> 書評「IT の耳」
> 出張・接待検索
> ニュースガジェット 注目
無料ニュースメール
> 新規登録
> 変更・解除
> オプトインメールの登録・変更・解除
インフォメーション
> パートナーサイト
転職ならエン
就職ならen
求人ならen
履歴書ならen
アルバイトならエン
CRM/SFAならオラクル
> グループ会社
株式会社アエリア
(株)サンゼロミニッツ
株式会社エアネット
> お問い合わせ
> 広告掲載について
> リンクについて
> 著作権について
> その他お問い合わせ
> 利用規約
> 個人情報保護方針
> 会社概要地図
デベロッパー 2005年11月1日 10:00
デベロッパー・バックナンバー
Blowfish暗号化データをMSXML2 DOMオブジェクトに直接ロードする

著者: Tom Archer  オリジナル版を読む プリンター用 記事を転送
2005年11月1日 10:00 付の記事
海外internet.com発の記事
このエントリーを含むはてなブックマーク この記事をクリップ! Buzzurlにブックマーク Yahoo!ブックマークに登録 newsing it!

はじめに

 MSXML2ライブラリを使用するときは、通常は、IXMLDOMDocumentのインスタンスを生成し、そのload関数を呼び出す(ここでファイル名のBSTR表現を引き渡す)ことで、XMLファイルをディスクからDOM(Document Object Model)オブジェクトにロードします。しかし、私は最近、セキュリティ上の問題から、まずメモリ内でXMLデータを復号してからそのメモリを(ディスクに書き出さずに)DOMオブジェクトにロードしなければならない、という事態に遭遇しました。私はオープンソースの例の中からこれを行う方法を探したのですが、意外にも見つけることができませんでした。そこで、このタスクを行うためのいくつかのヘルパー関数を作成しました。私と同じような状況に置かれた他の人々にも役立つと思うので、ここで紹介させてもらいます。

DecryptFile2Bstrヘルパー関数

 説明を続ける前に、1993年にBruce Schneier氏がBlowfish暗号化アルゴリズムを発表して以来、多くの実装が登場していることを述べなければなりません。私は、高速で信頼できるデータ暗号化/復号のための暗号化手段を必要としていたのですが、その目的にはGeorge Anescu氏による実装を使用するのが特に簡単であると思いました。そのため、私の関数は、George Anescu氏によるCBlowFishクラスを使用して暗号化されたデータを扱うようにできています。

 私が解決策を探しているときに最初に学んだことは、IXMLDOMDocumentオブジェクトがloadXMLという関数をサポートしており、この関数は解析対象のXMLを表すBSTR値を取るということです。クライアント側をできるだけ簡潔にする、というのが私のコーディングスタイルなので、今回も、クライアント側から呼び出せる1つの関数で、ほとんどすべてのことを行わせたいと考えていました。そこで作成したのが、入力ファイル名とパスワード(どちらもcharポインタ)を取り、BSTR値を戻すDecryptFile2Bstr関数です(下記参照)。戻されたBSTR値は、IXMLDOMDocument::loadXML関数で使用することができます。

 下記のコードからわかるとおり、DecryptFile2Bstr関数はCBlowFishオブジェクトをインスタンス化した後、CBlowFish::Decryptを呼び出す前に、私が作成したもう1つのヘルパー関数であるGetFormattedFileContentを呼び出します。GetFormattedFileContent関数とCBlowFish::Decrypt関数の両方に使用されるデータがcharバッファという形式なので、DecryptFile2Bstr関数は呼び出し元に戻る前に標準COMユーティリティ関数ConvertStringToBSTRを呼び出します。

BSTR DecryptFile2Bstr(char* inputFileName, char* password)
{
  try
  {
    int requiredFileSize;
    CBlowFish oBlowFish((unsigned char*)password, sizeof(password));
    char *buffer = GetFormattedFileContent( inputFileName,
                                            requiredFileSize );

    oBlowFish.Decrypt((unsigned char *)buffer, requiredFileSize);

    return _com_util::ConvertStringToBSTR(buffer);
  }
  catch ( char *ex )
  {
    throw ex;
  }
}

 Blowfishアルゴリズムは8バイトのブロックをベースとするため、GetFormattedFileContent関数はそのブロック単位でデータをメモリに読み込みます。このルールに適合させるために、関数の最後でパディングを行っていることに注目してください。

char* GetFormattedFileContent(char *filePath, int &requiredFileSize)
{
  FILE *fp = fopen(filePath, "r+b");

  int fileSize = FileSize(fp);
  int index = fileSize;

  if ( (fileSize % 8) != 0 )
    requiredFileSize = ((fileSize / 8) + 1) * 8;
  else
    requiredFileSize = fileSize;

  char *buffer = new char[requiredFileSize + 1];
  fread(buffer, sizeof(char), fileSize, fp);
  buffer[fileSize] = 0;
  fclose(fp);
  while (index < requiredFileSize)
    buffer[index++] = 0;

  return buffer;
}

int FileSize(FILE *fp)
{
  char buffer[1];
  int count = 0;
  fseek(fp, 0, SEEK_SET);
  while (fread(buffer, sizeof(buffer), 1, fp) != 0) count++;
    fseek(fp, 0, SEEK_SET);
  return count;
}

DecryptFile2Bstr関数の使用

 データがCBlowFishクラスを使用して暗号化されている場合は、下記の太字で示した2行のコードで、そのデータをXML DOMオブジェクトにロードすることができます。

#import <msxml4.dll& named_guids
using namespace MSXML2;

...

::CoInitialize(NULL);

MSXML2::IXMLDOMDocumentPtr plDomDocument;

HRESULT hr = plDomDocument.CreateInstance(MSXML2::CLSID_DOMDocument);
if (SUCCEEDED(hr))
{
  // load the file as an XML document
  BSTR = DecryptFile2Bstr(L"MyFile.xml", DEFS_ENC_PASSWORD);
  variant_t vResult = plDomDocument->loadXML(xmlfile);

  ...

今後について

 MSMXL2 IXMLDOMDocument::loadXMLを私のヘルパー関数と組み合わせることにより、ディスクへの復号を行うことなく、クライアントの機密データをメモリに読み込み、復号することができました。また、これらの関数を拡張し、CBlowFishで暗号化されたデータを持つファイルを指定ファイルに復号するヘルパー関数(DecryptFile2File)や、プレーンASCIIデータをCBlowFishで暗号化されたファイルにするヘルパー関数(EncryptFile2File)などを組み込めるようにしました。もしこれらの関数を必要としている方、あるいは興味をお持ちの方がいましたら、これらも公開しようと思います。

著者紹介

Tom Archer(Tom Archer)
.NETプログラマの教育・指導、プロジェクト管理コンサルティングを専門とする研修会社、Archer Consulting Groupを経営。同社がどのように貴社の開発コストを削減させ、ソフトウェアを市場に早く送り出し、製品からの収入を増やすのに役立ってくれるのかを知りたい場合は、同社のWebサイトをお訪ねください。


関連記事
  • ASP.NETを利用した共有リソースへのアクセス方法
  • ASP.NET が生成する HTML タグを Firefox や Opera にも対応させる方法
  • .NETでのトレースの方法と独自のトレースリスナの実装
  • MASM32によるアセンブラ入門:パート1
  • MASM32によるアセンブラ入門:パート2


  • 関連テーマ
  • オープンソース
  • 暗号化
  • XML


  • ★最新トップニュース
    国内 ワコムの「Intuos3」が宇宙ステーションでも活躍(Webテクノロジー 8月22日 13:50)
    ワコムのA4ペンタブレット「Intuos3」が宇宙ステーションでも使用されているという。同社が2008年8月22日発表した。同ペンタブレットは、「人間がどのように距離と次元を認識するかを分析をする」ためのプロジェクトで使用されている。
    国内 検索から1クリックで動画を Blog 形式で見れる「YouTube2.in」画像のある記事(Webビジネス 8月22日 12:50)
    永上裕之氏は2008年8月21日、YouTube の検索から1クリックで動画を見れる、「YouTube2.in 〜 サクサク動画検索しちゃう」を開始した。
    海外 Amazon.com、新たなクラウド型ストレージサービスを開始(Webビジネス 8月22日 12:30)
    Amazon.com は21日、『Amazon Elastic Compute Cloud』(EC2) の一環として、新しいクラウド型ストレージ サービス『Amazon Elastic Block Store』(EBS) を正式に開始した。
    海外 『iPhone』ユーザーが Apple を告訴、通信事業者にも波及か(携帯・ワイヤレス 8月22日 12:20)
    ネットワーク接続性が約束通りの期待を満たしていないとして、『iPhone 3G』ユーザーが Apple を訴えた。同様の訴訟が、移動体通信事業者にも及ぶ可能性もある。
    国内 モバゲータウン、10代の4割以上が利用――ネットエイジア調べ(Webマーケティング 8月22日 12:10)
    ネットエイジア株式会社は、携帯電話ユーザーに対し「ケータイの利用コンテンツ」に関しての実態調査をモバイルリサーチにて実施、2008年8月22日、調査結果を発表した。
    トピックス
    > オススメのIT系求人情報【毎週月曜日更新】
    footer_301.gif


    リサーチ
    > デイリーリサーチDLサイト
    > OnlineResearchPortal (リサーチデータバンク)
    > モバイルリサーチ with goo
    footer_301.gif
    キーワード
    > iPhone > Youtube
    > Google > モバイルノート
    > 半導体 > ウィルコム
    > テーマ一覧はこちら
    footer_301.gif
    セミナー情報
    > 第1回インターネットコムマーケティングセミナー「新規クライアントを効率的に獲得する Web マーケティング手法とは」(3月26日)多数のご参加ありがとうございました
    footer_301.gif
    デベロッパー
    > DevX
    > CodeGuru
    > developer.com
    footer_301.gif
    j.i.c.ブログ
    ブログ一覧
    ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」 【ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」】
    「ASP・SaaS型サービス提供会社を成功へ導く徹底サポート!」/株式会社ディーネット(8月22日)
    最新テクノロジーの意外な処方箋 【最新テクノロジーの意外な処方箋】
    帰ってきたWeb 2.0 予測市場(8月22日)
    データメーション 【データメーション】
    中古家電買い取りサイトはどこがベストか?(8月21日)
    デスマーチからの脱却 【デスマーチからの脱却】
    30min. iPhoneアプリリリース(8月18日)
    エンジニアの独り言 【エンジニアの独り言】
    技術進歩の落とし穴!?誰のためにシステムを作っていますか?(8月18日)
    Skypeブログ出張版 【Skypeブログ出張版】
    パナソニックWiFiフォン購入でSkype1ヶ国プランプレゼント(8月13日)
    footer_301.gif
    最新コラム一覧
    IT マネジメント IT マネジメント

    「クラウドコンピューティング」がくだらない理由(8月22日)
    CodeGuru CodeGuru

    AndroidでのGoogle APIを使った地図表示(8月22日)
    最新アフィリエイト事例にみる成功の法則 最新アフィリエイト事例にみる成功の法則

    報酬設定と成果地点の最適化について(8月22日)
    最新ハイテク講座 最新ハイテク講座

    太陽光発電だけじゃない!環境にやさしいエコ発電の最新事情(8月22日)
    週刊-サイト別アクセス状況データ 週刊-サイト別アクセス状況データ

    ビデオリサーチインタラクティブ調査(月間インターネットオーディエンスデータ)(8月21日)
    気になるオープンソースソフトウェア 気になるオープンソースソフトウェア

    オープンソースのアプリケーションサーバー Apache Geronimo その3(8月21日)
    「IT の耳」 「IT の耳」

    【書評】『暗号解読』―ロゼッタストーンから量子暗号まで―(8月21日)
    検索エンジンマーケティング 検索エンジンマーケティング

    EZweb ではキャリア非公式サイトがクリックされる3つの理由(8月21日)
    百式のネットビジネス研究 百式のネットビジネス研究

    あるテーマに沿ったリンクを集めて共有するのに便利そうな「Agglom」(8月21日)
    Eメールマーケティング事情 Eメールマーケティング事情

    メルマガからメールマーケティングへ(8月20日)
    footer_301.gif
    専門チャンネル
    > セキュリティチャネル > テレコムチャネル
    > サーチエンジンウォッチ
    footer_301.gif
    海外のインターネットコム アメリカ韓国ドイツトルコ
    関連企業のサイト:ストックフォト イラスト ネットストリート ホテル予約サイト タウン情報 出張 事業継承 シミュレーション トランクルーム 優待映画チケット 田舎暮らしガイド オリジナルデザインTシャツ ニタコエ
    Copyright 2008 Jupitermedia Corporation All Rights Reserved. http://www.internet.com/
    space.gif space.gif