2011-01-05 32 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

相关问题