🔐

C#でDPAPIを使用して機密データを安全に暗号化する方法

2024/10/05に公開

解法

C#でデータ保護API(DPAPI)を使用して機密データ(パスワードやAPIキーなど)を安全に暗号化・復号化する方法を紹介します。DPAPIを使用することで、Windowsの組み込み機能を利用して簡単かつ安全にデータを保護できます。

以下に具体的なコード例を示します:

using System;
using System.Text;
using System.Security.Cryptography;

// 暗号化関数
static string EncryptSensitiveData(string sensitiveData)
{
    byte[] dataBytes = Encoding.UTF8.GetBytes(sensitiveData);
    byte[] encryptedBytes = ProtectedData.Protect(dataBytes, null, DataProtectionScope.CurrentUser);
    return Convert.ToBase64String(encryptedBytes);
}

// 復号化関数
static string DecryptSensitiveData(string encryptedData)
{
    byte[] encryptedBytes = Convert.FromBase64String(encryptedData);
    byte[] decryptedBytes = ProtectedData.Unprotect(encryptedBytes, null, DataProtectionScope.CurrentUser);
    return Encoding.UTF8.GetString(decryptedBytes);
}

// 使用例
string apiKey = "my-super-secret-api-key";
Console.WriteLine($"元のAPIキー: {apiKey}");

string encryptedApiKey = EncryptSensitiveData(apiKey);
Console.WriteLine($"暗号化されたAPIキー: {encryptedApiKey}");

string decryptedApiKey = DecryptSensitiveData(encryptedApiKey);
Console.WriteLine($"復号化されたAPIキー: {decryptedApiKey}");

解説

  1. NuGetパッケージのインストール:
    まず、System.Security.Cryptography.ProtectedData パッケージをインストールします。

    dotnet add package System.Security.Cryptography.ProtectedData
    
  2. 暗号化と復号化のメソッド:

    • EncryptSensitiveData メソッド: APIキーなどの機密データを受け取り、DPAPIを使用して暗号化します。
    • DecryptSensitiveData メソッド: 暗号化されたデータを受け取り、DPAPIを使用して元の機密データに復号化します。
  3. DPAPIの使用例:

    • APIキーを暗号化し、安全に保存できる形式に変換します。
    • 必要なときに暗号化されたデータを復号化し、元のAPIキーを取得します。

補足情報

  • DPAPIの主な用途:

    1. アプリケーション設定内の機密情報(APIキー、アクセストークン)の保護
    2. ユーザーパスワードの安全な保存
    3. 暗号化キーやその他の機密データの保護
  • セキュリティ上の利点:

    • Windows OSに組み込まれた暗号化機能を利用するため、独自の暗号化ロジックを実装するリスクを回避できます。
    • ユーザーまたはマシン固有の鍵で暗号化されるため、他のユーザーやマシンでの復号化が困難です。
  • 注意点:

    • このコードはWindows環境でのみ動作します。
    • DataProtectionScope.CurrentUser を使用しているため、暗号化されたデータは現在のユーザーアカウントでのみ復号化可能です。
    • クロスプラットフォームアプリケーションでは、代替の暗号化方法を検討する必要があります。

DPAPIを使用することで、アプリケーション内の機密データを簡単かつ安全に保護できます。これにより、設定ファイルやデータベースに平文で機密情報を保存するリスクを大幅に軽減できます。

Discussion