Jak zabezpieczyć API

Witam
Mam konta partnerów serwisu, chciałbym aby partner mógł generować rekordy w pewnej tabeli u mnie za pomoca mojego api. U partnera w serwisie jest wielu uzytkowników i kazdy miałby swój unikalny link z ref_id żeby coś wygenerować i dostać odpowiedź, czyli samo api_key przywiązane do danego partnera to tylko połowa zabezpieczenia. Jak stworzyć ten ref_id żeby wykluczyć możliwość że ktoś podstawi sobie losowe znaki i wygeneruje sobie dane. Czy jest wogóle taka możliwość bez zdradzania partnerowi algorytmu.

Na upartego możesz generować klucze publiczne per użytkownik.

użytkownik w sensie zwykłego użytkownika serwisu, nie linuxowy

No ale jakie to ma znaczenie ? Generujesz pare kluczy, w bazie trzymasz private, public uzywasz jako ref_id i autoryzujesz. Każdemu użytkownikowi/klientowi inna para kluczy. 2048 bitowy des3 styknie :wink: Możesz dać większy pewnie nie złamią go bruteforce przez najbliższe 25 lat :stuck_out_tongue_winking_eye:

@Paweł Kondzior - co rozumiesz przez autoryzację za pomocą tego ref_id? Według mnie autoryzacja mogłaby wyglądać w ten sposób, że serwer wysyła plaintext do zaszyfrowania. Klient za pomocą swojego klucza szyfruje i odsyła do serwera cyphertext. Jeżeli serwer uzna, że po odszyfrowaniu otrzymał tą samą wiadomość (wcześniej wysłany plaintext) to wiadomo, że klient ma odpowiadający klucz publiczny.

Jeżeli jednak będziesz sprawdzał tylko czy klucz publiczny zgadza się z kluczem prywatnym (czyli klucz publiczny będzie wysyłany do serwera) to poziom bezpieczeństwa jest taki sam jak w przypadku wygenerowania losowego ciągu ref_id, który będzie przesyłany do serwera. Oczywiście jeżeli będą miały taką samą długość (2048-bitów przykładowo).

Według mnie wygenerowanie losowego ciągu i wymuszenie nawiązywania połączenia do api przez https załatwi sprawę.

Chodziło mi tylko i wyłączeni o wykorzystanie par tych kluczy jako o najleprzy i gotowy obecnie sposób na generowanie takich ref_id wmiare unikalnych. Takie było chyba pytanie prawda? Natomiast to czy dane będą szyfrowane czy nie to już jest zupełnie inny temat. Owszem jest tak jak mówisz nie gwarantuje to żadnego bezpieczeństaw danych, no bo wkońcu te dane nie są szyfrowane, ale przynajmnije klucze są na poziomie :smiley: W idealnym systemie osobiście szyfrował bym wszystko, ale nie wiem czy tutaj jest to wogóle możliwe.

Generowanie kluczy i tak odbywa się za pomocą /dev/urandom, więc prościej będzie użyć http://rubydoc.info/stdlib/securerandom/1.9.2/SecureRandom