@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/2026/03/16/000-windows-app-secret-storage-best-practices-dpapi/#article>
    schema:about <https://comcomponent.com/knowledge/dpapi/>, <https://comcomponent.com/knowledge/app-secrets/> ;
    schema:mentions <https://comcomponent.com/knowledge/windows-service/>, <https://comcomponent.com/knowledge/desktop-app/>, <https://comcomponent.com/knowledge/microsoft-account/>, <https://comcomponent.com/knowledge/dpapi-currentuser-scope/>, <https://comcomponent.com/knowledge/dpapi-localmachine-scope/>, <https://comcomponent.com/knowledge/credential-locker/>, <https://comcomponent.com/knowledge/credential-manager-api/>, <https://comcomponent.com/knowledge/dpapi-decryption-failure/>, <https://comcomponent.com/knowledge/common-client-secret/>, <https://comcomponent.com/knowledge/secret-config-file-leak/>, <https://comcomponent.com/knowledge/plaintext-secret-storage/>, <https://comcomponent.com/knowledge/credential-pair/>, <https://comcomponent.com/knowledge/cross-machine-secret-sharing/>, <https://comcomponent.com/knowledge/colocated-key-encryption/> .

<https://comcomponent.com/knowledge/dpapi/> a skos:Concept ;
    skos:prefLabel "DPAPI"@ja ;
    skos:definition "実行中のマシン上でアプリの秘密情報を保護するWindowsのデータ保護API。"@ja ;
    skos:altLabel "データ保護API"@ja ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/common-client-secret/> ;
    ks:configuredBy <https://comcomponent.com/knowledge/dpapi-currentuser-scope/> ;
    ks:configuredBy <https://comcomponent.com/knowledge/dpapi-localmachine-scope/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/app-secrets/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/credential-pair/> .

<https://comcomponent.com/knowledge/app-secrets/> a skos:Concept ;
    skos:prefLabel "アプリの秘密情報"@ja ;
    skos:definition "業務アプリが扱う接続文字列・APIキーなどの秘密情報。ログオン済みマシンではドライブ暗号化では守れない。"@ja ;
    skos:altLabel "接続文字列"@ja ;
    skos:altLabel "APIキー"@ja .

<https://comcomponent.com/knowledge/plaintext-secret-storage/> a skos:Concept ;
    skos:prefLabel "秘密情報の平文保存"@ja ;
    skos:definition "APIキーや接続文字列などの秘密情報を設定ファイルにそのまま平文で保存すること。ファイルを読まれた時点で秘密がそのまま漏えいする。"@ja ;
    skos:altLabel "平文設定"@ja ;
    skos:altLabel "平文パスワード保存"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/secret-config-file-leak/> .

<https://comcomponent.com/knowledge/secret-config-file-leak/> a skos:Concept ;
    skos:prefLabel "設定ファイル単体の流出による秘密漏えい"@ja ;
    skos:definition "誤送付・バックアップ流出・リポジトリ混入などで設定ファイルだけが第三者に渡り、そこに含まれる秘密情報が読まれること。"@ja ;
    skos:altLabel "設定ファイル漏えい"@ja ;
    skos:altLabel "秘密情報の平文流出"@ja .

<https://comcomponent.com/knowledge/colocated-key-encryption/> a skos:Concept ;
    skos:prefLabel "鍵を暗号文と同じ場所に置く自前暗号"@ja ;
    skos:definition "AES等で自前暗号化しつつ、復号鍵を同じ設定ファイルやバイナリに置く実装。鍵管理をアプリ自身が担うため平文に近い強度しか得られない。"@ja ;
    skos:altLabel "自前AES"@ja ;
    skos:altLabel "鍵の同居"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/secret-config-file-leak/> .

<https://comcomponent.com/knowledge/common-client-secret/> a skos:Concept ;
    skos:prefLabel "全クライアント共通の長期秘密"@ja ;
    skos:definition "全ての配布先で同じ値を使う接続情報やAPIキーなど、どこか1台から抜かれた時点で全体に波及しやすい秘密の持たせ方。"@ja ;
    skos:altLabel "共通APIキー"@ja ;
    skos:altLabel "共通固定資格情報"@ja .

