2009-07-16 14 views
8

Mam program, w którym hasło do bazy danych jest ustawione przez użytkownika zdalnego. Program zapisuje nazwę użytkownika i hasło do zaszyfrowanego ciągu w pliku xml, który w innym przypadku powinien być czytelny dla człowieka. Teraz to działa dobrze, używam szyfrowania C# DES z kluczem, a to się zaszyfrowane i odszyfrowane. Problem polega na tym, że każdy może użyć reflektora, aby zobaczyć klucz. Nawet z zaciemnieniem klucz powinien być wyraźnie widoczny. Jak sobie z tym poradzić? Teraz nie potrzebuję tego, aby NSA była bezpieczna, ale naprawdę chciałabym uniemożliwić podglądanie. Dzięki.Szyfrowanie C# w wieku odbłyśnika

EDYCJA: Dzięki za wszystkie porady jak dotąd, informacje na ten temat nie są zbyt rozpowszechnione, a ja naprawdę doceniam ogólne wskazówki, a także konkretne odpowiedzi.

+1

Zadajesz pytanie ochronne. Zidentyfikowałeś _vulnerable resource_ - bazę danych. Zidentyfikowali Państwo vvulnerability_ - brak skutecznego szyfrowania pliku haseł. Nie zidentyfikowałeś "zagrożenia". Odnalezienie złagodzenia wrażliwości bez uprzedniego zidentyfikowania zagrożenia jest niebezpiecznie szkodliwe! Kto zagraża Twojemu zasobowi i jak? –

+0

Cóż, nikt konkretnie nie chciałbym, aby moja aplikacja była bezpieczna i nie ma najlepszych praktyk. – Steve

+2

Najlepszą praktyką nr 1 w zakresie kodowania bezpiecznych aplikacji jest IDENTYFIKACJA ZAGROŻEŃ. Nie możesz być bezpieczny, jeśli nie wiesz nawet, na jakie zagrożenia zabezpieczasz kod. Chodzi mi o to, przypuśćmy, że poprosiłem cię o zaprojektowanie bezpiecznego domu.Najprawdopodobniej zaczniesz od sporządzenia listy zagrożeń dla mieszkańców domu jako pierwszego kroku, prawda? –

Odpowiedz

8

Spróbuj użyć DPAPI (klasa System.Security.ProtectedData). Chroni to zaszyfrowane dane przy użyciu poświadczeń użytkownika lub komputera. Dlatego tylko konto użytkownika, które uzyskuje dostęp do danych (poświadczenia użytkownika) lub użytkownik, który może zalogować się na komputerze (poświadczenia komputera), będzie mogło odszyfrować dane.

+0

To podejście sprawdza się dobrze w programach po stronie serwera, ale nie skaluje się dobrze po stronie klienta. –

+0

@Scott można wyjaśnić –

+2

Działa to szczególnie dobrze dla kodu po stronie klienta. Trudniej jest korzystać z DPAPI w aplikacjach po stronie serwera (podszywanie się, dostęp do kont usługi w profilach itp.). Na kliencie użytkownik określa hasło przy pierwszym uruchomieniu aplikacji, która jest zaszyfrowana kluczem DPAPI. Zaszyfrowane dane są przechowywane w systemie, więc tylko oni (lub administrator) mogą odszyfrować te dane. Gdy użytkownik ponownie uruchomi aplikację, DPAPI używa ich kluczy do odszyfrowania hasła. Otrzymujesz korzyść polegającą na tym, że nie przechowujesz wspólnego klucza szyfrującego w zespole, w którym łatwo można go złamać. –

5

To nie jest problem z relectorem, czy nie. Chodzi o kluczowe zarządzanie. DES i każdy inny system szyfrowania polega na regularnej zmianie kluczy. Trudne kodowanie klucza w kodzie oczywiście narusza to. Aby obejść ten problem, należy zajrzeć do zarządzania kluczami.

EDYCJA: Aby opracować nieco: W zależności od konfiguracji, można przechowywać zaszyfrowane hasła w systemie plików i polegać na systemie plików/bezpieczeństwie użytkownika lub w bazie danych i polegać na prawach do bazy danych.

+4

Czy mógłbyś bardziej szczegółowo opisać, w jaki sposób poradzić sobie z tym? – Steve

+0

Prosimy o komentarz podczas głosowania w dół. Dzięki. –

2

Niestety, nigdy nie ma 100% bezpiecznego sposobu robienia tego. Możesz zaciemnić kod, użyć niezarządzanego kodu do tajnych obszarów, ale ponieważ twoja aplikacja może ponownie odczytać hasło, tak samo jak każdy atakujący, który włoży w to wystarczająco dużo wysiłku.

1

Nie należy przechowywać hasła w ogóle zaszyfrowanego. Powinieneś przechowywać go w postaci zaszyfrowanej za pomocą jednokierunkowej funkcji skrótu. Zobacz:

http://www.codinghorror.com/blog/archives/000953.html

+1

Nie pomaga w sytuacji PO, gdy potrzebuje hasła, aby uzyskać dostęp do zasobu zewnętrznego (bazy danych). – Joe

+1

A jak dokładnie przedstawiałbyś * hash * w ciągu połączenia? –

1

Mieliśmy podobną sytuację. Skończyło się na włożeniu klucza do pliku i wprowadzeniu przez użytkownika pewnego hasła (lub klucza za pomocą skrótu), aby móc odczytać plik. Ból spowodował, że użytkownik wprowadził więcej informacji, ale usunął klucz z programu.

4

Nie powinieneś szyfrować swojego hasła za pomocą sekretu osadzonego w aplikacji, to jest źródłem twoich problemów. Bez względu na to, jak silne jest twoje szyfrowanie, klucz jest wyraźnie widoczny w twoim kodzie.

Powinieneś zapytać użytkownika o dane uwierzytelniające, zapisać użytkownika/nazwę użytkownika db w zwykłej sekcji konfiguracji w pliku app.config i polegać na klasie DPAPI z zabezpieczeniem DpapiProtectedConfigurationProvider, aby zaszyfrować i odszyfrować tę sekcję za pomocą klucze komputera lub klucz użytkownika. Zobacz podany link pełnego przykładu, jak to zrobić.