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?
14
Odpowiedzi:
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.
źródło
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.
źródło
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.
źródło