Ich möchte die PGP-Verschlüsselung verwenden, um CSV-Dateien zu verschlüsseln, die ich über ein PHP-Skript erzeuge und diese Datei dann per E-Mail an den Client sende. Der Client gibt mir den Verschlüsselungsschlüssel, den ich für Verschlüsselungsdateien verwenden muss.
Ich habe über PGP gegoogelt und festgestellt, dass es ziemlich gut für den Datenschutz ist, außerdem habe ich OpenPGP gefunden http://www.openpgp.org/ und GnuPG http://www.gnupg.org/ Was sind diese beiden Arten von PGP? und welche soll ich verwenden?
Wie kann ich eine Datei mit PGP in PHP mit dem Schlüssel verschlüsseln, den mein Client bereitstellt?
Ich habe diesen Begriff zum ersten Mal gehört, kann mir bitte jemand helfen, dies zu verstehen und in PHP zu implementieren.
Frage 1: Über PGP
- PGP (Pretty Good Privacy) ist ein Produkt und Warenzeichen der Symantec Corporation (sie haben es vor einigen Jahren gekauft).
- OpenPGP ist der von PGP verwendete Standard.
- GnuPG (Gnu Privacy Guard) ist eine kostenlose Open-Source-Implementierung von PGP.
Was Sie also tun möchten, ist zu verschlüsseln OpenPGP Schlüssel. Welche Implementierung von OpenPGP Ihr Client verwendet, um die Daten zu entschlüsseln, ist für Sie nicht wichtig. Bei PHP wird üblicherweise GnuPG verwendet und es sind Schnittstellen eingebaut.
Frage 2: Verwendung von GnuPG in PHP
Verwenden Sie die GnuPG-Schnittstelleeine Erweiterung, die für PHP installiert werden kann.
Importieren Sie zunächst den Schlüssel, wo $keydata
ist der gepanzerte öffentliche ASCII-Schlüssel:
<?php
$gpg = new gnupg();
$info = $gpg -> import($keydata);
print_r($info);
?>
Verwenden Sie dann diesen Schlüssel, um die Daten zu verschlüsseln, diesmal mit dem Fingerabdruck des Schlüssels des Clients:
<?php
$gpg = new gnupg();
$gpg -> addencryptkey("8660281B6051D071D94B5B230549F9DC851566DC");
$enc = $gpg -> encrypt("just a test");
echo $enc;
?>
Wenn Sie Dateien verschlüsseln möchten, lesen Sie sie und geben Sie sie weiter encrypt()
. Verwenden Sie mindestens lange Schlüssel-IDs (z. DEADBEEFDEADBEEF
), bessere Fingerabdrücke (wie im Beispiel) beim Referenzieren von Schlüsseln; und Verwenden Sie niemals kurze Schlüssel-IDs (DEADBEEF
), da diese anfällig für Kollisionsangriffe sind.
Das ist mehr umfassendes Beispiel für beides von einem Benutzer im PHP-Handbuch hinzugefügt.
Ich werde hier eine Antwort hinterlassen, da viele Beispiele im Netz für PHP GnuPG sehr nackte Knochen sind und dies hoffentlich jemandem etwas Frust erspart.
Im Grunde spiegelt es die Funktionsweise des GnuPG-Befehlszeilentools wider. Sie müssen einen Schlüssel importieren, wenn er sich nicht bereits im Schlüsselring von gpg befindet, dann müssen Sie den Schlüssel des Empfängers auswählen, der für die Verschlüsselung/Entschlüsselung verwendet werden soll.
gpg --import recipients-public-key.asc
gpg -r recipient --encrypt test.txt
Wenn Sie das getan haben, was ich getan habe, und den Schlüssel als Empfänger übergeben, funktioniert es nicht!
Es ist nicht klar, was dieses Feld in beiden ist GPG-Handbuch oder PHP-Dokumentation was dieses Feld als “Fingerabdruck” bezeichnet. Überprüfen Sie den Schlüsselring von gpg auf Ihren frisch importierten Schlüssel mit:
gpg --list-keys
Dies wird ungefähr so ausgeben:
pub rsa2048 2019-04-14 [SC] [expires: 2021-04-14]
0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA
uid [ultimate] Dean Or
sub rsa2048 2019-04-14 [E] [expires: 2021-04-14]
Dadurch erhalten Sie die UID und in der zweiten Zeile den Fingerabdruck, der jedem Schlüssel zugeordnet ist. Soweit ich das beurteilen kann, können Sie die UID und den Fingerabdruck als Empfänger verwenden.
Ihr zu verschlüsselnder PHP-Code könnte also so aussehen:
// Encrypt
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);
// Check key ring for recipient public key, otherwise import it
$keyInfo = $gpg->keyinfo('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA');
if (empty($keyInfo)) {
$gpg->import('recipients-public-key.asc');
}
$gpg->addencryptkey('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA');
echo $gpg->encrypt('This is a test!');
Dann sieht der Code des Empfängers so aus:
// Decrypt
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);
// Check key ring for recipient private key, otherwise import it
$keyInfo = $gpg->keyinfo('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA');
if (empty($keyInfo)) {
$gpg->import('recipients-private-key.asc');
}
$gpg->adddecryptkey('0DAA2C747B1974BE9EB9E6DCF7EE249AD00A46AA', '');
echo $gpg->decrypt($encyptedMessage);
Beachten Sie, dass die Fingerabdrücke für den öffentlichen und den privaten Schlüssel des Empfängers gleich sind.
Es gibt auch ein bekanntes Problem mit adddecryptkey, das keine Passphrase akzeptiert! Sie müssen entweder die Passphrase entfernen oder Ihre Version von GnuPG ändern.
.