Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Bezpieczne komunikownie się 2 aplikacji
Forum PHP.pl > Forum > PHP
athabus
Witam,

pracuje teraz nad projektem gdzie są 2 aplikacje napisane w php (różne serwery). Aplikacje mają między sobą wymieniać dane za pośrednictwem internetu. Chciałbym aby wymiana odbywała się w bezpieczny sposób - tj:
- aby tylko aplikacja posiadająca autoryzację mogła "prosić" o dane i je otrzymywać - rozumiem, że tu trzeba przeprowadzić jakąś autoryzację na podstawie loginu i hasła
- miło byłoby aby dane były szyfrowane przed wysłaniem i odszyfrowywane po otrzymaniu (nie jest to konieczne, ale byłoby miło).

Z tego co wgryzłem się w temat to idealnym rozwiązaniem na komunikację między aplikacjami są webservices. O ile jednak znalazłem teksty na temat tego jak napisać serwer i klienta, to nie mogę znaleźć nic konkretnego na temat zabezpieczania danych, czyli jak sprawić aby klient przed uzyskaniem danych z serwera musiał się zalogować. Jak zrobić to bezpiecznie (bo chyba samo dodanie hasła i loginu i wysłanie tego postem wraz z innymi elementami zapytania klienta nie byłoby bezpieczne).

Byłbym wdzięczny za wskazanie tekstu/tutoriala lub opisanie w kilku słowach ogólnego zarysu jak to się robi w praktyce - mam wrażenie, że szukam pod złymi pojęciami lub źle rozumiem cały proces zabezpieczania webservices i dlatego Google nie może mi pomóc.
wookieb
Soap + ssl + logowanie i ciężko będzie to złamać smile.gif Możesz użyć także iptables
Czy serwery nie mogą być w jednej sieci?
athabus
Dzięki za odpowiedź.

W moim przypadku zdecydowałem się na XML-RPC - pierwszy raz robię coś podobnego, więc stawiam na prostotę. Ale to chyba akurat nie ma takiego wielkiego znaczenia bo idea jest taka sama. Konkretnie używam tej biblioteki bo znalazłem do niej przystępny tutorial.

Do tego na jednej z maszyn nie mam możliwości instalacji certyfikatu ssl, więc chyba nie da rady tego tak rozegrać. Chyba, że mogę obyć się bez certyfikatu i jakoś inaczej to szyfrować?

Dodam, że zależy mi na prostocie rozwiązania, bo trochę za wiele rzeczy, których nigdy dotąd nie robiłem pojawia się na raz ;-)
wookieb
Więc jeżeli chcesz zaszyfrować dane tak aby mógł je odczytać tylko drugi serwer to nawet proste zabezpieczenie na ip oraz jakiś stały ciąg wysyłany w requescie (który znają tylko te 2 serwery) nie byłby zły.
W przeciwnym razie musisz zainteresować się szyframi z rodziny RSA.
hind
od biedy xor + base64 i requestami jechać
sniver
kiedyś napisałem takie coś:

może sie przyda - wymaga dodania tajnego klucza biggrin.gif

  1. <?php
  2.  
  3. class crypt {
  4.  
  5. static private $key;
  6.  
  7.  
  8. private function __construct() {
  9. // dodać coś z config'a
  10. $this->key = 'tajnyKlucz';
  11. }
  12.  
  13.  
  14. public function encryptData( $value ) {
  15. if( !self::$key ) {
  16. self::$key = new crypt;
  17. }
  18.  
  19. $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
  20. $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  21. $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, self::$key->key, $value, MCRYPT_MODE_ECB, $iv);
  22.  
  23. return $crypttext;
  24. }
  25.  
  26. function decryptData( $value ) {
  27. if( !self::$key ) {
  28. self::$key = new crypt;
  29. }
  30.  
  31. $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
  32. $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  33. $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, self::$key->key, $value, MCRYPT_MODE_ECB, $iv);
  34.  
  35. return trim($decrypttext);
  36. }
  37.  
  38. public function base64_url_encode($input) {
  39. return strtr(base64_encode($input), '+/=', '-_,');
  40. }
  41.  
  42. public function base64_url_decode($input) {
  43. return base64_decode(strtr($input, '-_,', '+/='));
  44. }
  45. }
  46.  
  47.  
  48. /*
  49. $szyfrowaneInformacje = '
  50. DATA:23-02-2010;
  51. EXPIRE:24-03-2010;
  52. ID:6066;
  53. LOGIN:sniver;
  54. CHANGE:email;
  55. VALUE:sniver@interia.pl;
  56. ';
  57.  
  58.  
  59. $zakodowany = crypt::encryptData( $szyfrowaneInformacje );
  60.  
  61. echo '<pre>';
  62.  
  63. var_dump(
  64. $zakodowany
  65. );
  66.  
  67. echo '<hr />';
  68.  
  69. var_dump(
  70. crypt::base64_url_encode( $zakodowany )
  71. );
  72.  
  73. echo '<hr />';
  74.  
  75. var_dump(
  76. crypt::base64_url_decode( crypt::base64_url_encode( $zakodowany ) )
  77. );
  78.  
  79. echo '<hr />';
  80.  
  81. var_dump(
  82. crypt::decryptData(crypt::base64_url_decode( crypt::base64_url_encode( $zakodowany ) ))
  83. );
  84.  
  85. var_dump(
  86. crypt::base64_url_encode(
  87. array('id'=>123,'nazwa'=>'abc')
  88. )
  89. );
  90.  
  91. echo '</pre>';
  92. */
  93. ?>
athabus
Przemyślałem wszystkie opcje i na razie chyba zrobię tak:
- generalnie dane będą chwilowo nieszyfrowane - pokombinuje jeszcze czy uda mi się jakoś przerobić tą bibliotekę aby szyfrowała wszystko mcryptem, bo szyfrowanie ręcznie każdej składowej jest chyba zbyt uciążliwe. Musze pokombinować czy po stronie serwera da się zakodować wszystko w ostatnim kroku, a po stronie klienta odszyfrować wszystko jako krok pierwszy
- aplikacja będzie wysyłała jedynie login i hasło w celu autoryzacji
- jako, że klient i serwer mają stałe ip to chwilowo zastosuję filtrowanie po ip
- docelowo obie aplikacje będą pracować na vps'ach więc gdy to się stanie dodam certyfikat ssl i dojdzie szyfrowanie (na razie serwer niestety będzie na hostingu współdzielonym)

ps. snifer fajna klasa - uproszcza maksymalnie korzystanie z mcrypta ;-)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.