Pregunta

Tengo una pequeña cadena de algunos datos (menos de 1 kb) que me gustaría tener agentes de usuario pasan a otros sitios cuando se envían desde mi sitio. Para que los otros sitios para verificar que yo era el que creó la cadena I, aunque las dos opciones.

  1. El servidor pings ME volver a confirmar (como paypal, openid, etc ..)
  2. utilizo claves públicas / privadas para demostrar que envié el mensaje (como PGP, DKIM, etc ..)

No quiero fijar HMAC porque eso significaría que tengo que usar las teclas personalizadas para cada sitio que sería un dolor.

A partir de esas dos opciones parece que # 2 sería ahorrar en ancho de banda que lo hace parecer como una mejor opción.

¿Cómo puede la configuración de clave pública / privada criptografía usando PHP y hay alguna desventajas?

¿Fue útil?

Solución

Yo crearía S / MIME pares de claves públicas / privadas que utilizan OpenSSL y luego usar el comando de OpenSSL para hacer el cifrado y el descifrado. Creo que éste es superior al uso de PGP porque openssl se incluye con la mayoría de los sistemas operativos Linux y PGP no lo es. OpenSSL es también basada en estándares y generalmente más fácil trabajar con él, una vez que tenga los comandos abajo.

Me recomendó no una solución "pura-PHP" (por pura-PHP me refiero a hacer la criptografía en PHP, en lugar de utilizar PHP para llamar a una biblioteca existente o un ejecutable independiente). Usted no quiere hacer cripto mayor en PHP. Demasiado lento. Y desea utilizar OpenSSL, porque es de alto rendimiento y la seguridad se entiende bien.

Aquí está la magia.

Para hacer una llave 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

que pone la clave privada en mycert.key y la clave pública en mycert.pem. La clave privada no está protegido por contraseña.

Ahora, para firmar un mensaje con S / MIME:

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

Para cifrar un mensaje con S / MIME:

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

Para descifrar un mensaje con S / MIME:

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

También tiene algunas demostraciones sobre el uso de OpenSSL a partir de los enlaces de lenguaje C, pero no de PHP.

Otros consejos

Creación de un par de claves privada y pública utilizando las funciones 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"];

A continuación, puede cifrar y descifrar utilizando las claves privadas y públicas como esto:

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

Regla 1:. No implementan usted mismo, utilice una biblioteca

¿Qué biblioteca? Éstos son mi público-PHP recomendada bibliotecas de criptografía de clave :

  1. Halita , depende de libsodium (pero enfatiza la simplicidad y facilidad de uso además de la seguridad) .
  2. libsodium , desde PECL
  3. EasyRSA , que implementa cifrado de clave pública y firmas de clave pública RSA seguras usando en el más seguro modos (NO PKCS1v1.5, nunca!)
  4. phpseclib , que piggybacks EasyRSA fuera de.

En general, tendrá que libsodium si la seguridad es su objetivo. Aun cuando no se utiliza Halita es una cuestión de gusto.

PGP es una buena opción - que se aplique correctamente y por completo (es decir, se tiene poco espacio para errores de seguridad con PGP). Creo que esta pregunta SO le ayudará con la interfaz con GnuPG. La pregunta es si y cómo los otros sitios verificar su firma. Es necesario para ajustarse bien a sus requisitos mecanismo de verificación o proporcionar su propio módulo que estos sitios utilizarán para la verificación.

También es posible que usted puede usar OAuth o OpenID para identificar a los usuarios en esos otros sitios, pero no soy un experto en estas tecnologías.

He escrito un ejemplo de cifrado y descifrado con openSSL en PHP y Python

http://glynrob.com/php/hashing-and-public tecla-cifrado /

Github código fuente disponible.

No se olvide que las necesidades claves privadas que estén disponibles en el lugar de descifrado para que esto funcione.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top