PHP OpenSSL非对称加密 - 这真的很简单吗?

时间:2014-01-22 16:52:32

标签: php encryption openssl

我正在用PHP构建一个应用程序,我希望使用非对称加密来在两个用户之间交换消息。

为了这个问题忽略密钥管理和其他外部因素,这真的很简单吗?

$config = array(
    "digest_alg" => "sha512",
    "private_key_bits" => 4096,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);

$res = openssl_pkey_new($config);
openssl_pkey_export($res, $privKey);
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];

openssl_public_encrypt('this was encrypted with the public key', $secret, $pubKey);
openssl_private_decrypt($secret, $decrypted, $privKey);

echo "Decrypted message: $decrypted

1 个答案:

答案 0 :(得分:5)

  

出于这个问题而忽略密钥管理和其他外部因素,真的这么简单吗?

对于简短的输入,获取通常可以正常工作的代码?是的。

获取可以任意长度输入的安全代码?我们都不都希望!但是,不。

为了娱乐,请尝试使用此代码加密整个博客文章。如果您的博客帖子长于一条推文,那将很难失败。

        query ($query: Int) {
            Page {
                media(isAdult: false, popularity_greater: $query, type: ANIME) {
                    id
                    title {
                        english
                    }
                    episodes
                    startDate {
                        day
                        month
                        year
                    }
                    endDate {
                        day
                        month
                        year
                    }
                    genres
                    popularity
                }
            }
        }

这将输出seasonYear,因为消息大小为significantly longer than what RSA allows

您可能会想将消息分成多个块,然后独立解密。邮件可以随意删除或重新排序,并且仍会解密。这在语义上是不安全的。

此外,默认填充模式(PKCS#1 v1.5)容易受到an attack that dates back to 1998的攻击。<​​/ p>

因此,如果您想在PHP中使用非对称密码 而没有严格的限制或容易受到过多的旁通道攻击,那么您最终需要执行以下操作之一:

  1. Use libsodium(PHP 7.2+)。
  2. 设计使用安全填充模式(RSAES-OAEP)或实现the Anti-BB'98 dance的混合AES + RSA密码系统。

因此,从本质上讲:是的,您的示例代码是“您需要做的所有事情”,以获取有效的代码。但是,使RSA安全是一项艰巨的努力,这是不容忽视的。

最后,如果有疑问,请雇用密码学家。