<https://comcomponent.com/knowledge/dpapi-currentuser-scope/> a skos:Concept ;
    skos:prefLabel "DataProtectionScope.CurrentUser"@ja ;
    skos:definition "DPAPIで保護したデータの復号主体をそのWindowsユーザーに限定するスコープ指定で、通常のデスクトップアプリで基本となる。"@ja ;
    skos:altLabel "CurrentUserスコープ"@ja ;
    skos:altLabel "ユーザースコープ"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/desktop-app/> .

<https://comcomponent.com/knowledge/dpapi-localmachine-scope/> a skos:Concept ;
    skos:prefLabel "DataProtectionScope.LocalMachine"@ja ;
    skos:definition "DPAPIで保護したデータを同じマシン上で動く任意のプロセスから復号可能にするスコープ指定で、共用端末では危険になりやすい。"@ja ;
    skos:altLabel "LocalMachineスコープ"@ja ;
    skos:altLabel "マシンスコープ"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/windows-service/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/desktop-app/> .

<https://comcomponent.com/knowledge/desktop-app/> a skos:Concept ;
    skos:prefLabel "対話ユーザーのデスクトップアプリ"@ja ;
    skos:definition "ログオンしたユーザー本人の権限で動くデスクトップアプリケーション。"@ja .

<https://comcomponent.com/knowledge/windows-service/> a skos:Concept ;
    skos:prefLabel "Windowsサービス"@ja ;
    skos:definition "ユーザーのサインインと無関係にバックグラウンドで動くWindowsのプロセス。"@ja ;
    skos:altLabel "サービス"@ja .

<https://comcomponent.com/knowledge/dpapi-decryption-failure/> a skos:Concept ;
    skos:prefLabel "DPAPI復号失敗"@ja ;
    skos:definition "保護時と復号時で紐づくWindowsユーザーやコンピューターの鍵材料が一致せず、ProtectedData.Unprotectが失敗する事象。"@ja ;
    skos:altLabel "CryptographicException" ;
    skos:altLabel "復号できないデータ"@ja .

<https://comcomponent.com/knowledge/credential-pair/> a skos:Concept ;
    skos:prefLabel "ユーザー名とパスワードの組"@ja ;
    skos:definition "ログイン資格情報として扱われる、ユーザー名とパスワードのペア形式のデータ。"@ja ;
    skos:altLabel "ユーザー名+パスワード"@ja ;
    skos:altLabel "ログイン資格情報"@ja .

<https://comcomponent.com/knowledge/credential-locker/> a skos:Concept ;
    skos:prefLabel "Credential Locker(PasswordVault)"@ja ;
    skos:definition "ユーザー名とパスワードの組をOSが管理する形で保存するWinRTの資格情報保管APIで、1アプリあたり20件まで、かつMicrosoftアカウントで端末間ローミングされる。"@ja ;
    skos:altLabel "PasswordVault" ;
    skos:altLabel "資格情報ロッカー"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/credential-pair/> .

<https://comcomponent.com/knowledge/credential-manager-api/> a skos:Concept ;
    skos:prefLabel "Credential Manager(CredWrite/CredRead)"@ja ;
    skos:definition "wincred.hのWin32 APIで資格情報をOSが管理するストアへ保存・取得する仕組みで、ローミングはせず現在のトークンのログオンセッションに紐づく。"@ja ;
    skos:altLabel "CredWrite" ;
    skos:altLabel "CredRead" ;
    skos:altLabel "wincred" ;
    ks:recommendedFor <https://comcomponent.com/knowledge/credential-pair/> .

<https://comcomponent.com/knowledge/microsoft-account/> a skos:Concept ;
    skos:prefLabel "Microsoftアカウント"@ja ;
    skos:definition "個人向けサービスにサインインするためのMicrosoftのアカウント。"@ja ;
    skos:altLabel "MSアカウント"@ja .

