Zewnętrzne, zaszyfrowane hasło

0

Mam nadzieję, że to dobry dział. Inny mi nie pasował :)

Mam program, w którym za pomocą kodu: http://stackoverflow.com/questions/10168240/encrypting-decrypting-a-string-in-c-sharp/10168287 szyfruję pewne dane. W kodzie znajduje się hasło do deszyfracji, ponieważ dla każdego użytkownika ma być takie samo (tak ma być, bo później następują kolejne właściwe już deszyfracje).

Bardzo zależy mi na tym, żeby osoba, która ma kod źródłowy nie mogła tych danych zdeszyfrować.

Jak mogę inaczej zamieścić tam to hasło? Jakoś przez serwer / dodatkowy zaszyfrowany plik?

Chodzi mi o to, żeby ktoś, kto ma dostęp do kodu i tak nie mógł tego hasła odgadnąć (zdeszyfrować tych danych).

Starałem się jasno wyjaśnić o co mi chodzi. Jakby co, spróbuję inaczej wytłumaczyć.

1

jezeli jest zapisane haslo w kodzie, to ten ktos zawsze bedzie mogl je odczytac.
Mozesz uzyc obfuscatora, mozesz robic cuda na kiju, ale dopoki haslo jest wpisane w kod zrodlowy to sie nie da nic zrobic

Jedynie co by mozna zrobic to wysylac zapytanie do serwera i on by zwracal czy uzytkonik (i jaki) sie zalogowal z odpowiednim tokenem

0

właśnie o coś takiego mi chodzi, żeby nie trzymać hasła w kodzie, tylko gdzieś zewnętrznie je pobrać, tak, żeby nie dało się go przy tym odczytać (czyli np. nie przez jakiś link do pliku txt z serwera). można jakoś to zrobić?

1

W skrócie: nie ma takiej możliwości. Użytkownik z dostępem do twojej aplikacji może zrobić dokładnie tyle samo co ona.

1

Nie jest możliwe osiągnięcie tego co chcesz. Bo jeśli dobrze wywnioskowałem z Twojego opisu:

  1. Hasło ma być takie samo dla wszystkich użytkowników.
  2. Chcesz by osoba mająca dostęp do źródła nie mogła odszyfrować danych.

Niestety oba te punkty się wykluczają. Zwłaszcza pierwszy jest dziwny. Moim pytaniem jest co dokładnie chcesz osiągnąć, bo możliwe, że robisz to okrężną drogą.

0

Właśnie o taką odpowiedź mi chodziło.

Jest mi to potrzebne, ponieważ w programie przetwarzam loginy i hasła do kont pocztowych. Są one zaszyfrowane. Chcę teraz, żeby program mógł je rozszyfrować, a użytkownik, który ma dostęp do kodu źródłowego nie mógł tego zrobić. Macie jakieś pomysły? Wszystko biorę pod uwagę.

0

