2009-01-14 18 views
17

Myślałem o zrobieniu małego narzędzia. Nie jest ważne, co zrobi to narzędzie. Ważne jest to, że narzędzie będzie musiało przechowywać poufne informacje na dysku twardym użytkownika. EDYCJA: Informacje, które będą przechowywane, są INFORMACJAMI UŻYTKOWNIKA - Nie próbuję chronić własnych treści, które rozpowszechniam za pomocą aplikacji.Czy istnieje jakiś rodzaj bezpiecznego magazynu lokalnego w systemie Windows?

Rozumiem, że muszę zaszyfrować te informacje. Ale gdzie mogę bezpiecznie przechowywać hasło szyfrujące? To coś w rodzaju nieskończonej rekursji ...

Czy istnieje sposób szyfrowania informacji w oknach i bezpiecznego zarządzania hasłami w oknach? Kiedy mówię Windows mam na myśli Windows XP SP2 lub nowszy.

Należy również zauważyć, że użytkownicy w tym samym systemie nie mogą mieć dostępu do informacji o innych użytkownikach (nawet wtedy, gdy oboje prowadzą moją aplikację).

Szukam obu rozwiązań - .NET 2.0 (C#) i natywnych (C/C++) dla tego problemu.

Odpowiedz

20

Czy istnieje sposób szyfrowania informacji w oknach, a okna bezpiecznie zarządzają hasłami?

CryptProtectData: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.85).aspx

Korzystanie z .NET: http://msdn.microsoft.com/en-us/library/aa302402.aspx

Historycznie, Protected Storage (dostępne w XP, tylko do odczytu w Vista +): http://msdn.microsoft.com/en-us/library/bb432403%28VS.85%29.aspx

+3

Dla .NET 2.0+ użyj klasy System.Security.Cryptography.ProtectedData zamiast drugiego łącza @ bobince. – devstuff

3

Można użyć natywnego mechanizmu szyfrowania. Ustaw atrybut szyfrowania w swoim folderze lub pliku (na stronie właściwości kliknij przycisk "Zaawansowane"). Następnie możesz ustawić użytkowników, którzy mogą uzyskać dostęp do pliku (domyślnie obejmuje to tylko twórcę plików). Dużą zaletą tego rozwiązania jest to, że jest całkowicie przezroczysty z punktu widzenia aplikacji i użytkowników.

Aby to zrobić programowo: za pomocą Win32 API, wywołaj EncryptFile() w katalogu, w którym chcesz przechowywać wrażliwe dane użytkownika. Odtąd wszystkie nowo utworzone pliki w tym katalogu będą zaszyfrowane i możliwe do odczytania tylko przez ich twórcę (który byłby bieżącym użytkownikiem Twojej aplikacji). Alternatywnie możesz użyć flagi FILE_ATTRIBUTE_ENCRYPTED dla pojedynczych plików w czasie tworzenia. Możesz sprawdzić informacje o szyfrowaniu z eksploratora na stronie właściwości pliku i zobaczyć, że pliki tworzone przez aplikację są poprawnie zaszyfrowane i ograniczone do odpowiednich użytkowników. Nie ma hasła do przechowywania ani używania, wszystko jest przejrzyste.

Jeśli chcesz ukryć dane od wszystkich użytkowników, możesz utworzyć specjalnego użytkownika aplikacji i podszyć się pod niego za pomocą aplikacji. To, wraz z listami ACL, jest błogosławioną techniką Windows dla usług systemowych.

+0

Czy mogę ustawić z kodu? Podobnie jak z .NET C# lub natywną aplikacją C++? – Paulius

+0

To nie pomaga przy dystrybucji kodu/narzędzia innym osobom ... – xan

+0

Cóż, informacje muszą być najpierw wprowadzone przez użytkownika, a następnie moja aplikacja musi go bezpiecznie zapisać. Tak więc, jeśli mogę utworzyć taki plik z poziomu mojej aplikacji - może to działać. – Paulius

2

Być może zechcesz spojrzeć na przestrzeń izolowaną, która jest sposobem automatycznego zapisywania ustawień i innych danych w danych aplikacji. Zobacz example i MSDN.

Jest to alternatywa do przechowywania normalnych ustawień w rejestrze, lepsza w wielu przypadkach ... Nie jestem pewien, jak dane są przechowywane w pliku, jednak musisz sprawdzić, czy nie nie chcesz, aby był dostępny, a nawet szyfrowany, dla innych użytkowników. Z pamięci tylko aplikacja. który utworzył magazyn, może go otworzyć - ale to wymaga sprawdzenia.

Edit:

Z pamięci, kiedy ostatnio używanego tym dobrym podejściem jest napisanie klasy „Ustawienia”, który obsługuje wszystkie ustawienia itd w swojej aplikacji. Ta klasa ma odpowiedniki metod Serialize i DeSerialize, które pozwalają zapisywać wszystkie swoje dane do pliku IsolatedStorage lub ładować je z powrotem.

