ユーザーから収集する必要がある機密情報の文字列があります。私はこの情報を要求するためにWPF PasswordBox
を使用しています。初期化されていない場合、PasswordBox
コントロールは、オブジェクトではなくSecureString
オブジェクトであるSecurePassword
プロパティを提供します。私のアプリケーション内では、PasswordBox
のデータはSecureString
として暗号化メソッドに渡されます。SecureStringからバイナリデータを正しく出力すると、後で文字列に変換できますか?
私ができる必要があるのは、最初に.Net string
にデータを変換せずに.Net string
の値を表すバイト配列にデータをマーシャルすることです。 !具体的には、
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890`〜@の#$%...のような値を持つ
SecureString
与え^ & *()_- + = {[}] | :;」」<、>。 ?/ ≈篭母
...私はStreamWriter
?
によってで連載され、ストリームに書き込まれての.NET文字列は同等であるバイト配列に変換する方法Marshal.SecureStringToCoTaskMemUnicode(...)
を使用してより伝統的な西洋の文章でこれを行う。しかし、上記のテキスト文字列を追加した典型的でない文字と日本語の文字列を使って作成した場合(最後の太字の文字を参照)、IntPtr
に割り当てられたUnicodeバイト配列を取得する方法が正しく動作しないようですもう
SecureString
のデータを安全に返して、返されたバイトデータが標準の.Net文字列のバイトデータと同じ構造になるようにするにはどうすればよいですか?
NOTE
現時点では、すべてのセキュリティ上の懸念を無視してください。私は自分のアプリケーションへのさまざまなセキュリティのアップグレードを行っています。今のところ、私はSecureString
を使用して機密データを暗号化装置に渡す必要があります。デクリプタ(今のところ)は、このデータをstring
の値に復号化する必要があります。なぜなら、SecureString
のデータを、string
オブジェクトのバイナリ形式に似たシリアル化する必要があるからです。
私はこのアプローチが少し残念であることに同意しますが、私は既存のアプリケーションを段階的に改善する必要があります。最初の段階では、SecureString
オブジェクトのデータをユーザーから暗号化装置にロックしています。あなたはストリーミングするセキュリティで保護された文字列を記述する必要がある場合は
https://codereview.stackexchange.com/a/107864/5297? – stuartd
これは少し疑わしいと思うが、なぜ特定のものをロックしている場合にパスワード情報が必要なのか、ネットワーク共有、フォルダ、データベースなどのようなものへの不正アクセスを防ぐための方法やアプローチがある。あなたは本当にロックダウンしようとしているものを説明します..? – MethodMan
@MethodMan私のメモを参照してください。私たちのアプリケーションは機密情報を収集し、それを安全な鍵で暗号化し、暗号化されたデータを配布し、別のロケールで解読する必要があります。最終的には、2番目のポイントのコードを更新してデータを復号化し、詳細をSecureStringsに保存します。しかし、私が述べたように、私はこれを複数段階のプロセスで行う必要があります。今のところ、暗号化を担当するアプリケーションは、解読された詳細を.Net文字列に簡単に再変換できるような方法でデータを送信する必要があります。 – RLH