Php 使用SSL证书进行加密与生成密钥

Php 使用SSL证书进行加密与生成密钥,php,laravel,ssl,encryption,cryptography,Php,Laravel,Ssl,Encryption,Cryptography,我正在从事加密工作,目前正在使用openssl\u encrypt解决方案加密我的数据。目前我正在重写一个使用openssl\u public\u encrypt和openssl\u private\u decrypt的旧代码库 当然,我必须匹配之前使用的加密,但我正在考虑撤消加密数据并重写加密和解密方法 openssl\u public\u encrypt值的缺点是它们不能大于用于加密的证书。对于openssl\u encrypt,这种缺点并不存在 遗留代码库中的解决方法是将加密片段粘合在一

我正在从事加密工作,目前正在使用
openssl\u encrypt
解决方案加密我的数据。目前我正在重写一个使用
openssl\u public\u encrypt
openssl\u private\u decrypt
的旧代码库

当然,我必须匹配之前使用的加密,但我正在考虑撤消加密数据并重写加密和解密方法

openssl\u public\u encrypt
值的缺点是它们不能大于用于加密的证书。对于
openssl\u encrypt
,这种缺点并不存在

遗留代码库中的解决方法是将加密片段粘合在一起,以便能够加密大型数据。对我来说,这看起来相当混乱和紧张

我当前的解决方案是使用
openssl\u encrypt
和一个简单的生成密钥,如Laravel将为其生成密钥:

protected function generateRandomKey()
{
    return 'base64:'.base64_encode(random_bytes(
        $this->laravel['config']['app.cipher'] == 'AES-128-CBC' ? 16 : 32
    ));
}
这项工作非常出色,但对于旧代码库,我选择SSL证书进行加密/解密,原因我还不完全清楚

与公共/私有方式相比,
openssl\u encrypt
的优点/缺点是什么

我想与第三方合作,您可以向他们提供您的公共证书,但您也可以向他们提供您生成的密钥

如果第三方(如金融系统)需要访问加密数据,他们也可以解密

在这两种情况下,您都提供了解密数据的密钥

我希望有人能解释一下,为什么您会限制自己加密的值不超过您的证书,这样您就可以使用
public/private openssl
函数

干杯。

来点光。。。好的

首先让我们看看我们在这里处理的算法或算法类别:

公钥/私钥。。。这意味着使用RSA等算法的不对称加密。。。DH

与使用AES等算法的符号加密相比。。。德。。。双鱼

如果您的代码库包含诸如将加密数据块粘合在一起之类的内容,因为数据量对于非对称算法来说太大了,您可以放心地说,无论是谁构建的,他/她都不知道自己在做什么

对称算法用于加密批量数据。。。 不对称算法用于加密对称密钥,以便相应私钥的所有者可以解密对称密钥,从而可以解密批量数据密文

像AES这样的对称密码的密钥不大于您在描述的方法中找到的大小限制

非对称加密的原因是,您可以与世界共享您的公钥,每个人都可以为您加密数据(这里的数据在99%的真实世界场景中都是指:对称密钥),但只有您作为私钥的持有者才能解密。。。私钥永远不会离开你的手。。。除了所有者之外,没有人可以访问它

证书仅仅是公钥+元数据

该元数据包含有关谁拥有密钥对、密钥对的用途、从何时到何时密钥对有效等信息

元数据被转换成特定格式,并由可信的第三方签名。。。结果就是所谓的证书

证书上的签名是您可以使用公钥密码执行的其他操作。。。但这一次反过来。。。要为特定数据集创建签名,您需要私钥。。。没有它你就不能签名。。。但是每个持有公钥的人都可以验证签名。。。如果更改签名所属数据中的一个位,它将变得无效,因此不能简单地篡改证书的内容,例如更改密钥

更新:

如果您需要第三方在拥有您的公钥的情况下向您发送加密数据:

-他们创建了一个只有他们自己才知道的随机符号键(我们称之为Ksym)
-他们用那个密钥和一个对称密码加密他们需要的任何数据。。。(ct=ENC(数据,Ksym))
-他们使用您的公钥为您加密Ks(eKsym=ENC(Ksym,Kpub))
-他们给你发ct和eKsym

-您可以破译eKsym(Ksym=DEC(eKsym,Kpriv))
-破译数据=DEC(ct,Ksym)

事实:

只有你和第三方知道Ksym

如果您想以第三方无法解密的方式存储数据,则需要对其重新加密

如果您存储eKsym和ct,则只有您和最初加密数据的第三方知道所需的解密密钥Ksym(当然还有从您或所述第三方获得密钥的所有人)


有趣的事实是:Ksym对于每个传入数据段都是不同的,并且只对该数据段有效。。。与另一个第三方共享一个Ksym只能访问属于此密钥的一部分数据

如果您不确定如何解决此问题,那么您现在应该退出,并雇佣知道他们正在做什么来解决此问题的人。不要吝啬或粗鲁,最好把事情做好。在你之前从事这项工作的人显然不知道他们在做什么,不要将自己添加到列表中


如果你打算自己解决这个问题(我认为你不应该),我建议你使用TLS来保护你和最终用户之间的连接,接收他们发送给你的任何数据,然后加密并存储。我真的不知道为什么你(或者之前从事这项工作的人)认为用同一台设备上的密钥加密静态数据会有好处。。。很多工作实际上都没有安全性。

因此,我们向人们分发公钥,以加密他们可以向我们发送的数据。因为我们持有私钥,所以我们是唯一