Mam C# bajt [] zawierający poufne dane. Jaki jest najlepszy sposób, aby to wyczyścić? Jak zapewnić, że coś takiego jak Array.Clear nie zostanie zoptymalizowane?Czyszczenie tablicy C# z wrażliwymi danymi
Odpowiedz
Nie mogę wymyślić żadnej okoliczności, w której połączenie z Array.Clear
zostanie kiedykolwiek zoptymalizowane, a nawet gdyby mogło być zoptymalizowane tylko w przypadkach, w których Twój byte[]
został już wyczyszczony.
Edit: Coś innego do rozważenia byłoby dowiedzieć się, czy SecureString
wdrażanie Ramowej byłaby przydatna w sytuacji:
SecureString
obiekt jest podobny doString
obiektu w tym, że ma tekstu wartość. Jednak wartość obiektu SecureString jest automatycznie szyfrowane, mogą być modyfikowane aż aplikacja oznacza go jako tylko do odczytu, a mogą zostać usunięte z pamięci komputera przez albo aplikacji lub śmieci NET Framework kolektora
Jeśli obawiasz się o Array.Clear, możesz zawsze po prostu Marshal. Kopiuj pustą tablicę bajtów na wrażliwe dane.
Na przykład, jak to (przy założeniu, że „dane” jest bajt [], zawierający informacje poufne)
byte[] clear = new byte[data.Length];
unsafe
{
fixed (byte* ptr = &data[0])
{
Marshal.Copy(clear, 0, new IntPtr(ptr), data.Length);
}
}
że wrażenie, że istnieje już technik, aby przy obecnym stanie RAM. Potem są też faceci z MIT, którzy błyskają trochę pamięci RAM, podnieśli ją i zabrali gdzieś indziej i utrzymali cały stan.
Tak więc, jeśli byłeś paranoikiem, możesz losowo napisać całą masę danych przez tablicę kilka razy.
AFAIK nie ma odpowiednika SecureZeroMemory w CLR. Do przechowywania danych należy użyć SecureString.
Nawet jeśli Array.Clear jest gotowy do wykonania (nie zoptymalizowany), myślę, że nadal możesz mieć problem. GC może przenosić obiekty dookoła sterty i nie ma gwarancji, że ślady oryginalnego bajtu zatrzymają się, jeśli zostały przeniesione z jednej lokalizacji do innej, zanim wywołano Array.Clear.
Może chcesz wypróbować SecureString, ProtectedData lub ProtectedMemory. Ale jeśli chcesz bardziej ręcznego podejścia, myślę, że będziesz musiał przynajmniej przypiąć tablicę bajtów, aby GC nie mógł jej przenieść. Sądzę, że SecureString również używa tej sztuczki.
Sztuczka, która działa z większością kompilatorów języka C, polega na zrobieniu czegoś takiego jak suma wszystkich elementów wyczyszczonej tablicy, a następnie zrobienia czegoś za pomocą tej sumy, np. Wydrukuj ją lub zwróć z wartością zwracaną. W ten sposób eliminacja martwego kodu nie wyeliminuje czyszczenia tablicy.
To powiedziawszy, czy jesteś pewien, że wystarczy wyczyścić tę tablicę? Rozważ wszystkie inne miejsca, w których wartość mogła również istnieć: bufor w formie, przekazywanie obiektów łańcuchowych, kluczowe wartości równoważne w obliczeniach pośrednich lub stronicowane na dysk. Zerowanie tej jednej tablicy powoduje, że dostajesz tylko 1% drogi. Musisz wyczyścić całą ścieżkę klucza.
Jeśli piszesz własną procedurę szyfrowania, moja rada brzmi: nie rób tego. Źle to zrobisz (tak jak ja, tak jak każdy, kto nie jest zabezpieczeniem, ekspert). Użyj dobrze znanej, przetestowanej biblioteki.
(Jeśli nie, nieważne!) :)
W pewnym momencie musisz wywoływać bibliotekę, a będziesz musiał wiedzieć, jak radzić sobie z sekretami, do których przechodzisz, i z biblioteki; w przeciwnym razie nie można utworzyć bezpiecznego oprogramowania. –
@JirkaHanika Uzgodniony. – TrueWill
- 1. czyszczenie tablicy znaków c
- 2. PHP Tworzenie tablicy wielowymiarowej z tablicy z danymi relacyjnymi
- 3. Dzielenie się wrażliwymi treściami Div
- 4. Czyszczenie rozwijanej listy w C#
- 5. C# Manipulowanie danymi JSON
- 6. kopiowanie nad danymi z unii w C
- 7. Napisz surowy plik binarny z danymi tablicy NumPy
- 8. Czyszczenie zawartości pliku tekstowego przy użyciu C#
- 9. Opóźnienie z brakującymi danymi
- 10. Czyszczenie ByteBuffer
- 11. Sortowanie tablic z niepewnymi danymi
- 12. C# usunąć łańcuchy z tablicy
- 13. Wysłanie zdarzenia z danymi
- 14. httplistener z danymi pocztowymi
- 15. Sklep z danymi MixedCollection
- 16. TCompressionStream zainicjować z danymi
- 17. bootstrap angular2 z danymi z wywołania ajax
- 18. Zapisywanie numpy tablica z danymi mieszanych
- 19. Czyszczenie ekranu terminala?
- 20. Czyszczenie responsywnego cyklu jQuery
- 21. czyszczenie zagnieżdżonych płaszczyzn
- 22. Czyszczenie funkcji Clojure
- 23. czyszczenie zmienne $ _POST
- 24. Czyszczenie plików TestResults ReSharper's?
- 25. Czyszczenie multilinii EditText
- 26. Czyszczenie obiektu @RequestScoped?
- 27. Qt - Czyszczenie zawartości QTableView
- 28. Najlepsza metoda tworzenia tablicy podrzędnej z tablicy w C
- 29. Czyszczenie uprawnień specjalnych z folderów w oddziale
- 30. Czyszczenie listy/wektora wskaźników STL
Jeśli nikt nie może jej odczytać tablicę po to został skasowany, a następnie może nie optymalizować przez kompilator nie czyszcząc go? – Gautam
Jako punkt końcowy: kiedy mówisz _kompilator_, masz na myśli kompilator C# lub kompilator JIT? –