Question

J'ai une petite chaîne de certaines données (moins de 1kb) que je voudrais avoir les agents utilisateurs passent à d'autres sites quand ils sont envoyés à partir de mon site. Pour les autres sites afin de vérifier que je suis celui qui a créé la chaîne I bien que de deux options.

  1. Le serveur me pings pour confirmer (comme paypal, Openid, etc ..)
  2. J'utilise les clés publiques / privées pour prouver que j'ai envoyé le message (comme PGP, DKIM, etc ..)

Je ne veux pas configurer HMAC parce que cela veut dire que je dois utiliser les touches personnalisées pour chaque site qui serait une douleur.

Sur ces deux choix, il semble que # 2 permettrait d'économiser de la bande passante qui fait paraître comme un meilleur choix.

Alors, comment pouvez-vous la cryptographie à clé publique / privée de configuration en utilisant PHP et y at-il des inconvénients?

Était-ce utile?

La solution

Je voudrais créer S / MIME publics / privés utilisant OpenSSL paires de clés, puis utilisez la commande OpenSSL pour faire le chiffrement et le déchiffrement. Je crois que c'est supérieur à l'aide de PGP, car OpenSSL est inclus avec la plupart des systèmes d'exploitation Linux et PGP n'est pas. OpenSSL est également fondé sur des normes et généralement plus facile de travailler avec, une fois que vous avez les commandes vers le bas.

Je recommande contre une solution « pure-PHP » (par pur PHP que je veux dire faire le Crypto en PHP, plutôt que d'utiliser PHP pour appeler une bibliothèque existante ou d'un exécutable séparé). Vous ne voulez pas faire Crypto en vrac en PHP. Trop lent. Et vous voulez utiliser OpenSSL, car il est la haute performance et la sécurité est bien comprise.

Voici la magie.

Pour une touche 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

qui met la clé privée dans mycert.key et la clé publique dans mycert.pem. La clé privée n'est pas protégé par mot.

Maintenant, pour signer un message avec S / MIME:

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

Pour chiffrer un message avec S / MIME:

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

Pour déchiffrer un message avec S / MIME:

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

J'ai aussi quelques démos sur l'utilisation OpenSSL des liaisons en langage C, mais pas de PHP.

Autres conseils

Création d'une clé publique et privée paire en utilisant les fonctions 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"];

Vous pouvez ensuite chiffrer et déchiffrer à l'aide des clés publiques et privées comme ceci:

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

Règle 1:. Ne pas mettre en œuvre vous-même, utilisez une bibliothèque

Quelle bibliothèque? Voici mon PHP recommandé public- clés bibliothèques de cryptographie :

  1. Halite , dépend de libsodium (mais souligne la simplicité et la facilité d'utilisation, en plus de la sécurité) .
  2. libsodium , de PECL
  3. EasyRSA , qui met en œuvre le chiffrement à clé publique et sécurité signatures à clé publique RSA dans le plus sécurisé modes (pas PKCS1v1.5, jamais!)
  4. phpseclib qui EasyRSA hors de se greffe.

En général, vous aurez envie libsodium si la sécurité est votre objectif. Que vous utilisiez ou non Halite est une question de goût.

PGP est une bonne option - il est mis en œuvre correctement et complètement (ce que vous avez peu de place pour les erreurs de sécurité avec PGP). Je pense que cette question de SO vous aidera à interfacer avec GnuPG. La question est de savoir si et comment les autres sites seront vérifier votre signature. Vous devez se conformer soit à leurs exigences de mécanisme de vérification ou de fournir votre propre module que ces sites utiliseront pour la vérification.

Il est également possible que vous pouvez utiliser OAuth ou OpenID pour identifier les utilisateurs sur les autres sites, mais je ne suis pas un expert dans ces technologies.

J'ai écrit un exemple de chiffrement et de déchiffrement avec OpenSSL en PHP et Python

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

Github code source disponible.

Ne pas oublier que les besoins de clé privée soient disponibles à l'emplacement de décryptage pour que cela fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top