Dodatkową zaletą implementacji w ten sposób jest możliwość użycia atrybutów do zaznaczania bitów źródła, a następnie można użyć siatki właściwości, aby szybko umożliwić użytkownikowi edycję ustawień (siatka właściwości manipuluje właściwościami klasy na poziomie środowisko wykonawcze za pomocą refleksji).

+0

Czytam teraz dokumenty. To wygląda obiecująco ... – Paulius

+4

Od MSDN: "Nie używaj izolowanego magazynu do przechowywania poufnych informacji o wysokiej wartości, takich jak niezaszyfrowane klucze lub hasła, ponieważ pojedyncze miejsce do przechowywania nie jest chronione przed wysoce zaufanym kodem, niezarządzanym kodem lub zaufanymi użytkownikami komputer." – Casebash

+0

@Casebash Dzięki za aktualizację. – xan

-5

Erm hash the password? Nie musisz przechowywać prawdziwej oferty w dowolnym miejscu na maszynie, tylko zahasowane hasło (prawdopodobnie również solone). Następnie, gdy użytkownik wprowadzi swoje hasło, wykonasz na nim tę samą operację i porównasz ją z hashem zapisanym na dysku.

+0

Właśnie o to chodzi - nie chcę nawet pytać użytkownika o hasło. Celem mojej aplikacji jest to, że jeśli użytkownik jest już zalogowany do systemu Windows - to on jest tym, za kogo się podaje.Więc to by nie działało dla mnie. – Paulius

+0

Jeśli użytkownik jest już zalogowany, dlaczego w ogóle nie chcesz używać hasła? – liggett78

+0

Ponieważ informacje, które będą przechowywane w pliku zewnętrznym (lub czymś podobnym), nie mogą być dostępne od innego użytkownika (jeśli ktoś inny loguje się na swoje własne konto systemu Windows). – Paulius

0

Polecam przyjrzeć się blokowi aplikacji do kryptografii biblioteki korporacyjnej. Sprawdź to blog post. System Windows ma wbudowany interfejs Data Protection API do szyfrowania danych, ale blok aplikacji Crypto czyni go prostszym.

-4

Hm, co masz próba osiągnięcia jest dokładnie tym, co DRM próbowała osiągnąć. Zaszyfruj coś, a następnie podaj użytkownikowi klucze (jednak zaciemnione) i krypto. Zrobili to z DVD. Zrobili to z Blu-Ray. Zrobili to z iTunes.

To, co proponujesz, nigdy nie będzie bezpieczne. Twój przeciętny świecki człowiek prawdopodobnie nie zrozumie tego, ale każdy wystarczająco zmotywowany atakujący rozwiąże ten problem i odkryje klucze, algorytm i odszyfrowanie danych.

Jeśli wszystko, co robisz, to szyfrowanie danych użytkownika, zapytaj użytkownika o hasło. Jeśli próbujesz chronić swoje wewnętrzne dane przed użytkownikiem aplikacji, jesteś S.O.L.

+0

Co to jest S.O.L.? W każdym razie nie próbuję osiągnąć tego samego, co DRM. Nie próbuję szyfrować MOICH plików, które później rozprowadzałem z aplikacją - potrzebuję sposobu na zaszyfrowanie informacji USER, że HE/SHE wejdzie do mojej aplikacji (informacje muszą być przechowywane do późniejszego wykorzystania z poziomu aplikacja). – Paulius

+0

S.O.L. = "S ** t Out Luck" –

3

Należy rozważyć użycie DPAPI do tego celu. Zaszyfruje dane za pomocą specjalnego (wewnętrznego) klucza symetrycznego, który jest dla każdego użytkownika. W tym przypadku nie trzeba nawet pytać o hasła, ponieważ różni użytkownicy w systemie będą mieli przypisane różne klawisze.

Wadą tego może być to, że nie można odzyskać danych, jeśli użytkownik zostanie usunięty/Windows ponownie zainstalowany (uważam, że tak jest, nie do końca pewne). W takim przypadku zaszyfruj dane kluczem "wygenerowanym samodzielnie" uzyskanym z hasła i przechowuj hasło w rejestrze/pliku zaszyfrowanym przy użyciu DPAPI.

+0

Link do dokumentów dla .NET 2.0 i nowszych: http://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata.aspx – liggett78

+0

Cóż, podczas gdy dane są poufne, mogę bezpiecznie założyć, że użytkownik może ponownie wprowadzić dane w przypadku ponownej instalacji systemu Windows. W końcu właśnie w ten sposób otrzymuję dane - użytkownik wchodzi na niego, a potem moja aplikacja automatycznie je zapamiętuje. – Paulius

Powiązane problemy