1

我需要使用第三方提供给我的公钥在 MediaWiki 环境中对一个小字符串/令牌进行 PGP 加密和 ASCII 保护。这给了我:

  • 需要使用PHP
  • 最好远离 exec_shell() ...真的吗?
  • 网络服务器环境

我打算在阅读后使用 GnuPG lib:http: //devzone.zend.com/1278/using-gnupg-with-php/

哪些用户应该将 PGP 公钥存储在他们的 .gnupg 文件夹中?


更新 1

到目前为止,我正在测试硬编码公钥(现在,只是为了测试它)

// GnuPG stuff
putenv("GNUPGHOME=/tmp");
$pubkey = "-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.2.6 (GNU/Linux)
...key...
-----END PGP PUBLIC KEY BLOCK-----";

$ token="some text";
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION); 

try 
{
    $info = $gpg->import($pubkey);
//  var_dump($info); // to see fingerprint
    $info = $gpg -> addencryptkey("...fingerprint...");
    $enc = $gpg -> encrypt($token);
} 
catch (Exception $e) {
    echo 'ERROR: ' . $e->getMessage();
}


$token = urlencode($enc);
echo $token, "\n";

它似乎加密了,现在我只需要弄清楚我是否需​​要/可以剥离

Encrypted Data: -----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.5 (GNU/Linux)

因为我正在加密 URL 的令牌

4

2 回答 2

3

可以使用 PHP 的gnupg-functions启用 Ascii 装甲输出。看看setarmor

添加这一行,最好在创建$gpg对象后直接添加:

$gpg -> setarmor(1);

但是文档说 ascii 装甲将是默认的;你得到什么输出,你想要什么?邮寄时发送ASCII装甲很方便;否则你通常直接选择较小的二进制格式。从未见过剥离“标题”的 ascii 装甲 OpenPGP。


对于您的小问题:

最好远离 exec_shell() ...真的吗?

如果它无论如何都被禁用,则没有决定。只要 PHP 的 gnupg-functions 具有您需要的所有功能,就更喜欢它们;它们将您从麻烦的 gpg 接口中解脱出来(没有直接的 API,只有命令行工具)。引入任何漏洞的机会也更小。

哪些用户应该将 PGP 公钥存储在他们的 .gnupg 文件夹中?

为网络服务器选择一个可读(可能不可写?)但无法使用 HTTP 访问的任意文件夹(因此没有人能够获取您的密钥)。看来您已经意识到如何设置此路径。

它似乎加密了,现在我只需要弄清楚我是否需​​要/可以剥离

[剪辑]

我会为此使用一些正则表达式。

preg_match('/[\n\r]([=\n\r[:alnum:]]+)[\n\r]/', $token, $matches);

应该做; 将所有行剥离为空或包含斜杠或冒号可能更优雅。

于 2013-01-10T22:03:21.740 回答
1

在基本级别上,请尝试以下代码。它没有添加 ASCII 装甲,但它确实将它变成了一种屏幕友好(非二进制)格式,您可以轻松地为自己装甲。

<?php
$data = 'Secret info';
$encrypted = null;
$ok = openssl_public_encrypt($data, $encrypted, $pubKey);

if ($ok) {
    // Optionally, encode it so you can echo it onscreen
    $encrypted = base64_encode($encrypted);
    echo $encrypted . "\n";
} else {
    echo "Failed to encrypt\n";
}

我不知道您是否可以将 PGP 公钥直接导入 OpenSSH,但如果需要,此答案可能会帮助您在密钥格式之间进行转换。

于 2013-01-10T21:02:15.097 回答