問題タブ [dpapi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
asp.net - ユーザーストアを使用したWebファーム環境でのDPAPI/ProtectedDataの使用
誰かがWebファーム環境のユーザーストアでDPAPIを正常に使用したかどうか疑問に思いましたか?
このアプリケーションは最近1.1から2.0ASP.NETアプリに変換されたため、CryptUnprotect
メソッドを直接呼び出すカスタムラッパーを使用しています。ProtectedData
ただし、これは2.0フレームワークで使用可能な方法と同じである必要があります。
Webファーム環境で運用しているため、暗号化を行ったマシンが復号化するマシンになることを保証することはできません。(また、マシンの障害によって暗号化されたデータが破壊されてはならないため)。
つまり、私たちが持っているのは、各Webボックスの特定のユーザーアカウントの下でサービスで実行されるサービスコンポーネントです。このユーザーは、推奨事項に従って、移動プロファイルを持つように設定されています。
私たちが抱えている問題は、あるマシンで暗号化された情報を別のマシンでは復号化できないことです。これは、win32エラーで失敗します。
「キーは指定された状態での使用には無効です」。
これは、暗号化サービスを複数のマシンでユーザーとして実行しているため、ユーザーが同時に複数のマシンにログインし続けているために、間違いを犯したためだと思います。
これが問題である場合、他のWebファーム環境のユーザーストアでDPAPIをどのように使用していますか?
python - Python で DPAPI を使用していますか?
Windows XP で Python を使用して DPAPI (Data Protection Application Programming Interface) を使用する方法はありますか?
それができるモジュールがあれば、既存のモジュールを使用したいと思います。残念ながら、Google や Stack Overflow で方法を見つけることができませんでした。
編集:「dF」で示されているサンプル コードを取得し、ユーザー モードで DPAPI を使用して暗号化および復号化するために高レベルで簡単に使用できるスタンドアロン ライブラリに微調整しました。暗号化された文字列を返す dpapi.cryptData(text_to_encrypt) を呼び出すか、プレーン テキストを返す逆の decryptData(encrypted_data_string) を呼び出すだけです。ライブラリは次のとおりです。
asp.net - ASP.NET サービス アカウントを使用した DPAPI
データベースに保存する前にデータを暗号化したい。データへのアクセスは、アプリケーションによって制御されます。したがって、管理者の役割を持つ人は誰でもデータを見ることができるはずです。データの暗号化/復号化に使用される暗号化キーを保護できるようにしたいと考えています。サーバーは複数のアプリをホストしているため、DPAPI マシン キーを使用したくありません。
サービス アカウントを作成し、そのアカウントのログオン資格情報を使用して web.config ファイル内のキーを暗号化できるかどうか疑問に思っていました。
ありがとう
c# - DPAPI を使用して暗号化すると、異なる出力が得られるのはなぜですか?
ファイルに保存する必要があるデータを暗号化するために、C++ で DPAPI を使用しています。問題は、C# からそのファイルを読み取る必要があるため、次のことができる必要があるということです。
C++ 暗号化、C++ 復号化 (正常に動作しています)
C# 暗号化、C# 復号化 (正常に動作しています)
C++ 暗号化、C# 復号化、およびその逆 (機能しない)
C# では、DllImport を使用してメソッド CryptProtectData と CryptUnprotectData を pInvoke し、こちらで説明されているように実装しています。C# では ProtectedData クラスに含まれるメソッドを使用できることはわかっていますが、両方のコード (c++ と c#) の外観と動作がほぼ同じであることを確認するために、この方法で ( DllImport を使用して) 実行しています。
奇妙なことに、両方のコードが同じように見えても、たとえば次のテキストの場合、異なる出力が得られます。
「プレーンテキスト」
C ++で私は得る:
01 00 00 00 D0 8C 9D DF 01 15 D1 11 8C 7A 00 C0 4F C2 97 EB 01 00 00 00 2E 6F 88 86 E6 16 9B 4F 9B BF 35 DA 9F C6 EC 12 00 000 00 00 02 0 00 03 66 00 00 A8 00 00 00 10 00 00 00 93 06 68 39 DB 58 FE E9 C4 1F B0 3D 7B 0A B7 48 00 00 00 00 04 80 00 00 A0 00 00 00 10 00 00 4 00 84 5A 5A 34 15 97 DC 5B 1F 6C A4 19 D9 10 00 00 00 F5 33 9F 55 49 94 26 54 2B C8 CB 70 7B FE EC 96 14 00 00 00 C5 23 DA BA C8 23 6C 0B B3 88 69 06 200 AE 9 76 A7 63 E4
そしてC#で私は得る:
01 00 00 00 D0 8C 9D DF 01 15 D1 11 8C 7A 00 C0 4F C2 97 EB 01 00 00 00 2E 6F 88 86 E6 16 9B 4F 9B BF 35 DA 9F C6 EC 12 00 000 00 00 02 0 00 03 66 00 00 A8 00 00 00 10 00 00 00 34 C4 40 CD 91 EC 94 66 E5 E9 23 F7 9E 04 9C 83 00 00 00 00 04 80 00 00 A0 00 00 00 10 00 00 4 00 2E 26 12 5 0A D1 11 1D 4D EF 13 1D B2 6F 10 00 00 00 81 9D 46 37 D1 68 5D 17 B8 23 78 48 18 ED 06 ED 14 00 00 00 E4 45 07 1C 08 55 99 80 A4 3 59 BC303 39 05 C4BB
ご覧のとおり、最初の文字は同じですが、残りは同じではありません。そのため、なぜこれが起こっているのかについて誰かが考えている場合は、助けていただければ幸いです.
ありがとう。
C++ のコード:
C# のコード:
(この Microsoft の例と同じなので、私の C# コードがここでどのように見えるかを確認できます)
.net - 別のシステムに対する認証用のパスワードの保存
これは、「プレーンテキストのユーザーのパスワードを保存しても安全ですか?」という通常の質問ではありません。いいえ、安全ではありません。
外部システムに対して認証を行って何らかの処理を行う必要がある小さなアプリケーションを作成していますが、利用可能な唯一の認証方法はユーザー名とパスワードによるものです。これは人間用であり、変更することはできません。
私のアプリケーションにアクセスできる複数のユーザーがいて、それぞれが個別に認証されていますが、それらはすべて、理想的にはアプリケーションによって透過的に管理される外部システムに対して同じ認証データを「共有」しています。
「愚かな」解決策は、ユーザー名/パスワードをプレーンテキストで保存し、それを認証に使用することですが、明らかにこれは安全ではありません。パスワードは暗号化できますが、誰かがシステムに侵入したらどうなるでしょうか?
考えられる解決策: DPAPI を使用して、パスワード (場合によってはユーザー名も) を透過的に暗号化/復号化します。これは良い考えですか?これは安全ですか?複数のマシンでのセットアップはどうですか (マシン間での暗号化の互換性はありますか)?
追加の提案はありますか?
.net - DPAPIを使用した暗号化キーの保護:明らかな穴?
MSのCryptoAPIを使用するTripleDESなどの対称暗号化アルゴリズムを使用して暗号化された特権情報をディスク上のファイル(.NET構成ファイルを使用しない)に格納するWindows.Formsベースの.NETデスクトップアプリケーションがあります。このファイルは、複数のプログラムの実行/マシンの電源の入れ直しで読み取り/書き込みを行う必要があります。つまり、毎回同じKey/IVを使用します。ここでの明らかな質問は、キー(および場合によってはIV)を保護する方法であり、SOに関するいくつかの質問は、単に「DPAPIを使用する」と言い、ラウンドトリップ暗号化/復号化の簡単な例を示します。
DPAPIの使用方法はすでに知っていますが、別の暗号化スキームに供給されるKey/IVを保護するためにDPAPIを使用することには明らかな問題があるようです。次のコードを検討してください。
SymmetricAlgorithm派生クラスのKeyとIVを割り当てる必要があるため、攻撃者はこのポイントにブレークポイントを設定するだけで、Key / IVが何であるかを簡単に把握できませんでしたか?
私の質問は次のとおりです。
- キーを保護するためにDPAPIを使用するポイントを逃したことがありますか?どうしますか?
- ファイルの暗号化にDPAPIを使用する必要がありますか?したがって、Key/IVストレージは必要ありません。
- 非対称暗号化用のCspParametersの存在に気づきました。これは本質的に対称よりも優れたオプションですか?(私のシナリオのコンテキスト内で、対称対非対称の完全なものではありません)
ありがとう!
.net - DPAPI + エントロピー
ユーザーが暗号化されたコンテンツをダウンロードできる WPF アプリがあり、このコンテンツをオフラインで復号化する機能を提供したいと考えています。キーをダウンロードして DPAPI を使用して保存するという考えですが、エントロピー パラメータに問題があります。
ハードコーディング/保存せずに DPAPI 関数に一貫して使用するエントロピーを生成する方法はありますか?
ありがとうトニー
c# - DPAPI を使用しながらオプションのエントロピーを安全に保存する
そのため、DPAPI を使用して対称キーを保存しようとしています。すべてはうまくいっていますが、エントロピーをどうするのでしょうか? この回答済みの質問は、実際には十分な洞察を提供していません。滑りやすい坂道のように思えます - マシン ストアを使用してエントロピーを保存することもできますが、誰かがそれを行うのを妨げるものは何ですか? 注: ユーザー スコープを使用して現在のキーを保存しています。
だから私の質問は - DPAPI を使用してエントロピーを格納する最良の方法は何ですか?
asp.net - 従来の ASP と ASP.NET の暗号化オプション
新しいページが ASP.NET で、従来のページが Classic ASP である Web サイトに取り組んでいます。Windows 環境での開発は初めてで、.NET などの最新のテクノロジを研究しており、COM オブジェクトに関する従来の問題が発生すると、ヘッドライトの鹿のようになります。
Web サイトのセキュリティは忌まわしいものですが、http: //www.4guysfromrolla.com/articles/021506-1.aspx に従って、DPAPI マシン モードに基づいて web.config ファイルの connectionStrings を簡単に暗号化しました。このアプローチが最も安全ではないことは理解していますが、ASP.NET ページの場合と同様に、何もないよりはましです。ここで、従来の ASP ページで使用される接続文字列に対して同様の暗号化を行う方法について質問します。
複雑な要因は、Web サイトがホストされている場所で、管理者権限やコマンド ライン アクセスさえも持っておらず、FTP だけであるということです。また、鍵の管理は避けたい。
私の調査では、次のことがわかりました。
COM 相互運用機能を備えた DPAPI。これはすでに利用可能になっているようですが、これについて議論しているのは、ホスティング サーバーにインストールされていないCyptoUtility ( http://msdn.microsoft.com/en-us/magazine/cc163884.aspxを参照) だけです。
Dalun Software http://www.dalun.comの Crypto など、他にもサードパーティの COM オブジェクトがたくさんありますが、これらはホストされたサーバーにもありません。管理。
ホストされたサーバーには CAPICOM がありますが、M$ は廃止されており、多くの人が最も使いにくいと報告しています。ASP.NET に DPAPI を使用する場合と同様に、CAPICOM でキー管理を回避できるかどうかは明確ではありません。誰かがたまたま知っているなら、私に手がかりを与えてください。
ASP.NET で Web サービスを記述し、従来の ASP ページでそれを使用して復号化された接続文字列を取得し、それらをアプリケーション変数に格納することができます。localhost を使用でき、インターネット経由で何も送信されないため、SSL を使用する必要はありません。最も単純な形式で、単純な XML ストリームに基づいて、誰かが貧乏人のバージョンと呼んだものを実装することができました。 ASP.NET 用。
いくつかのオプションが不足している可能性があります...推奨事項が要求されています...
wcf - App.config で構成グループ System.ServiceModel を暗号化します。
クライアント アプリをデプロイしており、system.serviceModel 構成グループを暗号化する必要があります。私はこれを行うための最良の方法について、一日の大部分を StackOverflow で検索してきましたが、ほとんどの応答は「app.config の名前を web.config に変更し、ASP.NET utilty で暗号化してデプロイする」または「オーバーライドする」のいずれかでした。セクションを保護するインストール方法」。
ClickOnce を使用しているため、アプリはユーザーごとにインストールされるため、おそらくユーザーごとに DPAPI を使用します。
保護/保護解除セクションを介してセクションを暗号化/暗号化解除する方法は知っていますが、これらを呼び出すのに最適な場所がわかりません。
暗闇でのショット:
インストール時に保護を呼び出し、アプリの起動時に保護を解除し、アプリを閉じるときに保護します。
インストール時に保護を呼び出し、保護解除は自動的に行われます。DPAPI がその魔法を実行する根本的な方法を見つけることができず、理解できないものを信頼していないため、これは私を混乱させます。