4

PHPスクリプトの文字列にテキストのGPGクリア署名を組み込むことを試みています。GPGに次のような文字列のテキストを暗号化させることができます:

$encrypted = shell_exec("echo '$text' | gpg -e -a -r foo@bar.com --trust-model always");

これは完全に機能し、暗号化されたテキストが$encrypted変数に送信されます。これは、GNUPGHOMEとGNUPGが正しく設定されていることを証明します。

ただし、これと同じ方法で明確に署名されたメッセージを生成しようとすると、次のようになります。

$text = "googar";

$signature = exec("echo $passphrase | gpg -v --clearsign --no-tty --passphrase-fd 0 '$text' 2>&1 1> /dev/null", $output);

このエラーが返されます:

... string(51) "gpg: can't open `googar': No such file or directory"
[3]=>
string(46) "gpg: googar: clearsign failed: file open error"
}

このエラーは、$text変数を一重引用符で囲む場合と付けない場合で返されます。

GPGまたはshell_execに、ファイルを探す代わりに$ textをパイプとして処理させるにはどうすればよいですか?

この方法でパスフレーズをエコーする必要があります(GPGにはコマンドラインで変数としてパスフレーズを渡す方法がないため、「ひどく安全ではありません」。

4

2 に答える 2

5

proc_openを使用して、パスワード用に別のファイル記述子を作成できます。

$descriptorspec = array(
    0 => array("pipe", "r"),
    1 => array("pipe", "w"),
    2 => array("pipe", "w"),
    3 => array("pipe", "r"),
);

$pipes = false;
$process = proc_open("gpg -v --clearsign --no-tty --passphrase-fd 3", $descriptorspec, $pipes);

if(is_resource($process)) {
    fwrite($pipes[3], $passphrase);
    fclose($pipes[3]);

    fwrite($pipes[0], $text);
    fclose($pipes[0]);

    $output = stream_get_contents($pipes[1]);
    $stderr = stream_get_contents($pipes[2]);

    fclose($pipes[1]);
    fclose($pipes[2]);

    $retval = proc_close($process);

    echo "retval = $retval\n";
    echo "output= $output\n";
    echo "err= $stderr\n";
}
于 2011-08-08T13:35:59.950 に答える
2

プロセス置換を使用できます。

echo $passphrase | gpg -v --clearsign --no-tty --passphrase-fd 0 <(printf '$text') 2>&1 1> /dev/null
                                                                 ^^              ^

これにより、gpgはファイルからデータを読み取っていると見なしますが、ファイルは一時的な名前付きパイプになり、入力はになりますprintf '$text'

于 2011-08-08T13:20:17.827 に答える