2011-01-05 70 views
17

或者:如何存儲一堆用戶的加密數據?是否可以使用多個私鑰(PHP)進行加密?

我承認,這是一個愚蠢的問題,一個私鑰只限於一人術語已經暗示。但我有以下情況:

用戶Tom將需要存儲在數據庫中的數據加密。用戶決定他希望將這些信息提供給Jim和Bob。用戶John和Jayne一定不能解密它。當然,對於用戶Tim來說,他們也不會對服務器進行黑客攻擊,並且可以訪問加密數據和執行加密/解密的腳本。

我認爲PHPs openssl_public_encrypt函數的公鑰/私鑰方法在這裏不起作用,因爲兩個用戶需要擁有該「私鑰」來解密數據。

我想這是一個相當普遍的問題,但如果它很重要,它必須在PHP(也許是MySQL)中完成。

回答

14

這就是它在OpenPGP(以及其他系統)中的工作方式: - 您正在生成祕密對稱密鑰,用於加密數據本身; - 然後,這個對稱密鑰用Tom的密鑰加密; - 同樣,對稱密鑰可以使用Jim和Bob的公鑰進行加密,允許他們解密密鑰,然後解密數據。

+0

謝謝 - 我會選擇這個作爲接受的答案,因爲其他人基本上推薦同樣的東西,你是第一個。謝謝你們! – acme 2011-01-10 10:29:40

3

我不知道PHP中的庫。但在一般的程序如下:

  • 數據使用對稱密鑰
  • 對於每個收件人加密,密鑰使用
  • 所有這一切都被保存在一個PKCS#7接收者的公鑰加密文件結構

查找「PHP和PKCS7」的時候應該有一些結果...

+0

PHP中的'openssl_seal()'函數執行此操作(儘管它不會生成PKCS#7輸出)。 – caf 2011-01-06 04:38:57

2

使用數據加密密鑰(稱之爲Kgeneral)這是從湯姆的重點不同。

加密Kgeneral與湯姆的公鑰和結果交予湯姆 - 他可以用自己的私鑰進行解密,並獲得Kgeneral。

如果其他用戶則需要對數據的訪問,湯姆(或應用程序),然後用他的公鑰加密Kgeneral,並給他訪問的方式。

11

PHP爲此提供了一個功能 - openssl_seal()。該函數獲取一組公鑰,並對數據進行加密,以便可以使用任何一個相應的私鑰對其進行解密(使用openssl_open())。

+0

我知道這個函數需要一個收件人公鑰的數組,但是發件人的私鑰和公鑰又如何呢?這個函數是否生成一個隨機函數並將發送者的pubkey嵌入到sealed_data中? – 2014-03-02 17:36:46

+0

@DawidGrzesiak:'openssl_seal()'函數不簽名數據,所以它不需要發件人的密鑰。你可以使用['openssl_sign()'](http://php.net/openssl_sign)來簽署'openssl_seal()'的結果。 – caf 2014-03-02 23:31:57

相關問題