Domanda

Ho una piccola stringa di alcuni dati (meno di 1 kb) che mi piacerebbe avere gli interpreti passano ad altri siti quando vengono inviati dal mio sito. Affinché gli altri siti per verificare che ero quello che ha creato la stringa ho pensato due opzioni.

  1. Il server di ping Me Back per confermare (come paypal, OpenID, ecc ..)
  2. Io uso le chiavi pubbliche / private per dimostrare che ho inviato il messaggio (come PGP, DKIM, ecc ..)

Non voglio configurare HMAC perché ciò significherebbe che devo utilizzare i tasti personalizzati per ogni sito che sarebbe un dolore.

Da quelle due scelte sembra che # 2 farebbe risparmiare sulla larghezza di banda, che fa sembrare come una scelta migliore.

Così come si può chiave di installazione pubblica / privata di crittografia utilizza PHP e ci sono dei lati negativi?

È stato utile?

Soluzione

I creerebbe S / MIME / coppie di chiavi pubbliche private che utilizzano OpenSSL e quindi utilizzare il comando OpenSSL per fare la crittografia e la decrittografia. Credo che questo sia superiore a usare PGP perché OpenSSL è incluso con la maggior parte dei sistemi operativi Linux e PGP non è. OpenSSL è anche basato su standard e generalmente più facile da lavorare, una volta che hai i comandi verso il basso.

Ho consigliato contro una soluzione "puro-PHP" (per puro-PHP intendo fare il cripto in PHP, piuttosto che utilizzare PHP per chiamare una libreria esistente o un eseguibile separato). Non si vuole fare crypto rinfusa in PHP. Troppo lento. E si desidera utilizzare OpenSSL, perché è ad alte prestazioni e la sicurezza è ben compreso.

Ecco la magia.

Per effettuare una chiave X.509:

$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

che mette la chiave privata nel mycert.key e la chiave pubblica in mycert.pem. La chiave privata non è protetto da password.

Ora, per firmare un messaggio con S / MIME:

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

Per crittografare un messaggio con S / MIME:

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

Per decifrare un messaggio con S / MIME:

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

Ho anche qualche demo su come usare OpenSSL dagli attacchi linguaggio C, ma non da PHP.

Altri suggerimenti

La creazione di una coppia di chiavi pubblica e privata utilizzando le funzioni di PHP OpenSSL:

// 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"];

È quindi possibile crittografare e decrittografare utilizzando le chiavi pubbliche e private in questo modo:

// 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";

Regola 1:. Non implementare da soli, utilizzare una libreria

Quale biblioteca? Ecco la mia raccomandata pubblico-PHP le librerie di crittografia a chiave :

  1. Halite , dipende libsodium (ma sottolinea la semplicità e la facilità d'uso oltre alla sicurezza) .
  2. libsodium , da PECL
  3. EasyRSA , che implementa la crittografia a chiave pubblica e firme a chiave pubblica RSA sicure utilizzando nel modo più sicuro modalità (NON PKCS1v1.5, mai!)
  4. phpseclib , che PiggyBack EasyRSA fuori di.

In generale, ti consigliamo libsodium se la sicurezza è il vostro obiettivo. O se non si utilizza Halite è una questione di gusti.

PGP è una buona opzione - è attuata correttamente e completamente (cioè si ha poco spazio per gli errori di sicurezza con PGP). Penso questa domanda SO vi aiuterà con l'interfacciamento con GnuPG. La questione è se e come gli altri siti verificare la tua firma. È necessario conformarsi sia alle loro esigenze meccanismo di verifica o di fornire il proprio modulo che quei siti utilizzeranno per la verifica.

Inoltre è possibile che si può utilizzare OAuth o OpenID per identificare gli utenti in tali altri siti, ma io non sono un esperto in queste tecnologie.

ho scritto un esempio di cifrare e decifrare con openSSL in PHP e Python

http://glynrob.com/php/hashing-and-public -key-crittografia /

Github codice sorgente disponibile.

Non dimenticate che le esigenze chiave privata disponibile nel luogo di decrittazione per questo al lavoro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top