2011-01-05 11 views
17

Lub: Jak przechowywać zaszyfrowane dane dla wielu użytkowników?Czy możliwe jest szyfrowanie wieloma kluczami prywatnymi (PHP)?

Przyznaję, to głupie pytanie, klucz prywatny jest ograniczony tylko do jednej osoby, jak to już sugeruje. Ale mam następujący scenariusz:

Użytkownik Tom wprowadza dane, które muszą być przechowywane w postaci zaszyfrowanej w bazie danych. Użytkownik decyduje, że chce udostępnić te informacje Jimowi i Bobowi. Użytkownicy John i Jayne nie mogą ich odszyfrować. Oczywiście nie dla użytkownika Tima, który zhakował serwer i miał dostęp do zaszyfrowanych danych oraz skryptów, które wykonują szyfrowanie/odszyfrowywanie.

Myślę, że podejście klucza publicznego/klucza prywatnego z funkcją PHP openssl_public_encrypt nie działa tutaj, ponieważ dwóch użytkowników musi mieć klucz "prywatny" do odszyfrowania danych.

Domyślam się, że jest to raczej ogólne pytanie, ale jeśli jest ważne, musi to być zrobione w PHP (może i MySQL).

Odpowiedz

14

Tak to zrobiono w OpenPGP (i innych systemach): - generujesz tajny klucz symetryczny, który służy do szyfrowania samych danych; - wtedy ten symetryczny klucz jest szyfrowany kluczem Toma; - również klucz symetryczny można zaszyfrować za pomocą klucza publicznego Jima i Boba, umożliwiając odszyfrowanie klucza, a następnie odszyfrowanie danych.

+0

Dzięki - wybiorę to jako akceptowaną odpowiedź, ponieważ inni zalecają to samo i jesteście pierwsi. Dziękuję wam wszystkim! – acme

3

Nie znam bibliotek w PHP. Ale w ogóle procedura jest następująca:

  • Dane są szyfrowane za pomocą klucza symetrycznego
  • dla każdego odbiorcy, kluczem jest szyfrowana przy użyciu klucza publicznego odbiorcy
  • Wszystko to jest zapisane w pliku PKCS # 7 struktura plików

Nie powinno być pewne rezultaty, gdy patrząc w górę „PHP i PKCS7” ...

+0

Funkcja 'openssl_seal()' w PHP wykonuje to (chociaż nie wytwarza wyniku PKCS # 7). – caf

2

użyć klucza szyfrowania danych (nazywają to Kgeneral) to odrębne od klucza Toma.

Zaszyfruj Kgeneral kluczem publicznym Toma i daj wynik Tomowi - może użyć swojego klucza prywatnego do odszyfrowania go i uzyskania Kgeneral.

Jeśli inny użytkownik potrzebuje dostępu do danych, Tom (lub twoja aplikacja) może następnie zaszyfrować Kgeneral swoim kluczem publicznym i dać mu dostęp w ten sposób.

11

PHP zapewnia funkcję tego - openssl_seal(). Ta funkcja pobiera tablicę kluczy publicznych i szyfruje dane, aby każdy z odpowiednich kluczy prywatnych mógł zostać użyty do odszyfrowania (za pomocą openssl_open()).

+0

Rozumiem, że ta funkcja pobiera tablicę kluczy publicznych odbiorców, ale co z kluczem prywatnym i publicznym nadawcy? Czy ta funkcja generuje przypadkową i umieszcza plik osła nadawcy w pliku sealed_data? –

+0

@DawidGrzesiak: Funkcja 'openssl_seal()' nie podpisuje danych, więc nie wymaga kluczy nadawcy. Możesz użyć ['openssl_sign()'] (http://php.net/openssl_sign), aby podpisać wynik 'openssl_seal()'. – caf

Powiązane problemy