Cifrado y descifrado entre PHP y Java

Estoy tratando de hacer un script PHP para interactuar con una aplicación Java. Ellos compartirán alguna información, así que me gustaría encriptar los datos que se pasan entre ellos para que sean lo más seguros posible, además de tener un certificado SSL. Sin embargo, debido a que mi sitio web solo está en un servidor compartido en JustHost, hasta donde yo sé, no puedo usar el módulo PHP 'mcrypt', así que no estoy seguro de cómo hacerlo para que tanto mi aplicación Java como el script PHP puedan cifrar los datos que se envían y descifrar los datos que se reciben.

preguntado el 27 de agosto de 11 a las 15:08

¿Por qué no se conforma con un sistema de cifrado estándar (por ejemplo, RSA) y utiliza sus implementaciones en PHP y Java? Como por ejemplo, pear.php.net/package/Crypt_RSA y javamex.com/tutorials/cryptography/rsa_encryption.shtml ? -

@Rafael: si mcrypt no es una opción, es muy probable que Crypt_RSA no lo sea (también tiene dependencias en módulos externos). Por cierto, RSA no se debe utilizar para el cifrado de datos, sino más bien para el protocolo de enlace y negociar una clave secreta común. -

@Andy: ¿Ya usa SSL para comunicarse entre las aplicaciones? Si es así, ¿por qué desea agregar una capa de cifrado adicional? SSL es suficiente. -

@Rafael: Gracias por la respuesta. Sin embargo, como señaló JB Nizet, el problema es que desafortunadamente no puedo instalar ningún módulo externo para PHP ...

@Andy El lugar de donde obtiene el certificado tiene poco que ver con la solidez del cifrado en sí. Además, la verdadera razón por la que SSL existe es para que no pueda "secuestrar" los datos que están en transporte; agregar esta capa adicional es innecesario y probablemente sea una molestia trabajar con él. Para empezar, ¿cómo vas a intercambiar claves entre PHP y Java? -

1 Respuestas

Su conversación SSL entre Java y PHP protegerá sus datos mientras está en tránsito. Si protege adecuadamente la clave privada con una contraseña segura (más de 10 símbolos) y se asegura de que sus algoritmos sean sólidos, nadie podrá romperla fisgoneando en la conversación.

No obtendrá ninguna protección adicional al cifrar los datos antes de enviarlos a través de la conversación SSL. Y en realidad, podría estar debilitando su seguridad porque para poder cifrar los datos, tendrá que compartir alguna clave si elige el cifrado simétrico. Y, al intercambiar claves secretas, está deshaciendo gran parte de la protección que SSL le brinda porque el gran beneficio de SSL es el hecho de que podemos cifrar datos sin acordar una clave secreta. Si estuviera intentando acceder a su texto cifrado, atacaría a su cliente porque es más fácil encontrar su clave de cifrado simétrica que romper SSL. Y aunque podría utilizar el cifrado asimétrico, básicamente estará reinventando SSL.

Me enfocaría en asegurarme de que su conversación SSL sea sólida. Usando solo el cifrado simétrico más fuerte: TripleDES, IDEA, AES si su servidor lo admite. Elimine los algoritmos más débiles para que las conversaciones no puedan utilizar el cifrado más débil. Genere más de 1024 pares de claves públicas / privadas. Puede que eso no siempre sea fácil en su servidor compartido, pero su aplicación Java solo puede optar por usar TripleDES, IDEA y AES.

Asegúrese de validar el certificado del servidor en el lado del cliente para asegurarse de no hablar con un servicio falso. Eso básicamente significa tomar el certificado del servidor y agregarlo al almacén de claves utilizado en el cliente. Si eso es Java, puede usar keytool para importar un certificado y usar ese almacén de claves como su TrustManager / KeyManager en su conversación SSL.

Si desea cifrar los datos después de que se haya repasado la conversación SSL, puede cifrar / descifrar solo en el servidor. Pero todavía tiene un problema de gestión de claves. Si cifra / descifra, ¿cómo piensa proteger la clave secreta en el servidor? Ese es siempre el feo problema que no tiene una respuesta sencilla.

Respondido 27 ago 11, 21:08

Sí, tienes razón, AES sería lo mejor, pero no creo que Apache lo admita de inmediato. Gracias por mencionarlo. Lo agregué a la respuesta por si acaso. - chubbsondubs

@chubbard: perdón por la demora en la respuesta y muchas gracias por tu respuesta. Definitivamente me conformaré con la seguridad de mi certificado SSL ahora; Estoy muy contento de que me advirtiera que podría comprometer mi SSL agregando otra capa de cifrado, ¡especialmente porque no soy un experto en PHP en el mejor de los casos! También me ha hablado sobre la importación del certificado en mi aplicación Java, que es algo que no sabía que debía hacer y definitivamente lo investigaré, ¡así que también le agradezco por eso! (¡Pensé que era un simple caso de poner https no http) - Andy

Desafortunadamente, no estoy seguro de tener el tiempo o el conocimiento para comenzar a asegurarme de que mi "conversación SSL" sea sólida en este momento, pero estoy pensando en invertir en un servidor dedicado, etc., en un futuro cercano, así que espero eso me permitirá llevar la seguridad al siguiente nivel ... - Andy

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.