2011-01-05 36 views
17

Hoặc: Cách lưu trữ dữ liệu được mã hóa cho một nhóm người dùng?Có thể mã hóa với nhiều khóa riêng (PHP) không?

Tôi thừa nhận, đó là câu hỏi ngớ ngẩn, khóa riêng tư được giới hạn chỉ một người như thuật ngữ đã được ngụ ý. Nhưng tôi có kịch bản sau:

Người dùng Tom nhập dữ liệu cần được mã hóa được lưu trữ trong cơ sở dữ liệu. Người dùng quyết định muốn cung cấp thông tin này cho Jim và Bob. Người dùng John và Jayne không thể giải mã được. Tất nhiên cũng không phải để người dùng Tim đã hack máy chủ và có quyền truy cập vào dữ liệu được mã hóa và các tập lệnh thực hiện mã hóa/giải mã.

Tôi nghĩ rằng phương pháp khóa công khai/khóa riêng với chức năng PHP openssl_public_encrypt sẽ không hoạt động ở đây vì hai người dùng cần có khóa "riêng tư" để giải mã dữ liệu.

Tôi đoán đây là một câu hỏi khá chung chung, nhưng nếu nó quan trọng, nó phải được thực hiện bằng PHP (và MySQL có thể).

Trả lời

14

Đó là cách thực hiện trong OpenPGP (và các hệ thống khác): - bạn đang tạo khóa đối xứng bí mật, được sử dụng để mã hóa dữ liệu; - sau đó, khóa đối xứng này được mã hóa bằng khóa của Tom; - ngoài ra, khóa đối xứng có thể được mã hóa bằng khóa công khai của Jim và Bob, cho phép chúng giải mã khóa và sau đó giải mã dữ liệu

+0

Cảm ơn - Tôi sẽ chọn câu trả lời này là câu trả lời được chấp nhận khi những người khác giới thiệu cơ bản điều tương tự và bạn là người đầu tiên. Cảm ơn tất cả! – acme

3

Tôi không biết thư viện trong PHP. Nhưng nói chung các thủ tục như sau:

  • dữ liệu được mã hóa bằng một đối xứng chính
  • Đối với mỗi người nhận, quan trọng được mã hóa bằng khóa công khai của người nhận
  • Tất cả điều này được lưu trong một PKCS # 7 cấu trúc tập tin

nên có một số kết quả khi nhìn lên "PHP và PKCS7" ...

+0

Hàm 'openssl_seal()' trong PHP thực hiện điều này (mặc dù nó không tạo ra kết quả PKCS # 7). – caf

2

Sử dụng một chìa khóa mã hóa dữ liệu (gọi nó là Kgeneral) đó là khác biệt với chìa khóa của Tom.

Mã hóa Kgeneral bằng khóa công khai của Tom và đưa kết quả cho Tom - anh ấy có thể sử dụng khóa riêng của mình để giải mã và nhận Kgeneral.

Nếu người dùng khác sau đó cần quyền truy cập vào dữ liệu, Tom (hoặc ứng dụng của bạn) sau đó có thể mã hóa Kgeneral bằng khóa công khai của mình và cấp cho anh ấy quyền truy cập theo cách đó.

11

PHP cung cấp chức năng này - openssl_seal(). Hàm này lấy một mảng các khóa công khai và mã hóa dữ liệu sao cho bất kỳ khóa riêng tư tương ứng nào có thể được sử dụng để giải mã nó (sử dụng openssl_open()).

+0

Tôi hiểu rằng chức năng này có một mảng người nhận khóa công khai, nhưng điều gì về khóa riêng và khóa công khai của người gửi? Là chức năng này tạo ra một ngẫu nhiên và nhúng pubkey của người gửi vào sealed_data? –

+0

@DawidGrzesiak: Hàm 'openssl_seal()' không ký dữ liệu, vì vậy nó không yêu cầu khóa của người gửi. Bạn có thể sử dụng ['openssl_sign()'] (http://php.net/openssl_sign) để ký kết quả của 'openssl_seal()'. – caf

Các vấn đề liên quan