« Baby Care Report ~夏休みとか最近の色々~ | トップページ | 撮影ロボ「Party-Shot」に撮影を任せてみた記事 »

2009年8月21日 (金)

[VB.NET]DPAPIを利用して手軽に暗号化を実装する

まず、「DPAPI」は「Data Protection API」の略でWindows2000以降で提供されているデータの暗号化と復号化を行うためのWin32 APIです。

暗号化やその復号には暗号キーの管理がセキュリティ上非常に重要ですが、保存場所に気を使う必要があり、実装する場合に結構面倒な場合があります。

で、「DPAPI」はWindowsのユーザアカウントのパスワードを使用して、暗号化キーを生成し、その暗号キーをWindowsがアプリに代わって管理してくれる事で「暗号化キーの保護」と言う面倒な事を肩代わりしてくれます。

以前にご紹介した暗号化方法はキーの保存が面倒でしたので「Windowsアプリでパスワードなどをアプリ上で簡単に保存したい」って場合はDPAPIを利用した方が便利でしょう。

で、ソースは以下の通りとなります。

Public Class DPAPIClass

    Public Shared Function ProtectedString(ByVal strSrc As String) As String

        Try
            '文字列をバイト型配列に変換
            Dim srcData As Byte() = System.Text.Encoding.UTF8.GetBytes(strSrc)

            'DPAPIで暗号化(暗号化用の追加バイト配列は未使用・スコープはユーザ)
            Dim returnValue As Byte() = System.Security.Cryptography.ProtectedData.Protect(srcData, Nothing, System.Security.Cryptography.DataProtectionScope.CurrentUser)

            '暗号化されたデータをBASE64で文字列に変換
            ProtectedString = System.Convert.ToBase64String(returnValue)

        Catch ex As Exception
            ProtectedString = ""
        End Try

    End Function

    Public Shared Function UnProtectedString(ByVal strSrc As String) As String

        Try
            'BASE64の文字列になってる暗号化データに戻す
            Dim srcData As Byte() = System.Convert.FromBase64String(strSrc)

            'DPAPIで復号化(暗号化用の追加バイト配列は未使用・スコープはユーザ)
            Dim returnValue As Byte() = System.Security.Cryptography.ProtectedData.Unprotect(srcData, Nothing, System.Security.Cryptography.DataProtectionScope.CurrentUser)

            '復号化されたデータを文字列に変換
            UnProtectedString = System.Text.Encoding.UTF8.GetString(returnValue)

        Catch ex As Exception
            UnProtectedString = ""
        End Try

    End Function

End Class

実行するには、System.Securityの参照が必要となります。

DPAPIClass.ProtectedStringメソッドに暗号化したい文字列を渡すと暗号化した文字列が返ってきて、DPAPIClass.UnProtectedStringメソッドに暗号化された文字列を渡すと復号した文字列が返ってきます。
(便宜的にエラーが発生した場合は長さゼロの文字列を返しています)

ちなみにSystem.Security.Cryptography.ProtectedDataのProtectメソッドやUnprotectメソッドの第2引数(サンプルではNothingになってる箇所)は暗号化のための追加バイト配列で同一ユーザや同一マシンでも追加バイト配列の中身を知らないと元に戻せないよーにする事も可能です。

また、同メソッドの第3引数(サンプルではSystem.Security.Cryptography.DataProtectionScope.CurrentUserになってる箇所)は暗号化の保護範囲を示すもので、CurrentUserであれば現在のユーザー、LocalMachineであればコンピュータ単位となります。

ご察しの通り、「DPAPI」は暗号キーの管理をWindowsに依存するため、PCが吹っ飛んでWindowsを再インストールした場合、復号が行えなくなる可能性が高いです。(試してないので不明)
なので「DPAPI」の使用はアプリに必要とされる耐障害性と照らし合わせて決める必要があります。

|

« Baby Care Report ~夏休みとか最近の色々~ | トップページ | 撮影ロボ「Party-Shot」に撮影を任せてみた記事 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/26493/31040461

この記事へのトラックバック一覧です: [VB.NET]DPAPIを利用して手軽に暗号化を実装する:

« Baby Care Report ~夏休みとか最近の色々~ | トップページ | 撮影ロボ「Party-Shot」に撮影を任せてみた記事 »