1

サードパーティから提供された公開鍵を使用して、MediaWiki環境内で小さな文字列/トークンをPGP暗号化およびASCIIアーマーする必要があります。これは私に与えます:

  • PHPを使用する必要があります
  • exec_shell()から離れた方がいい... true?
  • Webサーバー環境

これを読んだ後、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を使用して有効にできます。をご覧くださいsetarmor

$gpg次の行を追加します。おそらく、オブジェクトを作成した直後に最適です。

$gpg -> setarmor(1);

しかし、ドキュメントには、ASCIIアーマーがデフォルトになると書かれています。どのような出力が得られ、どれが必要ですか?郵送するときは、ASCII装甲を送ると便利です。それ以外の場合は、通常、小さいバイナリ形式を直接選択します。「ヘッダー」が削除されたASCII装甲OpenPGPは見たことがありません。


あなたの小さな質問に:

exec_shell()から離れた方がいい... true?

とにかく無効にされている場合、それについての決定はありません。PHPのgnupg-functionsが必要なすべての機能を備えている限り、それらを優先してください。それらは、gpgとの面倒なインターフェースからあなたを救います(直接のAPIはありませんが、コマンドラインツールがあります)。エクスプロイトを導入する可能性も低くなります。

どのユーザーがPGP公開鍵を.gnupgフォルダーに保存する必要がありますか?

Webサーバーで読み取り可能(書き込み可能ではない可能性がありますか?)であるが、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 に答える