是否可以使用多个私钥(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)进行加密?的主要内容,如果未能解决你的问题,请参考以下文章