Czy to dobra praktyka ustawia parametry połączenia w konfiguracji internetowej?

14

Niedawno mam dyskusję z kilkoma moimi kolegami z mojej pracy, ponieważ powiedzieli, że lepiej jest mieć w .DLL zaszyfrowane połączenie łańcuchowe. I powiedziałem, dlaczego po prostu nie używać szyfrowanego połączenia zdefiniowanego w pliku web.config? to jest to samo i jest lepsze, ponieważ framework encji, na przykład szuka nazwy połączenia w internetowej konfiguracji aplikacji. Teraz chcę wiedzieć z punktu widzenia bezpieczeństwa, co jest lepsze lub jaka jest najlepsza praktyka?

Jorge
źródło
2
Oczywiście możesz po prostu uruchomić aplikację jako użytkownik domeny i zezwolić tylko temu użytkownikowi na dostęp do bazy danych. Następnie potrzebują dostępu do LDAP, aby włamać się do bazy danych.
pdr
@pdr: ciąg połączenia nadal ujawnia pewne informacje, których wolałbyś nie ujawniać, gdyby serwer został naruszony, np. nazwa serwera bazy danych i nazwa bazy danych.
Carson63000,

Odpowiedzi:

18

Nie ma istotnej różnicy, z wyjątkiem tego, że musisz zbudować plik binarny, jeśli chcesz zmienić konfigurację, jeśli umieścisz go w bibliotece DLL, podczas gdy administrator może po prostu zmodyfikować konfigurację za pomocą dobrze zrozumiałych, gotowych narzędzi jeśli jest w konfiguracji. Istnieje już mechanizm szyfrowania ciągów konfiguracji i dodatkowe wytyczne dotyczące MSDN . Obecne wersje Asp.Net mogą mieć alternatywne mechanizmy, więc przeprowadź dodatkowe badania, zanim zdecydujesz się na podejście.

Tylko dlatego, że coś znajduje się w bibliotece DLL, nie czyni go bardziej bezpiecznym. Edytor tekstowy może również otwierać pliki binarne, narzędzia takie jak Reflector mogą zapewnić lepszy interfejs do nawigacji biblioteki DLL .Net; biblioteka DLL nie zapewnia żadnego „dodatkowego” szyfrowania.

JasonTrue
źródło
Test jest binarny, binarny to liczby, jeśli ktoś może odczytać jedynki i zera, twoje bezpieczeństwo fizyczne i programowe zawiodło.
Ramhound,
12

Nie ma znaczenia, gdzie są przechowywane zaszyfrowane dane, ma znaczenie, w jaki sposób są szyfrowane.

Zaszyfrowane sekcje w pliku web.config są zwykle szyfrowane za pomocą interfejsu API Data Protection API , który jest niezwykle trudny do złamania bez narażania całego komputera. Możesz także użyć pojemnika na klucze RSA, który jest podobny (trudny do wyjęcia z komputera).

Myślę, że jeśli chcesz przechowywać zaszyfrowany ciąg w DLL, to w porządku, chociaż nie jest to z natury bezpieczniejsze niż zaszyfrowany plik web.config (każdy może zajrzeć do tej biblioteki DLL za pomocą Reflector ) i jest oczywiście trudniejszy do zmiany (możesz musiałbym ponownie skompilować). Ale znowu, o wiele ważniejsze jest to, jak wygenerowano ten zaszyfrowany ciąg; prawdopodobnie nie używasz tych samych dostawców, co w przypadku zaszyfrowanego pliku web.config, więc czego używasz?

Schemat szyfrowania jest tak silny, jak klucz prywatny lub wspólny sekret. Jeśli ten klucz jest również przechowywany w zestawie, równie dobrze możesz nie mieć żadnego szyfrowania. Jeśli jest przechowywany w jakiejś zewnętrznej bazie danych, powstaje pytanie, w jaki sposób zabezpieczony jest ciąg połączenia tej bazy danych. To naprawdę może prowadzić tylko do ogólnego osłabienia bezpieczeństwa.

Z drugiej strony, jeśli były usługodawca i ciąg połączenia zostały zaszyfrowane za pomocą użytkownika hasła, to byłoby bardziej bezpieczne niż przy użyciu klucza maszynowego statyczne. Z drugiej strony, jeśli używasz haseł użytkownika do szyfrowania, jest mało prawdopodobne, aby kodowałeś zaszyfrowane dane w zestawie, ponieważ trzeba je wygenerować i zapisać w odpowiedzi na działanie użytkownika (nie dewelopera).

Naprawdę nie mogę wymyślić zbyt wielu sytuacji, w których zakodowanie na stałe (zaszyfrowanego) ciągu połączenia w bibliotece DLL jest bardziej bezpieczne niż szyfrowanie odpowiedniej sekcji web.config. W najlepszym razie po prostu dodaje niedogodności, w najgorszym przypadku polega na niezdarnie napisanych niestandardowych zabezpieczeniach wypełnionych dziurami. Zrób sobie przysługę i zrób to, co zaleca Microsoft - po prostu zaszyfruj swój web.config, jeśli są tam wrażliwe dane.

Aaronaught
źródło
2

Najlepszą praktyką dla ASP.NET jest umieszczenie wszystkich konfiguracji / ustawień w pliku web.config lub pliku app.config (dla innych typów projektów).

Informacje na temat szyfrowania i powodu, dla którego należy go używać w ciągach połączeń, muszą być bardzo szczególnym przypadkiem. Ponieważ w większości przypadków nawet do 99% nie trzeba szyfrować parametrów połączenia. Własne aplikacje Microsoft firmy mają parametry połączenia ujawnione w pliku web.config / app.config. Myślę, że nadmiernie komplikujesz bezpieczeństwo.

Jeszcze jedna rzecz, kodowanie ciągów połączeń to zła praktyka. Na przykład nie należy umieszczać żadnego ciągu połączenia (zwanego również ciągiem połączenia) w bibliotece DLL lub .aspx / .ascx / .cshtml lub z tyłu kodu.

William Chang
źródło
1
Nigdy nie powinieneś mieć hasła w postaci zwykłego tekstu w pliku konfiguracyjnym. To, że jest to aplikacja korporacyjna za firewallami, nie oznacza, że ​​jest bezpieczna i możesz zapomnieć o bezpieczeństwie.
Ryan M,