他システムやデータベース、FTPサーバなどのパスワードをファイルやレジストリに保存する必要がある場合、何らかの形で暗号化して保存し、使用するときに復号化する、ということが必要になります。このようなときにCryptProtectDataとCryptUnprotectDataを使用する方法が考えられます。もちろんこれで万全かといわれると難しいところですが、少なくとも生のまま保存するよりはまし、といったところでしょうか。
CryptProtectDataで暗号化するときに第6パラメータ(dwFlags)にCRYPTPROTECT_LOCAL_MACHINEを含めると同一PC上の全てのユーザで復号化できてしまいますが、含めなければ同一PC上の同一のユーザでのみ復号化できます。また第3パラメータ(pOptionalEntropy)でエントロピを指定して暗号化しておけばCryptUnprotectDataで同じエントロピを指定しないと復号化できないようにすることができます。なおWindows 2000では第2パラメータのszDataDescrを省略する(NULLにする)ことができないので注意が必要です。
まず使用するCryptAPIと構造体を定義します。
CryptProtectData/CryptUnprotectDataで扱うデータは基本的にバイナリなので、まずはTStreamを暗号化してみます。
対象データと(指定されていれば)エントロピをTMemoryStreamに格納してそのMemory/SizeプロパティをDATA_BLOB構造体(=CRYPT_INTEGER_BLOB構造体)のpbData/cbDataにセットし、CryptProtectDataを呼び出します。DataOutには暗号化されたデータが格納されていますので、これを取り出し、最後に忘れずにLocalFreeでDataOutの内容を解放します。
復号化も同様に
対象データと(指定されていれば)エントロピをTMemoryStreamに格納してそのMemory/SizeプロパティをDATA_BLOB構造体のpbData/cbDataにセットし、CryptUnprotectDataを呼び出します。DataOutとPDescriptionには復号化されたデータと暗号化のときに指定したDescriptionが格納されていますので、これらを取り出し、最後に忘れずにLocalFreeでDataOutとPDescriptionの内容を解放します。もし復号化に失敗した場合は戻値がFalseになります。
長くなったので続きます。
元ねたはNyaRuRuさんのローカルストレージに保存するデータの暗号化 ― Windows の場合 - NyaRuRuの日記とEternalWindowsさんのDPAPIによる暗号化。
2010年8月6日
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