Jak przekonwertować SecureString do systemu.Sznurek?

Wszelkie zastrzeżenia dotyczące niezabezpieczenia SecureString poprzez stworzenie systemu.Odciągnij na bok , Jak to zrobić?

Jak mogę przekonwertować zwykły System.Ochrona.Zabezpiecza system.Sznurek?

Jestem pewien, że wielu z Was, którzy są zaznajomieni z SecureString, odpowie, że nigdy nie należy przekształcać SecureString na zwykły ciąg. NET, ponieważ usuwa on wszystkie zabezpieczenia. wiem . Ale teraz mój program robi wszystko z w każdym razie zwykłe ciągi, a ja staram się zwiększyć jego bezpieczeństwo i chociaż zamierzam używać API, które zwraca SecureString do mnie Jestem nie próbuje użyć tego do zwiększenia mojego bezpieczeństwa.

Znam szeryfa.SecureStringToBSTR, ale nie wiem jak wziąć ten BSTR i zrobić System./ Align = "left" /

Dla tych, którzy mogą żądać, aby wiedzieć, dlaczego kiedykolwiek chciałbym to zrobić, cóż, biorę hasło od użytkownika i przesyłając je jako formularz html POST do logowania użytkownika na stronę internetową. Więc... tak naprawdę należy to zrobić z zarządzanymi, niezaszyfrowanymi buforami. Gdybym mógł nawet uzyskać dostęp do niezarządzanego, niezaszyfrowanego bufora, wyobrażam sobie, że mógłbym pisać strumień bajt po bajcie w strumieniu sieciowym i mam nadzieję, że dzięki temu hasło będzie bezpieczne. Liczę na odpowiedź na przynajmniej jeden z tych scenariuszy.

Author: wonea, 0000-00-00

2 answers

Użyj System.Runtime.InteropServices.Marshal klasa:

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

Jeśli chcesz uniknąć tworzenia managed string object, możesz uzyskać dostęp do surowych danych za pomocą 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);
  }
}
 160
Author: Rasmus Faber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-03 09:19:03

Oczywiście wiesz, jak to pokonuje cały cel SecureString, ale i tak powtórzę to.

Jeśli chcesz mieć jeden liner, spróbuj tego: (. NET 4 i wyżej)
string password = new System.Net.NetworkCredential(string.Empty, securePassword).Password;

Gdzie securePassword to SecureString.

 71
Author: Steve In CO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-09 18:53:15