1. ホーム
  2. c#

[解決済み] SecureStringをSystem.Stringに変換する方法は?

2022-04-20 14:29:09

質問

SecureStringからSystem.Stringを作成することによるセキュリティの確保解除に関するすべての注意事項 さておき どうすればいいのでしょうか?

通常の System.Security.SecureString を System.String に変換するにはどうすればよいですか?

SecureStringをご存知の方の多くは、SecureStringを通常の.NET文字列に変換してはいけないとお答えになることでしょう。 知っている . しかし、今、私のプログラムはすべて普通の文字列を使っていますが、私はそのセキュリティを強化しようとしており、SecureStringを私に返すAPIを使おうとしています。 ではない を使用してセキュリティを向上させようとしています。

Marshal.SecureStringToBSTR は知っていますが、その BSTR を取って System.String にする方法が分かりません。

なぜこんなことをしたいかというと、私はユーザーからパスワードを受け取り、それをhtmlフォームのPOSTとして送信し、ユーザーをWebサイトにログインさせるためなのです。 だから...これは本当に管理された暗号化されていないバッファで行う必要があります。 もし、管理されていない暗号化されていないバッファにアクセスすることができれば、ネットワークストリームにバイト単位のストリーム書き込みを行うことができ、それによってパスワードの安全性を保つことができると想像しています。 これらのシナリオの少なくとも1つに対する答えを期待しています。

どのように解決するのか?

を使用します。 System.Runtime.InteropServices.Marshal クラスとなります。

String SecureStringToString(SecureString value) {
  IntPtr valuePtr = IntPtr.Zero;
  try {
    valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
    return Marshal.PtrToStringUni(valuePtr);
  } finally {
    Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
  }
}

管理された文字列オブジェクトの作成を避けたい場合は、生データにアクセスするために Marshal.ReadInt16(IntPtr, Int32) :

void HandleSecureString(SecureString value) {
  IntPtr valuePtr = IntPtr.Zero;
  try {
    valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
    for (int i=0; i < value.Length; i++) {
      short unicodeChar = Marshal.ReadInt16(valuePtr, i*2);
      // handle unicodeChar
    }
  } finally {
    Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
  }
}