2011-01-05 10 views
17

O: ¿Cómo almacenar datos cifrados para un grupo de usuarios?¿Es posible tener cifrado con múltiples claves privadas (PHP)?

Admito que es una pregunta tonta, una clave privada está limitada a una sola persona, como el término ya lo implica. Pero tengo la siguiente situación:

El usuario Tom ingresa los datos que deben almacenarse cifrados en una base de datos. El usuario decide que quiere que esta información esté disponible para Jim y Bob. Los usuarios John y Jayne no deben poder descifrarlo. Por supuesto, tampoco para el usuario Tim, que hackeó el servidor y tiene acceso a los datos cifrados y las secuencias de comandos que hacen el cifrado/descifrado.

Creo que el enfoque de clave pública/clave privada con la función PHP openssl_public_encrypt no funcionará aquí ya que dos usuarios necesitan tener esa clave "privada" para descifrar los datos.

Supongo que esta es una pregunta bastante general, pero si es importante, debe hacerse en PHP (y tal vez en MySQL).

Respuesta

14

Así es como se hace en OpenPGP (y, otros sistemas): - está generando una clave simétrica secreta, que se utiliza para encriptar los datos en sí; - luego, esta clave simétrica se cifra con la clave de Tom; - también, la clave simétrica se puede cifrar con la clave pública de Jim y Bob, lo que les permite descifrar la clave y luego descifrar los datos

+0

Gracias - Elegiré esto como respuesta aceptada ya que los demás básicamente recomiendan lo mismo y usted fue el primero. ¡Gracias a todos! – acme

3

No conozco las bibliotecas en PHP. Pero en general, el procedimiento es el siguiente:

  • Los datos se cifran utilizando una clave simétrica
  • Para cada destinatario, clave se cifra utilizando la clave pública del destinatario
  • Todo esto se guarda en un archivo PKCS # 7 estructura de archivos

debe haber algunos resultados al buscar "PHP y PKCS7" ...

+0

La función 'openssl_seal()' en PHP realiza esto (aunque no produce la salida PKCS # 7). – caf

2

Usar una clave de cifrado de datos (lo llaman Kgeneral) que es distinta de la clave de Tom.

Encripta Kgeneral con la clave pública de Tom y dale el resultado a Tom; puede usar su clave privada para descifrarlo y obtener Kgeneral.

Si otro usuario necesita acceso a los datos, Tom (o su aplicación) puede encriptar Kgeneral con su clave pública y darle acceso de esa manera.

11

PHP proporciona una función para esto - openssl_seal(). Esta función toma una matriz de claves públicas y encripta los datos para que cualquiera de las claves privadas correspondientes se pueda usar para descifrarla (usando openssl_open()).

+0

Entiendo que esta función toma una matriz de claves públicas de destinatarios, pero ¿qué ocurre con la clave privada y pública del remitente? ¿Esta función genera una aleatoria e inserta la clave pública del remitente en los datos sellados? –

+0

@DawidGrzesiak: La función 'openssl_seal()' no firma los datos, por lo que no requiere las claves del remitente. Puede usar ['openssl_sign()'] (http://php.net/openssl_sign) para firmar el resultado de 'openssl_seal()'. – caf

Cuestiones relacionadas