<https://comcomponent.com/knowledge/cross-machine-secret-sharing/> a skos:Concept ;
    skos:prefLabel "複数マシン・複数ユーザーでの秘密共有"@ja ;
    skos:definition "同じ暗号文やシークレットを複数のPCや複数ユーザーで共通して復号・利用したいという要件。"@ja ;
    skos:altLabel "秘密の共有要件"@ja ;
    skos:altLabel "複数端末での秘密共有"@ja .

<https://comcomponent.com/knowledge/admin-password-reset/> a skos:Concept ;
    skos:prefLabel "管理者によるパスワードのリセット"@ja ;
    skos:definition "管理者がユーザーのWindowsパスワードをリセットする操作。DPAPIの保護に使われる鍵材料への紐付けが外れ、保護済みデータへアクセスできなくなることがある。"@ja ;
    skos:altLabel "パスワードリセット"@ja .

<https://comcomponent.com/knowledge/profile-recreation/> a skos:Concept ;
    skos:prefLabel "プロファイルの再作成"@ja ;
    skos:definition "Windowsのユーザープロファイルが削除され新規に作り直されること。新しいプロファイルは別の鍵材料を持つため、以前のDPAPI暗号文は復号できない。"@ja ;
    skos:altLabel "新規プロファイル"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/dpapi-decryption-failure/> .

<https://comcomponent.com/knowledge/ciphertext-cross-pc-copy/> a skos:Concept ;
    skos:prefLabel "暗号文だけの別PCへのコピー"@ja ;
    skos:definition "DPAPIで保護した暗号文だけを、鍵材料のあるユーザープロファイルを伴わずに別のPCへコピーすること。CurrentUserスコープでは復号に必要な鍵材料が元のプロファイル側にあるため読めない。"@ja ;
    skos:altLabel "暗号文のみの持ち出し"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/dpapi-decryption-failure/> .