To są loginy i hasła podawane przez użytkownika? Jeśli tak, to odpowiedź jest kretyńsko prosta: nie rób tego (http://www.catb.org/~esr/fetchmail/design-notes.html).

0

@Damianos.MP5 ale majac jedno haslo dla wszystkich, to zebys trzymal hash w kodzie (bo musisz miec na podstawie jakies porownanie to osoba ktora ma ten kod. Zobaczy jaki to hash (jezeli rozpozna metode hashu) i moze bruteforcem brac hasla i sprawdzac po kolei. Juz jest trudniej dla takiej osoby, ale to jest nadal jedne haslo. Jezeli jest warto, to ktos poswieci ta chwile by miec haslo dla wszystkich uzytkownikow

druga opcja jest by haslo i nazwa uzytkownika zostala wpisywana przez kogos, to nastepnie jest wysylane do serwera ktory sprawdza autentykacje i zwraca Ci token, ktory jest wazny powiedzmy 30 min czy tam 60 min i z tym tokenem mozesz robic zapytania do jakiegos serwera.

Wiec musisz sprawic by nie bylo w Twojej aplikacji logiki, jezeli bedzie logika. To nie mozesz zrobic tak, by to bylo super bezpieczne

0

Trochę nie o to mi chodziło.

Zobaczcie na fragment kodu:

var json = new JavaScriptSerializer().Serialize(task);
HashCode hashCode = new HashCode();
EncryptAndDecrypt encryption = new EncryptAndDecrypt();
hashCode.HashCodeForDownload = encryption.Encrypt(json, "haslo_pobierania");
hashCode.HashCodeForEdit = encryption.Encrypt(json, "haslo_edycji");
hashCode.WholeHashCode = encryption.Encrypt(hashCode.HashCodeForDownload + sep + hashCode.HashCodeForEdit, "ogolne_haslo");

Serializuję sobie obiekt klasy Task. Mam w nim różne dane, m.in. loginy i hasła do kont pocztowych. Najpierw szyfruję je na jedno hasło (hasło pobierania). Później szyfruję je na drugie hasło - hasło edycji. Później oddzielam separatorem dwa zaszyfrowane stringi i szyfruję jeszcze raz, na jakieś ogólne hasło.

Dlaczego tak robię. Muszę mieć tylko jeden zaszyfrowany ciąg znaków, który będzie dostępny na dwa hasła. Nie da się czegoś takiego zrobić, bo byłaby to luka w metodach szyfrujących. Dlatego szyfruję je na pierwsze hasło i drugie i potem łączę to w jedną całość.

Jest mi to potrzebne, ponieważ pierwszy zaszyfrowany string przetwarzam w programie w zupełnie innych miejscach niż ten drugi.

Hasło edycji zna tylko jedna osoba. Hasło pobierania zna wiele użytkowników. Załóżmy, że jestem jednym z nich. W programie nie mam dostępu do żadnych loginów i haseł do kont pocztowych, ale mając zaszyfrowany string i hasło pobierania mogę pobrać plik. Więc string zaszyfrowany na hasło pobierania musi zawierać dane do kont pocztowych, mimo, że bezpośrednio w programie nie da się ich odczytać.

I teraz ktoś, kto zna kod może sobie mając hasło pobierania i zaszyfrowany na nie string odczytać (choć nie da się tego zrobić w programie). I tu mam pytanie jak się przed tym zabezpieczyć.

Powinien być jakiś sprytny sposób, ale nie mogę na niego wpaść i dlatego proszę o pomoc. Mam nadzieję, że w miarę jasno napisałem o co mi chodzi.

0

Dalej nie ograniam, czemu robisz to jednym "kontem" zamiast 2 osobnych. Masz osobne "konto" "tylko do odczytu" i osobne do edycji. Opisz dokładnie co chcesz uzyskać bo strasznie zagmatwane jest to co napisałeś.

Bo tutaj widzę ewidentnie, że potrzebujesz jakiejś formy autoryzacji. Możliwe, że może być to LDAP albo jakaś konstrukcja asymetryczna lub współdzielenia sekretu.

0

Ale w programie nie ma żadnych kont, na które użytkownik miałby się zalogować, żeby móc z programu korzystać. Pisząc o kontach mam na myśli tylko konta pocztowe. Wygląda to tak:

Odpalam program i wybieram w nim tzw. kreator wysyłania. Tam wczytuję plik, który chcę wysłać i wczytuję konta pocztowe, na które plik będzie wysłany. Dodatkowo wypełniam inne pola, ale to nie jest już istotne. W tym kreatorze także wpisuję hasło pobierania i hasło edycji.

Po zatwierdzeniu, plik wysyła mi się na wczytane konta pocztowe. Po zakończeniu wysyłania zostaje wygenerowany zaszyfrowany tekst, który opisałem powyżej:

Serializuję sobie obiekt klasy Task. Mam w nim różne dane, m.in. loginy i hasła do kont pocztowych. Najpierw szyfruję je na jedno hasło (hasło pobierania). Później szyfruję je na drugie hasło - hasło edycji. Później oddzielam separatorem dwa zaszyfrowane stringi i szyfruję jeszcze raz, na jakieś ogólne hasło.

Dlaczego tak robię. Muszę mieć tylko jeden zaszyfrowany ciąg znaków, który będzie dostępny na dwa hasła. Nie da się czegoś takiego zrobić, bo byłaby to luka w metodach szyfrujących. Dlatego szyfruję je na pierwsze hasło i drugie i potem łączę to w jedną całość.

Jest mi to potrzebne, ponieważ pierwszy zaszyfrowany string przetwarzam w programie w zupełnie innych miejscach niż ten drugi.

Ten zaszyfrowany tekst wysyłam innemu użytkownikowi. Podaję mu też hasło do pobrania. Hasło do edycji znam tylko ja.

I teraz gość, któremu wysłałem zaszyfrowany tekst i hasło pobierania może sobie ten plik pobrać, wystarczy, że wpisze te dane w odpowiednie miejsce w programie.

W innym miejscu ja, jako osoba, która wysłała plik, mogę zarządzać loginami i hasłami do kont, które są zaszyfrowane w tym tekście, ale muszę podać hasło edycji. Osoba, która ma tylko hasło pobierania nie ma w programie dostępu do loginów i haseł.

Ale ktoś, kto widzi kod źródłowy, może sobie loginy i hasła uzyskać, choć zna tylko hasło pobierania, a nie zna hasła edycji. A to dlatego, że w tekście zaszyfrowanym na hasło pobierania muszą być zapisane loginy i hasła do kont pocztowych, bo muszę się na nie przecież zalogować, żeby pobrać z nich plik.

0

Odczytanie === edycja, więc źle ci się wydaje.

Ale można zakodować i innym kluczem odkodować, ale tym samym nie zakodujesz co odkodujesz i to jedyna sprawdzona metoda.

0

Napisz coś więcej na ten temat, ok?

0

.

0

Dzięki za odp, ale w czym taki unikalny klucz miałby mi pomóc?

Cały czas zastanawiam się, czy dałoby radę nie zmieniając struktury zaszyfrowanego tekstu (czyli żeby pozostały tam loginy), jakoś z zewnątrz bezpiecznie wczytać tylko to "hasło_ogóle", które służy mi do połączenie dwóch innych zaszyfrowanych na dwa hasła (pobierania i edycji) tekstów.

0

Chodzi ci o taką strukturę,

klucz szyfruje wszystkie loginy i hasła, które i tak są zaszyfrowane.

Po odszyfrowaniu kluczem, wszystko jest zaszyfrowane, dla każdego loginu i hasła jest następne szyfrowanie(1 - główne hasło + x - ilość użytkowników, tyle szyfrów w szyfsze)

ps. po co trzymasz loginy i hasła czyichś maili, skoro to mocno narusza bezpieczeństwo i prywatność osób trzecich?
Najlepiej, niech trzymają hasła wyłącznie do twojego serwera, który będzie sprawował większą kontrolę.

0

Popatrz moze na coś takiego https://github.com/secretin/secretin-lib#details ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1