問題タブ [securestring]
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.
c# - C# の復号化された値とパブリック クラスのプロパティ...どのようなリスクがありますか?
(これが重複した投稿である場合は、元の投稿を参照するか、何を検索すればよいか教えてください。何も見つかりませんでした。ありがとうございます!)
したがって、暗号化された値がデータベース行に保存されています。データベース行の列値を取得し、それらをクラス インスタンスに格納したいと考えています。クラスで DECRYPTED値のパブリック プロパティを作成しても安全ですか?
外部プロセスは何らかの方法でパブリック プロパティにアクセスできますか? メモリ ハッキングから保護するために、SecureString (またはその他のもの) を使用する必要がありますか? .NET の DataProtection はこの問題に役立ちますか?
これを処理する方法についての実用的なガイド/ウォークスルーはどこかにありますか (コーディングのオーバーヘッドがあまりないことを願っています)。
これらは非常に基本的な質問のように感じます (恥ずかしい)。これらの懸念についての話を聞いたことがありますが、検索しても何も見つかりませんでした。何を検索すればよいかわかりませんでした (この投稿のタイトルにあるもの以外)。
いつものように、どの方向でも大歓迎です。
ありがとうございました!
編集:
回答ありがとうございます。パスワードは悪い例でした-パスワードを解読することは賢明ではなく、通常は不要であることを理解しています。私の質問は、復号化する必要があるデータを処理する方法に関連して、より一般的だと思います。パスワードの代わりに暗号化/復号化された値を参照するように例を更新しました。
一般的な監視プログラムを作成しており、アクセス値、パス、およびコマンドをデータベースに保存する必要があります。インフラストラクチャなどの露出を最小限に抑えるために、これらの値を暗号化するのが最善だと思います.
コンセンサスは、復号化された値を任意の形式、プロパティ、またはその他で保存することは悪い考えであるようです。
暗号化された値のみを保存し、必要なたびに SecureString を使用して復号化することを考えています。
ありがとうございました!
c# - C# で Aes.Key を SecureString に変換する
Aes.Key を secureString に変換するにはどうすればよいですか? byte[] -> string -> securestring を実行しています。私は別の問題に直面しています。キーをバイト[]で文字列に変換し、バイト[]に戻すと、別のバイト[]が得られます。コードの問題は何ですか?
「byteKey1」と「byteKey2」が異なる場合があります。Encoding.Default を使用する場合は同じですが、マシンごとにデフォルトのエンコーディングが異なる場合に問題が発生します。
byte[] の Key を SecureString に変換し、 byte[] に戻すにはどうすればよいですか?
ありがとう。
c# - C# - Process.Start - グローバル変数をパスワードとして使用 - 「'string' から 'System.Security.SecureString' に変換できません」
ログイン フォームを設計し、入力したユーザー名とパスワードを他のフォームで呼び出すことができる変数として保存することを望んでいました (全体的なプログラムは、.exe ファイルと、最初に入力したユーザー名とパスワードとして実行したい powershell スクリプトのコレクションです)ログインフォーム)。
プログラムの開始時に、次のコードを使用して「グローバル変数」を作成しました。
ログインフォームでは、これらのグローバル変数に入力されたユーザー名とパスワードを次のように保存しました。
プロセスを開始したいときは、次のコードを使用して呼び出します (ログインフォームによって保存されたユーザー名とパスワードとして実行するため):
私が得る主なエラーは行にありpasswordGlobalVariable.var,
ます エラーは言う
引数 4: 'string' から 'System.Security.SecureString' に変換できません
「passwordGlobalVariable.var」を安全な文字列に変換したり、別の文字列変数にその内容を与えてから、その変数を安全な文字列としてレンダリングしたりするさまざまな方法を試しました。とうとうアイデアが尽きた。助けてくれてありがとう。
vb.net - アプリケーションで使用する機密データを VB.net に保存するにはどうすればよいですか?
私が遭遇した問題は、特定の情報を安全に保管する方法を見つけようとすることです。私はまだ C とともに .NET を入門言語として学習し、実験しています。したがって、基本的なロジックが不足している場合は、ご容赦ください。
要件
現在、アプリケーション設定内の「設定」ストアを使用して、次のようないくつかの情報を保存しています。
- SQL 接続文字列 (資格情報を含む)
- SMTP サーバーの設定 (資格情報を使用)
- 誰かに見つけてほしくない情報を含む他のさまざまな機密文字列(少なくともかなりの努力なしでは) .
私が「設定」ストアを使用しているのは、率直に言って、中央の 1 つの場所で値を変更し、コード内に反映できる方が簡単だからです。
もちろん、共有クラスを簡単に作成し、それをこれらすべての設定の参照として使用できることは理解しています。
誰かが .NET リフレクターを使用して、このすべての情報を取得できないようにする必要があります。- SmartAssemply を試した後、難読化中に「設定」コンテナが無視されることがすぐに明らかになりました。
今後の方法?
それで私はいくつかの調査を行いましたが、現時点では、主に可能な方法であると考えているものに直面しています. (これは私の限られた経験から来ていることを思い出してください):
- 新しい共有クラスを作成し、SmartAssembly が難読化メソッドを使用して文字列を非表示にします。
- メイン アプリケーションの横 (外部) に配置する INI/XML ファイルを作成します。これは暗号化され、アプリケーションが含まれている設定または文字列を参照する必要があるときに復号化されます。(これについて考えれば考えるほど、欠陥があるように思えますが) .
- 新しい共有クラスを作成し、 SecureStringクラスを試しますか? (PoCをいただければ幸いです)
- あなたのアイデアは?
例
たとえば、次の文字列を非表示にしようとしていたとしましょう。
回答を提供するユーザーが、上記のような文字列を保護する方法と、プログラム内でそれを参照する方法を示す小さな PoC を提案とともに提供していただければ、非常に感謝しています (たとえば、暗号化に傾倒している場合)。 )。
c# - 復号化後にメモリ内のデータの暗号化されていないコピーを回避するにはどうすればよいですか?
データのチャンクの暗号化/復号化を可能にするいくつかの関数を作成しようとしています。互換性の理由から、あるマシンに保存して別のマシンに読み戻すことができる対称暗号化である必要があります。これにより、ローカル マシンよりも範囲が広くならないため、ProtectedData の使用が除外されます。(残念ながら、そのオプションを追加するだけで、多くの手間が省けました。)
私は多くのWeb検索を行ってきましたが、これまでのところ、ディスク上の暗号化された値からメモリ内のSecureStringへのトレースなしでのクリーンな移行を実際に試みている良い例に出くわしていません. どのように(もし?)それができるかを本当に知りたいです。
かなりうまく機能しているように見える暗号化機能があります。SecureString を渡すと、SecureString の内容の暗号化されたコピーを含む通常の文字列が返されます。関数を呼び出した後にメモリ ダンプを保存すると、暗号化されていないデータのコピーがダンプのどこにも見つかりません。これはいい。
ただし、Decrypt のカウンターパートではあまり運がありません。データを正常に復号化して SecureString に戻すことはできますが、復号化が完了するまでにメモリ ダンプに復号化された値の複数のコピーが残ることになります。もちろん、コピーが平文で散らばっていると、メモリ内暗号化を使用する意味がすべて無効になります。これは悪いです。
完了後に暗号化されていない値のコピーがメモリに残らないように、このコードを「クリーン」にする方法について誰か提案できますか?
これが私のコードです:
コードをトレースしてメモリ ダンプを作成し (デバッグ | 名前を付けてダンプを保存...)、結果のファイルで暗号化されていない値を検索すると、cs.FlushFinalBlock() ステートメントまで完全に消去されます。それが実行されるとすぐに、暗号化されていない値の 3 つのコピーがダンプ ファイルに作成されます。
それらの1つはメモリストリームバッファ自体であると推測しています。これは Seek と WriteByte ループで排除できます。後で、decodedBytes 配列と decodedChars 配列を使用してさらにいくつかのコピーが表示されますが、これらも、それらを null にするループで消えます。それでも、フラッシュによって作成された 2 つのコピーが残ります。
私は、ここの記憶にいつでもコピーが存在しないことを狙っているわけではありません。(理想的ではありますが)大量のコードを書かないと不可能だと思います。私の目標は、攻撃面を最小限に抑えるために、関数が終了した後にトレースがメモリに残らないようにすることです。
完全を期すために、暗号化機能も含めることもできます。私が言ったように、これはそのままでうまくいくようです。それが終わったとき、私は残骸を見つけません。
私がまだあまり探求していないもう 1 つのことは、ガベージ コレクターがこれらすべての途中で実行された場合に何が起こるかということです。これらの機能は、途中で発生する可能性を減らしますか?
ありがとう。
c# - 安全なコンテキストで安全でないコードを使用するには?
私SecureString
はマイクロソフトのクラスに使用する必要があり、インターネットで次のコードを見つけました:
唯一の問題は、unsafe
キーワードがCannot use unsafe construct in safe context
. 残念ながら、私はなぜこれが起こっているのかを見つけることができませんでした...
注: 上記のコードは LINQPad で実行されますが、VS2013 (resharper を使用) では実行されません。
c# - Bouncy Castle は、メモリ/ページファイルの「漏洩」やその他の攻撃手段から秘密を保護しますか?
この質問に基づいて、Bouncy Castle のシークレットを扱う際に次の問題が懸念されます。
- 暗号化 (メモリ ダンプまたはページ キャッシュの場合)
- メモリにピン留めする
- 読み取り専用としてマークする機能 (それ以上の変更を防ぐため)
- 定数文字列を渡すことを許可しないことによる安全な構築
- コンパイラの最適化 (リンクされた記事re: ZeroMemory マクロの注を参照)、ただし、.NET および GIT からのビルドに適用されるため
質問
- Bouncy Castle は、.NET で必要な構造を使用して安全に構築できるようにしていますか? (SecureString または同等の直接操作)
- ライブラリ内の必要な場所全体で、SecureString (または同等の) のカバレッジが持続しますか?
- コンパイラの最適化が有効にならないようにするには、Bouncy Castle を特定の方法でコンパイルする必要がありますか?