Skocz do zawartości

Szyfrowanie PHP - > C# - > PHP


Rekomendowane odpowiedzi

Sprawa jest taka, że muszę przesyłać bardzo delikatne dane w PHP metodą POST które odbiera program w C#.

Api wymaga secret_keya, ale dla bezpieczeństwa chciałbym te dane dodatkowo szyfrować. Co polecacie, aby dane były bezpieczne(szyfrowanie nie będzie częste, więc nie musi być mega szybkie, choć bez przesady) i aby dana metoda/biblioteka działała i w C#(w Mono) i w PHP?

Odszyfrowanie danych powinno być na ile to możliwe nie wykonalne. Nie zakładam ataku ze strony pentagonu, ale nie łudźmy się też, że wyciekami zajmują się absolutni nowicjusze, więc zależy mi na sile szyfrowania. Podkreślam, że chodzi o szyfrowanie, a nie hashowanie, ponieważ dane w programie C# muszą być możliwe do odszyfrowania tak abym dostał stringa 1:1 takiego samego jaki był zaszyfrowany.


Jakie metody/biblioteki polecacie? Prosiłbym o możliwie jak najdokładniejsze instrukcje, pamiętając, że dana metoda musi działać i w C# i w PHP. Prosiłbym tylko bez wygłupów pokroju XORa XD To musi być coś naprawdę bezpiecznego.

Odnośnik do komentarza
Udostępnij na innych stronach

SSL, jest nawet .NET-owa funkcja pod C# https://docs.microsoft.com/en-us/dotnet/api/system.net.security.sslstream?view=netframework-4.8, a jakiś konkretny protokół Cię interesuje? Bo jeżeli PHP to podejrzewam, że chodzi o HTTPS, .NET-owy HttpClient też obsługuje SSL-a out of the box.

Odnośnik do komentarza
Udostępnij na innych stronach

12 minut temu, Konrad-GM napisał:

SSL, jest nawet .NET-owa funkcja pod C# https://docs.microsoft.com/en-us/dotnet/api/system.net.security.sslstream?view=netframework-4.8, a jakiś konkretny protokół Cię interesuje? Bo jeżeli PHP to podejrzewam, że chodzi o HTTPS, .NET-owy HttpClient też obsługuje SSL-a out of the box.

Chodzi o zaszyfrowanie stringa w PHP i wyświetlenie go zwykłym echem po HTTP/HTTPS i odszyfrowanie w C#, a potem zaszyfrowanie innego stringa tą samą metodą i wysłanie do PHP metodą POST.
Tak jak pisałem interesuje mnie MONO jeśli chodzi o C#.

Odnośnik do komentarza
Udostępnij na innych stronach

Ale SSL właśnie to robi, co chcesz osiągnąć. Szyfruje w jedną jak i drugą stronę i tylko te dwa endpointy potrafią zaszyfrować/rozszyfrować wiadomość. Jeżeli używasz protokołu HTTP (GET oraz POST) to ja nie rozumiem, po co Ci jeszcze jakieś inne szyfrowanie... Jeżeli Mono to pewnie pozostaje Ci użycie jakiejś biblioteki 3rd party. Ale jaka jest "najlepsza" to nie mogę powiedzieć, bo w Mono nie pracuję (HttpClient powinien być też dostępny w Mono) :P

Dodatkowo napisałeś, że chcesz programem w PHP wysłać coś do C#, tylko, że C# nie odbierze CI informacji, jak nie jest serwerem (nie odbierze POST). Jeżeli zakładasz serwer w C#, to też możesz skorzystać z połączenia po SSLu, działa na tej samej zasadzie.

Odnośnik do komentarza
Udostępnij na innych stronach

5 godzin temu, Konrad-GM napisał:

Ale SSL właśnie to robi, co chcesz osiągnąć. Szyfruje w jedną jak i drugą stronę i tylko te dwa endpointy potrafią zaszyfrować/rozszyfrować wiadomość. Jeżeli używasz protokołu HTTP (GET oraz POST) to ja nie rozumiem, po co Ci jeszcze jakieś inne szyfrowanie... Jeżeli Mono to pewnie pozostaje Ci użycie jakiejś biblioteki 3rd party. Ale jaka jest "najlepsza" to nie mogę powiedzieć, bo w Mono nie pracuję (HttpClient powinien być też dostępny w Mono) :P