<https://comcomponent.com/knowledge/roaming-user-profile/> a skos:Concept ;
    skos:prefLabel "ローミングプロファイル"@ja ;
    skos:definition "ユーザーのプロファイルをネットワーク上に保持し、ログオンした別のコンピューターでも同じプロファイルとして読み込まれる仕組み。鍵材料もプロファイルと一緒に移動する。"@ja ;
    skos:altLabel "ローミングユーザープロファイル"@ja .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/plaintext-secret-storage/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/secret-config-file-leak/> ;
    schema:description "平文で保存された秘密情報は、設定ファイルが読まれた瞬間にそのまま漏えいする"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptprotectdata> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dpapi/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/secret-config-file-leak/> ;
    schema:description "DPAPIで保護すると、設定ファイル単体の流出や別PCへの持ち出しだけでは秘密をすぐには読めなくなる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.protecteddata?view=windowsdesktop-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/colocated-key-encryption/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/secret-config-file-leak/> ;
    schema:description "復号鍵を暗号文と同じ場所に置く自前暗号は、設定ファイルが流出すればほぼそのまま秘密も流出する"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/security/how-to-use-data-protection> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dpapi/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/common-client-secret/> ;
    schema:description "全クライアント共通の長期秘密は、どこか1台でアプリが復号できれば取り出せてしまうため、DPAPIで保存しても根本解決にならない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.dataprotectionscope?view=windowsdesktop-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dpapi/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/dpapi-currentuser-scope/> ;
    schema:description "DPAPIはDataProtectionScope.CurrentUserを指定して構成できる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.dataprotectionscope?view=windowsdesktop-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dpapi/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/dpapi-localmachine-scope/> ;
    schema:description "DPAPIはDataProtectionScope.LocalMachineを指定して構成できる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.dataprotectionscope?view=windowsdesktop-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dpapi-currentuser-scope/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/desktop-app/> ;
    schema:description "通常のWindowsデスクトップアプリではCurrentUserスコープを基本にすべきとされる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/standard/security/how-to-use-data-protection> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dpapi-localmachine-scope/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/windows-service/> ;
    schema:description "LocalMachineは信頼された単一用途マシン上のWindowsサービスなど、用途を絞ったケースに向く"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.dataprotectionscope?view=windowsdesktop-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dpapi-localmachine-scope/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/desktop-app/> ;
    schema:description "普通のデスクトップアプリでLocalMachineを選ぶと、その端末上の他プロセスにも復号可能性を広げてしまい危険になりやすい"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.dataprotectionscope?view=windowsdesktop-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/windows-service/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/dpapi-decryption-failure/> ;
    schema:description "サービスでimpersonationを行う際、対象ユーザーのプロファイルがロードされていないとDPAPIの復号に失敗する"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.protecteddata?view=windowsdesktop-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dpapi/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/app-secrets/> ;
    schema:description "接続文字列やAPIトークンなど、ユーザー名+パスワードの形をしていないアプリの秘密情報にはDPAPI側の保存が素直とされる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptprotectdata> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dpapi/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/credential-pair/> ;
    schema:description "保存対象がユーザー名+パスワードの組で件数も少ないなら、DPAPIで自分のファイルへ書くよりCredential LockerやCredential Managerの方が素直とされる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/apps/develop/security/credential-locker> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/credential-locker/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/credential-pair/> ;
    schema:description "保存対象がユーザー名+パスワードの組で件数も少ないなら、Credential Lockerが第一候補になる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/apps/develop/security/credential-locker> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/credential-manager-api/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/credential-pair/> ;
    schema:description "Credential ManagerもWin32 APIで資格情報の組を保存・取得する用途に向く"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/wincred/nf-wincred-credwritew> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/credential-locker/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/microsoft-account/> ;
    schema:description "端末間で資格情報をローミングするには、Microsoftアカウントでのサインインが前提になる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/apps/develop/security/credential-locker> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dpapi/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/cross-machine-secret-sharing/> ;
    schema:description "その端末・そのユーザーに結び付けるDPAPIの設計は、複数マシンや複数ユーザーで同じ秘密を共有したい要件とは基本的に相性が悪い。ただしローミングプロファイルの場合は鍵材料もプロファイルと一緒に移動するため、同じユーザーであれば別PCからでも復号でき、この場合は両立する"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.dataprotectionscope?view=windowsdesktop-10.0>, <https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptprotectdata> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/credential-locker/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/cross-machine-secret-sharing/> ;
    schema:description "端末間で資格情報を引き継ぎたい場合は、Credential Lockerのローミングが効く"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/apps/develop/security/credential-locker> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/admin-password-reset/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/dpapi-decryption-failure/> ;
    schema:description "管理者がユーザーのパスワードをリセットすると、DPAPIで保護したデータへアクセスできなくなることがある"@ja ;
    ks:evidence <https://support.microsoft.com/en-us/topic/you-cannot-access-dpapi-data-after-an-administrator-resets-your-password-on-a-windows-server-2012-based-domain-controller-4aa890cd-12b5-fe5c-9e68-06244e70673d> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/profile-recreation/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/dpapi-decryption-failure/> ;
    schema:description "プロファイルが再作成されると新しい鍵材料になるため、以前のDPAPI暗号文は復号できなくなる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptprotectdata> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ciphertext-cross-pc-copy/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/dpapi-decryption-failure/> ;
    schema:description "CurrentUserスコープの暗号文だけを別PCへコピーしても、鍵材料は元のプロファイル側にあるため復号できない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptprotectdata> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/roaming-user-profile/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/dpapi-decryption-failure/> ;
    schema:description "ローミングプロファイルは鍵材料もプロファイルと一緒に移動するため、暗号文だけを別PCへコピーしたことによる復号失敗は起きず、そのユーザーは別PCからでもDPAPIデータを復号できる。ただし管理者によるパスワードのリセットやプロファイルの再作成、サービスの実行アカウント変更が原因の復号失敗までは防げない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptprotectdata> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .
