2010-06-04 12 views
7

Estoy creando un sistema de licencias cuando los clientes solicitan una licencia a mi servidor y les envío una licencia si se les permite tener una.Confundido sobre el cifrado con claves públicas y privadas (que se usarán para el cifrado)

En mi sistema actual encripto la licencia usando una sola clave privada y tengo la clave pública integrada en la aplicación cliente que usan para descifrar la licencia. ¡Funciona!

Otros me han dicho que debo encriptar con la clave pública en el servidor y distribuir la clave privada a los clientes. He buscado en la web y puedo ver que a veces usan la clave privada para encriptar y otras veces usan la clave pública para encriptar.

En este caso, ¿qué se supone que debo hacer?

Respuesta

8

Otros me han dicho que debería ser el cifrado con la clave pública del servidor y distribuir el clave privada para los clientes.

Esas personas están equivocadas. El nombre clave privada implica que es privado, lo que significa que solo usted debe tener acceso a él.

En este caso, ¿qué se supone que debo hacer?

Usar firmas digitales. Firme el archivo de licencia con su clave privada y use su clave pública en su aplicación para verificar que la firma de la licencia proviene de usted.

+1

Esto está mal. Para el cifrado asimétrico, encripta con la clave pública del destinatario. –

+1

@Matthew No dije lo contrario. Dije que no * debería * estar distribuyendo su clave privada. – Kevin

+0

entonces en mi caso, ¿qué debería estar haciendo? Suponiendo que utilizaré la misma clave pública y privada para todos los clientes. – jax

0

Si usa cifrado público-privado (asimétrico), siempre encripta con la clave pública del destinatario, que descifra con su clave privada. Para las firmas digitales, usted firma con su clave privada y el destinatario verifica la firma con su clave pública.

Surge la pregunta, ¿cómo se hace un sistema de DRM seguro? Si usa el cifrado y les da a los destinatarios una clave privada, pueden distribuir la clave o el contenido descifrado. Si usa firmas, simplemente pueden quitar la parte de verificación de firma de su programa.

La respuesta es que es imposible. El concepto de DRM es fundamentalmente defectuoso.

1

Si está encriptando algo que solo debe leer un único destinatario, encripte con la clave pública de ese destinatario y use su clave privada para leerlo.

Si está cifrando para varios destinatarios, puede encriptar con su clave privada y distribuir su clave pública a las que desee poder leer. Esto generalmente se llama "firma" ya que cualquiera que tenga acceso a su clave pública puede leerla, por lo que no es realmente una forma de comunicación privada.

Una solución general más sólida para usted sería que su aplicación genere un par de claves por instalación, envíe la clave pública que generó de vuelta al servidor, que luego usaría para cifrar para que solo esa única instalación pudiera use la licencia que creó (descifrándolo con su clave privada).

+0

La firma no es encriptación, punto. Las personas pueden leer el mensaje incluso sin su clave pública. Solo necesitan eso para verificar la firma. Y no hay nada en su "solución robusta" para evitar que las personas compartan claves privadas. –

+0

Matthew, necesita la clave pública para verificar el mensaje. –

+0

@ Matthew- Dije "más robusto", es una afirmación relativa, no absoluta. Como notó en su respuesta, cualquier DRM está condenado al fracaso si alguien quiere eludirlo lo suficiente, la idea es mantener a las personas casuales honestas, no ser completamente seguras. – Donnie

1

Al menos en un algoritmo de cifrado de clave pública típico (por ejemplo, RSA) no existe realmente una gran diferencia entre la clave pública y la privada. Cuando genera claves, obtiene dos claves.Usted mantiene una privada y publica la otra, pero no importa mucho cuál publique y cuál mantenga privada.

Cualquier cosa que cifre con una clave se puede descifrar con la otra tecla. Para fines normales, publica una clave, que permite a cualquier persona encriptar algo que solo usted puede descifrar. Desde un punto de vista técnico, el reverso funciona bien: si encriptas algo con tu clave privada, cualquiera que tenga la clave pública puede descifrarla. Esto normalmente se usa para cosas como la verificación de firma (es decir, cualquier persona con la clave pública puede verificar que la firma tuvo que haberse creado con la clave privada). Sin embargo, normalmente quiere usar pares de claves separadas para el cifrado y la firma.

Para su caso, está abierto a algunas preguntas lo que realmente va a lograr. Ciertamente puede encriptar algunos datos necesarios para usar el programa, por lo que el usuario necesita la clave para descifrarlo y usar el programa, pero si el usuario está dispuesto a dar una copia del código a una persona no autorizada, es probable que gane 'dude en darles una copia de la clave también. Como tal, a pesar de que el cifrado/descifrado hará su trabajo, es poco probable que brinde una protección real.

Un sistema de licencias más típica está ligada a algo así como una dirección IP específica, por lo que algo así como el cifrado de la dirección IP, a continuación, utilizar el resultado como una clave para descifrar los datos necesarios para utilizar el programa. Si la dirección IP es incorrecta, los datos no se descifrarán correctamente y el programa no funcionará. Siempre que el usuario tenga una dirección IP estática, esto puede funcionar bien, pero causará problemas junto con DHCP.

Mi consejo inmediato sería simplemente no hacer esto en absoluto. Si insiste en hacerlo de todos modos, no lo haga usted mismo, obtenga algo como FlexNet para manejarlo por usted. Es mejor sin él, pero al menos de esta manera obtendrás algo que tipo de funciona, y no perderás tiempo y esfuerzo en ello que podría ser mejor para mejorar tu software.

+1

Me encontré con esto por casualidad dos años después, y quiero señalar que Jerry está equivocado aquí; importa la clave que guardes en secreto. Dada la clave privada de RSA, puede calcular la clave pública. Nunca des la clave privada. Cf. http://stackoverflow.com/questions/696472/given-a-private-key-is-it-possible-to-derive-its-public-key –

4

Enhorabuena, acaba de inventar la firma RSA. (Que es lo que debe usar, de todos modos.) Para comunicarse con un sistema de clave pública, necesita usar la clave privada una vez y la clave pública una vez, pero RSA admite dos órdenes diferentes: 1) Encriptar con la clave pública, descifrar con lo privado: el destinatario no sabe nada sobre el origen del mensaje, pero el remitente sabe que solo el destinatario (el titular de la clave privada) puede leerlo. Este es el "cifrado" clásico. 2) "Encriptar" con la clave privada, luego "descifrar" con el público. Esta es una firma digital y proporciona la autenticación . Cualquiera puede leer el mensaje, pero solo el titular de la clave privada podría haberlo enviado.

Suponiendo que su licencia está personalizada para el cliente (que podría ser tan simple como incluir una copia de un número aleatorio generado por el cliente), entonces es inútil para cualquier otra persona, pero el cliente puede estar seguro de que el servidor la envió.

La simetría no es tan clara en la práctica; los diferentes modos de operación tienen diferentes puntos débiles y errores, por lo que la implementación suele ser significativamente diferente, pero esa es la idea general.

Una de las primeras y más importantes lecciones en criptología es comprender la autenticación y cuándo usarla. Se necesita al menos tan a menudo como el cifrado, y no saber cuándo usarlo lo deja en una situación Midvale School for the Gifted.

0

Espero que este enlace desde wikipedia ayude. PKI se basa en la confianza mutua. Sin embargo, la clave privada debe ser protegida por el propietario. Público como su nombre lo indica está abierto a todos. Toda la arquitectura se hace para ayudar al escenario como se definió anteriormente en su pregunta.

Cuestiones relacionadas