Dodatkowo napisałeś, że chcesz programem w PHP wysłać coś do C#, tylko, że C# nie odbierze CI informacji, jak nie jest serwerem (nie odbierze POST). Jeżeli zakładasz serwer w C#, to też możesz skorzystać z połączenia po SSLu, działa na tej samej zasadzie.

Program w C# będzie odczytywał dane przez plik PHP (z secret key w post).

Mógłbym prosić o jakieś szczegóły jak to zrobić protokołem http?

Odnośnik do komentarza
Udostępnij na innych stronach

5 godzin temu, gnysek napisał:

https - nie musisz wtedy nic szyfrować, automatycznie pobierze certyfikat z docelowej domeny (o ile tam jest https) i zaszyfruje dane przed wysłaniem. Tak jak przeglądarka.

Przecież mogę normalnie wejście sobie przez https i nie mam zaszyfrowanych danych. Ja potrzebuję takiego dosłownego szyfrowania. Że ktoś otwiera plik PHP i nic mu to nie daje bo ma dane w formie zaszyfrowanego stringa. Pomóżcie bo to pilne bardzo. 

Odnośnik do komentarza
Udostępnij na innych stronach

9 minut temu, LolikZabójca napisał:

Przecież mogę normalnie wejście sobie przez https i nie mam zaszyfrowanych danych. Ja potrzebuję takiego dosłownego szyfrowania. Że ktoś otwiera plik PHP i nic mu to nie daje bo ma dane w formie zaszyfrowanego stringa. Pomóżcie bo to pilne bardzo. 

A nie możesz wysłać w POST/GET parametru? np. secret_key i sprawdzić w PHP, czy się zgadza i dopiero wysyłać dane? Jeżeli secret_key jest niepoprawny to nie wysyłaj nic i tyle.

Odnośnik do komentarza
Udostępnij na innych stronach

21 minut temu, Konrad-GM napisał:

A nie możesz wysłać w POST/GET parametru? np. secret_key i sprawdzić w PHP, czy się zgadza i dopiero wysyłać dane? Jeżeli secret_key jest niepoprawny to nie wysyłaj nic i tyle.

Napisałem w temacie, że właśnie dokładnie tak robię. Tylko cześć danych jest na tyle wrażliwa, że wolałbym je dodatkowo zabezpieczyć. Szyfrowałbym je od razu w momencie zapisu do MySQL i takie wysyłał i dopiero po stronie programu w C# dopiero ulegałaby ponownemu odszyfrowaniu. Mam secret_key, ale wolałbym mieć dodatkowe zabezpieczenie. Sprawa wydaję się być prosta, bo to "tylko szyfrowanie", a okazuje się, że póki co wcale taka nie jest. Bo są różne biblioteki do szyfrowania na C# i PHP, a brakuje mi jakiegoś jednolitego i sprawdzonego standardu szyfrowania które obsługuje i Mono C# i PHP. 

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli przechowujesz dane typu karty kredytowe, to fakt, może jakaś dodatkowa warstwa by się przydała. Niemniej jak ktoś Ci już wejdzie na serwer i będzie mógł przeglądać pliki i bazę danych - to Twoje "dodatkowe" zabezpieczenie i tak nie będzie działać, po prostu nie trzymaj kart kredytowych na serwerze, bo jeden wyciek może Cię kosztować sporo ;) Spróbuj może szyfrowanie AES, MySQL nawet ma funkcję wbudowaną AES_ENCRYPT. W C# masz też systemową klasę System.Security.Cryptography.Aes (powinno działać też na Mono).

Btw. Jeżeli zależy Ci na szyfrowaniu połączenia Serwer -> Klient, to w zupełności wystarczy Ci SSL (bo próbujesz szyfrować dodatkowo dane w PHP, których i tak nikt nie zobaczy), nikt nie podejrzy takich danych, serio, nie ma czegoś "lepszego".

Odnośnik do komentarza
Udostępnij na innych stronach

