秘密文字列を平文ファイルに置かない ― Windows DPAPIをPowerShellから呼ぶ

セキュリティカテゴリを表すパンダのイラスト セキュリティ

この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。.NETのProtectedData仕様を確認し、Windows DPAPIをPowerShellから呼んで秘密文字列を保護するTIPSとして整理しています。

検証ステータス:📘 公式API確認済み・PowerShellサンプル実装済み・Windows PowerShell 5.1実機未確認

秘密文字列を平文ファイルに置かない ― Windows DPAPIをPowerShellから呼ぶ

APIキーやパスワードを設定ファイルへそのまま書くのは避けたい。でも、個人PC上の小さな自動化で大がかりな秘密管理基盤までは用意したくない。そんなとき、WindowsにはDPAPIという仕組みがあります。

PowerShellからは.NETの System.Security.Cryptography.ProtectedData を使って呼べます。

CurrentUserスコープで保護する

# CurrentUserは「現在のWindowsユーザー」にひも付けて保護する指定です。

$scope = [System.Security.Cryptography.DataProtectionScope]::CurrentUser

# DPAPIはbyte配列を受け取るため、文字列をUTF-8へ変換します。


# ここでは説明用のダミー文字列を使っています。

$bytes = [Text.Encoding]::UTF8.GetBytes("dummy-secret")

# ProtectedData.Protect()がWindows DPAPIを呼び出します。


# 第2引数$nullは、追加エントロピーを使わない指定です。

$protected = [System.Security.Cryptography.ProtectedData]::Protect(
    $bytes,
    $null,
    $scope
)

# 暗号化後は文字列ではなくバイト列なので、バイナリのまま保存します。

[IO.File]::WriteAllBytes(".\secret.bin", $protected)

この例ではWindowsの現在ユーザーにひも付くスコープを使います。保存された secret.bin は平文文字列ではありません。

ただし「これで秘密管理は完璧」ではない

CurrentUserは、同じWindowsユーザーのコンテキストでは復号できます。つまり、端末やユーザーアカウント自体が侵害された場合まで守れる万能な仕組みではありません。

また、暗号化したファイルだけバックアップしても、ユーザープロファイルやDPAPIに必要な情報を失えば復号できなくなる可能性があります。

用途は、

  • 個人PC上の補助スクリプト

  • 平文保存を避けたい小規模な自動化

  • Windowsの秘密保護の仕組みを理解する教材

くらいから始めるのが分かりやすいです。

コマンドラインへ秘密を書かない

-Secret "本物のパスワード" のように引数へ入れると、履歴やログに残る可能性があります。GitHubのサンプルでは Read-Host -AsSecureString で入力し、変換用のメモリも可能な範囲で消去する形にしています。

flowchart LR
    A[秘密文字列] --> B[ProtectedData.Protect]
    B --> C[暗号化バイト列]
    C --> D[ファイル保存]
    D --> E[同じユーザーでUnprotect]

GitHubサンプル

公式情報・一次情報

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました