Frage

Ich habe eine kleine Kette von einigen Daten (weniger als 1 kb), dass ich mag Benutzeragenten zu anderen Seiten übergeben haben, wenn sie von meiner Website gesendet werden. Damit die anderen Seiten zu überprüfen, ob ich derjenige war, der die Saite habe ich allerdings von zwei Möglichkeiten.

  1. Der Server Pings mich zurück zu bestätigen (wie paypal, OpenID, etc ..)
  2. Ich benutze öffentliche / private Schlüssel zu beweisen, dass ich die Nachricht gesendet hat (wie PGP, DKIM, etc ..)

Ich will nicht, HMAC einrichten, denn das würde bedeuten, ich habe für jeden Standort individuelle Schlüssel verwenden, die ein Schmerz sein würde.

Von diesen beiden Möglichkeiten scheint es, dass # 2 würde auf Bandbreite sparen, die es wie eine bessere Wahl erscheinen läßt.

Wie können Sie Setup Public- / Private Key-Kryptographie mit PHP und gibt es irgendwelche Nachteile?

War es hilfreich?

Lösung

würde ich S / MIME öffentlichen / privaten Schlüsselpaaren mit OpenSSL erstellen und dann die OpenSSL-Befehl verwenden, um die Verschlüsselung und Entschlüsselung zu tun. Ich glaube, das überlegen ist PGP verwenden, weil openssl mit den meisten Linux-Betriebssystemen enthalten ist, und PGP ist nicht. OpenSSL ist auch auf Standards basierende und in der Regel einfacher zu arbeiten mit, wenn Sie die Befehle haben nach unten.

Ich empfahl gegen eine „pure-PHP“ Lösung (durch pure-PHP ich die Krypto in PHP meine tun, anstatt PHP unter Verwendung einer vorhandenen Bibliothek oder eine separate ausführbare Datei zu nennen). Sie wollen nicht Bulk-Krypto in PHP zu tun. Zu langsam. Und Sie wollen OpenSSL verwenden, da es eine hohe Leistung ist und die Sicherheit ist gut verstanden.

Hier ist die Magie.

Um einen X.509-Schlüssel zu machen:

$subj="/C=US/ST=California/L=Remote/O=Country Govt./OU=My Dept/CN=Mr. Agent/emailAddress=agent@investiations.com"
openssl req -x509 -newkey rsa:1024 -keyout mycert.key -out mycert.pem -nodes -subj $subj

Das bringt der private Schlüssel in mycert.key und der öffentliche Schlüssel in mycert.pem. Der private Schlüssel wird nicht durch ein Passwort geschützt.

Nun, eine Nachricht mit S / MIME zu unterschreiben:

openssl smime -sign -signer mycert.pem -inkey mycert.key <input >output

Um eine Nachricht mit S / MIME verschlüsseln:

openssl smime -encrypt -recip yourcert.pem <input >output

Um eine Nachricht mit S / MIME entschlüsseln:

openssl smime -decrypt -inkey mycert.key -certfile mycert.pem <input >output

Ich habe auch einige Demos auf OpenSSL aus den C-Sprachbindungen verwenden, aber nicht von PHP.

Andere Tipps

ein privates und öffentliches Schlüsselpaar erstellen die PHP Openssl Funktionen:

// Configuration settings for the key
$config = array(
    "digest_alg" => "sha512",
    "private_key_bits" => 4096,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);

// Create the private and public key
$res = openssl_pkey_new($config);

// Extract the private key into $private_key
openssl_pkey_export($res, $private_key);

// Extract the public key into $public_key
$public_key = openssl_pkey_get_details($res);
$public_key = $public_key["key"];

Sie können dann verschlüsseln und entschlüsseln mit den privaten und öffentlichen Schlüssel wie folgt aus:

// Something to encrypt
$text = 'This is the text to encrypt';

echo "This is the original text: $text\n\n";

// Encrypt using the public key
openssl_public_encrypt($text, $encrypted, $public_key);

$encrypted_hex = bin2hex($encrypted);
echo "This is the encrypted text: $encrypted_hex\n\n";

// Decrypt the data using the private key
openssl_private_decrypt($encrypted, $decrypted, $private_key);

echo "This is the decrypted text: $decrypted\n\n";

Regel 1:. Do it yourself nicht umsetzen, eine Bibliothek verwenden

Welche Bibliothek? Hier sind meine empfohlenen PHP öffentlich- Key-Kryptographie-Bibliotheken :

  1. Halit , hängt von libsodium (aber betont Einfachheit und Einfachheit der Anwendung zusätzlich zu Sicherheit) .
  2. libsodium von PECL
  3. EasyRSA , die Geräte sichere Public-Key-Verschlüsselung und Public-Key-Signaturen mit RSA in den sichersten Modi (NICHT PKCS1v1.5, überhaupt!)
  4. phpseclib , die EasyRSA huckepack aus der.

In der Regel sollten Sie libsodium, wenn die Sicherheit Ihr Ziel. Unabhängig davon, ob Sie Halit verwenden ist eine Frage des Geschmacks.

PGP ist eine gute Option - es richtig umgesetzt wird und vollständig (das heißt Sie haben wenig Raum für Sicherheit Fehler mit PGP). Ich denke, mit GnuPG mit Schnittstellen helfen. Die Frage ist, ob und wie die anderen Seiten Ihrer Unterschrift bestätigen wird. Sie müssen entweder auf ihre Verifikationsmechanismus Anforderungen entsprechen oder Ihr eigenes Modul zur Verfügung stellen, dass diese Websites zur Überprüfung verwenden.

Es ist auch möglich, dass Sie OAuth oder OpenID können Anwender auf diesen anderen Websites zu identifizieren, aber ich bin kein Experte in diesen Technologien.

Ich habe ein Beispiel für die Verschlüsselung geschrieben und Entschlüsseln mit openSSL in PHP und Python

http://glynrob.com/php/hashing-and-public -Taste-Verschlüsselung /

Github Quellcode zur Verfügung.

Vergessen Sie nicht, dass die privaten Schlüssel muss an der Stelle der Entschlüsselung für diese Arbeit zur Verfügung stehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top