Godzinę temu, Konrad-GM napisał:

Jeżeli przechowujesz dane typu karty kredytowe, to fakt, może jakaś dodatkowa warstwa by się przydała. Niemniej jak ktoś Ci już wejdzie na serwer i będzie mógł przeglądać pliki i bazę danych - to Twoje "dodatkowe" zabezpieczenie i tak nie będzie działać, po prostu nie trzymaj kart kredytowych na serwerze, bo jeden wyciek może Cię kosztować sporo ;) Spróbuj może szyfrowanie AES, MySQL nawet ma funkcję wbudowaną AES_ENCRYPT. W C# masz też systemową klasę System.Security.Cryptography.Aes (powinno działać też na Mono).

Btw. Jeżeli zależy Ci na szyfrowaniu połączenia Serwer -> Klient, to w zupełności wystarczy Ci SSL (bo próbujesz szyfrować dodatkowo dane w PHP, których i tak nikt nie zobaczy), nikt nie podejrzy takich danych, serio, nie ma czegoś "lepszego".

Po prostu znam przypadki z mojej branży gdzie dochodziło do włamów do bazy MySQL i kradzieży danych a potem ich skutecznym odszyfrowaniu, bo konkurent nie zabezpieczył dodatkowo danych w bazie. Gdyby były zaszyfrowane odpowiednio to samo włamanie do MySQL nic by nie dało. Chociaż wiadomo, że liczę, że na 99% włamanie do MySQL nie wchodzi w grę, ale gdyby jakiś sposób ktoś znalazł, wolałbym te dane odpowiednio zabezpieczyć, bo akurat te dane o które chodzi mogłyby mnie kosztować nie mniej niż dane kart kredytowych :D Też wiążą się z utratą sporych środków finansowych. Poza tym wiedząc jak skończył się wyciek u konkurencji, będę mógł z czystym sumieniem reklamować się jako ten, który zabezpieczył dane klientów lepiej niż konkurencja która przez brak szyfrowania doprowadziła do wycieku mega wrażliwych danych. To już czysty marketing, ale wiem, że taki argument będzie skuteczny dla odbiorców reklamy.

Wielkie dzięki za uwagę o MySQL. Znalazłem już nawet bibliotekę do php, ale po co skoro jest gotowa funkcja w MySQL :D Pobawię się i mam nadzieję, że resztę już rozkminię sam. Chociaż tyle za mnie zrobiłeś(nawet konkretną bibliotekę pod Mono C# znalazłeś xd), że już nie wiele mi pozostało :D Dzięki wielkie, kocham Cię ❤

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Tzn. liczysz, że jak użyjesz szyfrowania (nie hashowania), to dane w MySql będą bezpieczne? Jak ktoś pozna klucz (a będziesz go miał w aplikacji C# zapewne) to dupa zbita. Co do tego, że dane po https są przesyłane jawnie - cóż, przed wysłaniem (w przeglądarce) i po odebraniu (w PHP) owszem są jawne, ale przeglądarka pokazuje dane przed wysłaniem pakietów, a PHP po przetworzeniu przez Apache/Nginx.

 

Co do włamów do bazy MySql - nie udostępniaj bazy z zewnątrz, to ryzyko włamania spadnie niemal do zera. A jak się ktoś włamie na serwer, to wierz mi, że nie trzeba nawet wejść do mysql, można po prostu zrobić loggera przychodzących danych w odpowiednim miejscu i je nawet na mejla wysyłać.

 

Co do danych kart kredytowych - po co je chcesz zapisywać? Nawet jak robisz płatności-subskrypcje, to wystarczy autoryzowanie z bramki płatności i otrzymanie z niej kodu płatności i potem powoływanie się na niego, żeby ściągać kasę (capture). Sam numer karty też najlepiej, gdyby klienci podwali w bramce (payu/dotpay itp) - to jest miliard razy bezpieczniejsze. Zrobiłem w życiu ponad 50 sklepów internetowych i zawsze zalecamy klientom, aby nie wpisywać i nie przechowywać ŻADNYCH danych kart kredytowych na ich stronie i zostawić to bramkom płatności.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...