Jak gpg šifrování pomocí PHP na platformě Windows, v rámci webového serveru?

hlasů
1

Snažím se dělat šifrování GPG na platformě Windows, v PHP, běh XAMPP.

Webový server Apache a běží PHP 5.2.9. Já používám GPG4Win 2.0.4.

Já jsem měl úspěch spuštění příkazu šifrování z příkazového řádku. Změnil jsem příjemce a názvy hostitelů.

C:\>C:\PROGRA~1\GNU\GnuPG\pub\gpg.exe --encrypt --homedir C:\DOCUME~1\reubenh.AD\APPLIC~1\gnupg --recipient name@host.com --armor < test.txt > test.enc.txt

V PHP, jsem pomocí proc_open (), takže můžu pipe obsah mají být šifrována přímo do procesu, a použít stdout potrubí chytit výstup.

Níže je fragment kódu:

    $cmd = Configure::read('Legacy.GPG.gpg_bin').' --encrypt '.
        '--homedir '.Configure::read('Legacy.GPG.gpg_home').' '.
        '--recipient '.Configure::read('Legacy.MO.gnugp_keyname').' '.
        '--local-user '.'me@host.com'.' '.
        '--armor --no-tty --batch --debug-all';

    error_log('Encrypting Command line is '.$cmd);

    $descriptors = array(
        0 => array('pipe', 'r'),
        1 => array('pipe', 'w'),
        2 => array('file', LOGS.'gpg.log', 'a')
    );

    $process = proc_open($cmd, $descriptors, $pipes);
    if (is_resource($process)) {
        error_log(print_r($pipes, true));
        list($stdin, $stdout) = $pipes;

        error_log('Have pipes');

        error_log('body length is '.strlen($this->request['body']));
        $ret = fwrite($stdin, $this->request['body'], strlen($this->request['body']));
        error_log($ret.' written');         

        error_log('before fclose()');                       
        fclose($stdin);

        error_log('Done with input');

        $encryptedData = '';
        while(!feof($stdout)) {
            $line = fgets($stdout);
            error_log('Line read:'.error_log(print_r($line, true)));
            $encryptedData .= $line; 
        }
        fclose($stdout);

        $return = proc_close($process);

        error_log('Encryption process returned '.print_r($return, true));

        if ($return == '0') { // ... next step is to sign

Vygenerovaný příkaz z příkazu první error_log () je:

C:\PROGRA~1\GNU\GnuPG\pub\gpg.exe --encrypt --homedir C:\DOCUME~1\reubenh.AD\APPLIC~1\gnupg --recipient name@host.com --local-user me@host.com --armor --no-tty --batch --debug-all

Samotný běh zdá se dostat tak daleko, jak „Už potrubí“. Po tom, to prostě zastaví.

Mohu také vidět v Process Explorer, že gpg.exe také založí gpg2.exe. Mám podezření, že je to gpg2.exe že nemám popisovač, čeká na vstup, nikoli původní gpg.exe, které jsem použil.

Snažil jsem se s odvoláním gpg2.exe přímo, ale dítě gpg2.exe stále třel.

Raději použijte proc_open (), a vyhnout se používání disk I / O poskytnutí obsahu a chytit výstup, protože to bude běžet na server, a proc_open () umožní, abych neobtěžoval generování unikátních souborů, a poté museli uklidit.

Položena 22/02/2011 v 02:24
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Já jsem skončil kompromisů, aby se roztok dostal na začátku „práce“, i když nejsem moc nadšený způsobem to bylo hotovo.

Problém se zdál být ve dvou částech.

První díl byl proces by přestat reagovat při pokusu o přihlášení a použijte volbu --passwd-fd. Kdybych opustil tuto volbu ven, tak bych dostat výzvu prostřednictvím interaktivního charakteru webového serveru, zadejte ji ručně, a všechno bude v pořádku. Řešením pro bezobslužné aplikace, je prostě nemají přístupové heslo. Viděl jsem doporučení na různých fórech GnuPG v tom smyslu, že pokud vaše heslo bude uloženo jako prostý text na stejném stroji jako soukromý klíč, pak můžete také obejít bez předstírání a nemají jeden. Žádné heslo pracuje pro tuto chvíli.

Druhá část byla, že vstup byl příliš velký. Magické číslo se zdála být 72 KB Jakékoli užitečné zatížení, které mají být šifrována větší než při použití proc_open a standardní trubka jen nezdálo pracovat. V důsledku toho jsem se rozhodl pro dočasné psaní užitečné zatížení do souboru, které mají být čteny proc_open. Viz následující:

$tmpfile = tmpfile();
fwrite($tmpfile, $this->request['body']);
fseek($tmpfile, 0);

$cmd = '...'; // similar to question command, but with --sign --encrypt and no --passphrase-fd

$descriptors = array(
    0 => $tmpfile,
    1 => array('pipe', 'w'),
    2 => array('file', LOGS.'gpg.log', 'a')
);

$options = array('bypass_shell' => true);

$process = proc_open($cmd, $descriptors, $pipes, null, null, $options);
if (is_resource($process)) {
    stream_set_blocking($pipes[1], 0);

    fclose($tmpfile);

    $encryptedData = '';
    $line = fgets($pipes[1]);
    while (!feof($pipes[1])) {
        $encryptedData .= $line;
        $line =fgets($pipes[1]);
    }

    fclose($pipes[1]);

    $return = proc_close($process);

    if ($return = '0') { 
        // success processing
    }        
}

I rozhodl se do seznamu () = $ trubky použít, protože pouze stdout potrubí by se skutečně vrátí v poli.

Jestli někdo měl má zkušenosti s GPG a PHP v prostředí Windows, tak bych být více než vítány něco slyšet, i když je to let po trati.

Odpovězeno 23/02/2011 v 06:10
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more