Seguridad en profundidad: división de claves en diferentes lugares

2

Yo uso el cifrado AES en un sitio web. En este momento, la clave se almacena en la fuente del script PHP que realiza el proceso de cifrado / descifrado gracias a openssl. Sé que no es seguro, así que quiero colocar partes de la clave en diferentes lugares:

  • primera parte en fuente PHP
  • segunda parte como variable de entorno del servidor
  • tercera parte como htaccess env var
  • otros lugares en caso de que les recuerde

Sé que este procedimiento no se agrega, al final, a la seguridad, pero dificulta un poco el cracking (considerando que no puedo usar dispositivos de hardware), porque el blackhat necesita obtener todas las partes , no solo la fuente de un script.

La pregunta es sobre la forma más segura de hacerlo.

  • dividir la contraseña en 3 partes, colocarlas en los diferentes lugares mencionados y unirlas cuando necesito la clave completa
  • combinándolos de otras maneras, como:

¿Qué piensas al respecto? Muchas gracias por tu útil ayuda

    
pregunta Surfer on the fall 15.11.2012 - 13:50
fuente

3 respuestas

6

Básicamente, lo que intentas hacer es crear una puerta trasera en la cuenta de cada usuario de manera que solo el usuario y un único usuario administrativo puedan acceder a sus datos. Esto se puede lograr de la siguiente manera:

us  = User salt  = Random unique value (not the same salt as used for authentication)
as  = Admin salt = Random unique value (not the same salt as used for authentication)

uk  = User key    = pbkdf2(user_pass, salt1, 256, rounds)
dk  = Data key    = random 256-bit key
ak  = Admin key   = pbkdf2(admin_pass, salt2, 256, rounds)
P   = RSA private key
p   = RSA public key

uk' = Encrypted user key    = dk ^ uk
dk' = Encrypted data key    = RSA_Encrypt(dk, p)
P'  = Encrypted private key = AES_Encrypt(P, ak)

m = message
iv = initialisation vector (random unique value)
c = ciphertext = AES_Encrypt(m, iv, dk)

Luego almacenamos uk' , dk' y iv con el registro de datos que estamos cifrando. Almacenamos us con el registro de la cuenta de usuario. También almacenamos P' y as con nuestro registro de cuenta de administrador. La clave pública P se puede almacenar en el código.

El descifrado del usuario funciona de la siguiente manera:

  1. Calcular uk a partir de la contraseña del usuario y us .
  2. Xor uk' con uk para recuperar dk .
  3. Descifre c usando iv y dk , dándonos m .

El descifrado de administrador funciona de la siguiente manera:

  1. Calcular ak desde la contraseña de administrador y as .
  2. Descifrar P usando AES_Decrypt(P', ak)
  3. Descifrar dk usando RSA_Decrypt(dk', P)
  4. Descifre c usando iv y dk , dándonos m .

Tenga en cuenta que cuando digo "cifrar" y "descifrar" en referencia a RSA, no es realmente el cifrado realmente , pero es más o menos semánticamente igual.

    
respondido por el Polynomial 15.11.2012 - 14:56
fuente
3

Para expresar lo que Polynomial está diciendo de otra manera, si está tratando de que el cifrado funcione para que los datos del usuario funcionen de manera que solo el usuario y los administradores puedan acceder a él, la parte fundamental es no almacenar la capacidad de obtener Información en el servidor. Para los usuarios, esto se hace a través de su contraseña, para los administradores, se hace a través de su clave privada (que también puede estar vinculada a una contraseña).

Para cada cuenta de usuario, creas una nueva clave simétrica. Almacena esa clave cifrada en función de la contraseña de los usuarios para que solo el usuario pueda acceder a esa versión. Luego, también almacena la misma clave, pero la cifra mediante la clave pública del administrador, lo que garantiza que solo el titular de la clave privada del administrador pueda acceder a la segunda copia de la clave de usuario. Si la contraseña del usuario debe cambiarse administrativamente, el administrador puede descifrar la clave del usuario con su clave privada y volver a cifrarla según la nueva contraseña del usuario.

En última instancia, la limitación principal es que el usuario administrativo todavía tiene que proporcionar la clave privada para hacer cualquier cosa, así que no estoy seguro de si esto se ajusta a su caso de uso o no. Si necesita que el sistema pueda restablecer la contraseña de un usuario automáticamente, debe tener una forma de obtener la clave de cifrado para volver a cifrarla con la nueva contraseña de usuario.

Si bien tiene razón en que no agrega mucha seguridad, yo diría que su mejor apuesta para la defensa en profundidad a través de múltiples ubicaciones de almacenamiento (si no tiene una opción mejor) es usar múltiples encriptaciones anidadas con diferentes llaves. es decir, almacene una clave simétrica completa y diferente en cada ubicación y requiera que cada clave se use en secuencia para el descifrado de la clave de datos y gírelas con regularidad. Debo enfatizar que esto agrega una cantidad mínima de protección, pero al menos hace lo mejor de una mala situación si debe tener la capacidad de acceder automáticamente a los datos protegidos.

    
respondido por el AJ Henderson 15.11.2012 - 18:48
fuente
0

Si entendí correctamente, estás buscando el concepto de intercambio secreto .

Cita artículo de Wikipedia:

  

Compartir secreto (también llamado división secreta) se refiere a métodos para   distribuir un secreto entre un grupo de participantes, cada uno de los cuales es   asignado una parte del secreto. El secreto solo puede ser reconstruido.   cuando un número suficiente, posiblemente de tipos diferentes, de acciones son   combinados juntos Las acciones individuales no tienen ningún uso por sí mismas.

Si estás buscando algunos ejemplos más concretos, busca el esquema de Shamir , el esquema de Blakley .

Lamentablemente, no puedo recomendar ninguna biblioteca lista para usar, ¡pero eso no significa que no existan!

    
respondido por el Cyryl Płotnicki 24.09.2013 - 14:32
fuente

Lea otras preguntas en las etiquetas