是否可以使用多个私钥(PHP)进行加密?

Posted

技术标签:

【中文标题】是否可以使用多个私钥(PHP)进行加密?【英文标题】:Is it possible to have encryption with multiple private keys (PHP)? 【发布时间】:2011-06-04 01:23:37 【问题描述】:

或者:如何为一群用户存储加密数据?

我承认,这是一个愚蠢的问题,正如该术语已经暗示的那样,私钥仅限于一个人。但我有以下情况:

用户 Tom 输入需要在数据库中加密存储的数据。用户决定他想让这些信息对 Jim 和 Bob 可用。用户 John 和 Jayne 一定不能解密它。当然也不是用户 Tim 入侵了服务器并可以访问加密数据和执行加密/解密的脚本。

我认为使用 phps openssl_public_encrypt 函数的公钥/私钥方法在这里不起作用,因为两个用户需要拥有那个“私钥”来解密数据。

我想这是一个相当笼统的问题,但如果它很重要,则必须在 PHP(可能还有 mysql)中完成。

【问题讨论】:

【参考方案1】:

我不知道 PHP 中的库。但大体流程如下:

数据使用对称密钥加密 对于每个收件人,使用收件人的公钥对密钥进行加密 所有这些都保存在 PKCS#7 文件结构中

查找“PHP and PKCS7”应该会有一些结果...

【讨论】:

PHP 中的 openssl_seal() 函数执行此操作(尽管它不会产生 PKCS#7 输出)。【参考方案2】:

使用不同于 Tom 的密钥的数据加密密钥(称为 Kgeneral)。

用 Tom 的公钥加密 Kgeneral 并将结果提供给 Tom - 他可以使用他的私钥解密并获得 Kgeneral。

如果其他用户需要访问数据,Tom(或您的应用程序)可以使用他的公钥加密 Kgeneral,并以这种方式授予他访问权限。

【讨论】:

【参考方案3】:

这就是它在 OpenPGP(以及其他系统)中的做法: - 您正在生成秘密对称密钥,用于加密数据本身; - 然后,这个对称密钥用汤姆的密钥加密; - 此外,对称密钥可以用 Jim 和 Bob 的公钥加密,允许他们解密密钥,然后解密数据

【讨论】:

谢谢 - 我会选择这个作为接受的答案,因为其他人基本上推荐同样的东西,而你是第一个。谢谢大家!【参考方案4】:

PHP 为此提供了一个函数 - openssl_seal()。此函数采用一组公钥,并对数据进行加密,以便可以使用任何一个对应的私钥对其进行解密(使用openssl_open())。

【讨论】:

我知道这个函数需要一个收件人公钥数组,但是发件人的私钥和公钥呢?这个函数是否会生成一个随机的并将发送者的公钥嵌入到 seal_data 中? @DawidGrzesiak:openssl_seal() 函数不对数据进行签名,因此它不需要发送者的密钥。您可以使用openssl_sign()openssl_seal() 的结果进行签名。

以上是关于是否可以使用多个私钥(PHP)进行加密?的主要内容,如果未能解决你的问题,请参考以下文章

RSA的公钥、私钥

关于RSA中公钥和私钥的具体使用情况区分

Ruby:使用私钥/公钥进行文件加密/解密

怎么在ios进行rsa公钥加密,java做rsa私钥解密

带有私钥加密的公钥加密

ras可以加密php代码吗