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.
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);
}
}
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.
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