¿Cómo almacenar nonce y key cuando se trabaja con libsodium secretbox?

7

¿Por qué lo pregunto?

Soy muy nuevo en la criptografía (así que tenga paciencia conmigo ...) y quiero evitar cometer errores innecesarios. Hice mucha investigación, pero, aparte de la mayoría de las otras preguntas relacionadas con la programación, me costó encontrar la información suficiente para que estuviera seguro, y ahora entiendo cómo hacer las cosas bien.

¿Cuál es el contexto?

Estoy trabajando en una tienda web utilizando PHP (> 7.2) y MySQL. Necesito almacenar alguna información personal. Sin embargo, esto no contendrá datos críticos (como detalles de pago), solo nombres, direcciones e información de contacto. Sin embargo, quiero cifrar estos datos, sobre todo para ganar algo de experiencia. Estos datos serán ingresados y leídos por la aplicación php, sin la entrada de un administrador.

Estoy hospedando este sitio en World4You, un proveedor austriaco. No estoy seguro de cuál es la palabra adecuada para esto (el inglés no es mi idioma nativo), pero creo que lo llamaría alojamiento compartido. Sin embargo, he leído acerca de alojamiento compartido, donde otros usuarios tienen acceso a mis archivos; este no es el caso aquí.

En tus respuestas, considera estas circunstancias como invariantes. Soy consciente de que hay bastante espacio para mejoras relacionadas con la seguridad cuando se trata de hosting. Y, por supuesto, estoy contento con cada sugerencia con respecto a esto. Pero, por favor, también ayúdame a encontrar la mejor solución dada en estas circunstancias.

¿Por qué secretbox?

Según mi investigación, existen alternativas de cifrado más fuertes para secretbox. Sin embargo, esta seguridad adicional puede verse afectada por una implementación deficiente, especialmente si eres un aficionado como yo. Secretbox sigue siendo bastante seguro, pero mucho más fácil de usar y, por lo tanto, la mejor opción en mi caso. Correcto?

Además, libsodium ahora viene como parte de PHP (en las versiones 7.2 y posteriores).

Mis preguntas

Gracias al libro electrónico libsodium, ahora sé cómo generar una clave y una clave y cómo cifrar y descifrar los datos con estos. Sin embargo, no estoy seguro de cómo almacenar la clave y el archivo.

¿Dónde guardo la clave?

La "mejor" solución (considerando mis circunstancias), que encontré hasta ahora, es almacenar la clave en un archivo php, que vive fuera de la raíz del documento. ¿Es esta una forma aceptable de hacer las cosas? ¿Hay mejores opciones que no requieran cambios significativos en mi configuración?

¿Dónde almaceno los nonces?

En mi opinión, los nonces no tienen que mantenerse en secreto. Entonces, ¿dónde guardo mis objetos?

por ejemplo: si quiero cifrar las cadenas de las columnas de la tabla "nombre", "dirección" y "correo electrónico", usaría 3 nonces, ¿verdad? Entonces, ¿solo almacenaría estas 3 fuentes en tres columnas adicionales de esta misma tabla (esto de alguna manera intuitivamente "se siente" mal)? ¿O los almacenaría en otro lugar?

¿Qué tipo de columna debo usar?

De lo que he recopilado, debería almacenar los datos cifrados en una columna de algún tipo binario. Entonces, ¿un BLOB sería la elección correcta?

Además, ¿qué tipo de columna debo usar para almacenar nonces (si realmente los almaceno en una tabla)?

¡Muchas gracias!

    
pregunta wire417 25.05.2018 - 13:25
fuente

1 respuesta

1

No soy un experto ni he hecho nada con crypto antes. SOY UN AMATEUR !!! Por favor, no tome lo que tengo que decir como conocimiento o sabiduría en este tema. Utilice bajo su propio riesgo.

En realidad tengo la misma pregunta. Gran parte de la documentación y F.U.D. dejar a alguien aprendiendo esto aturdido. Estoy bastante seguro de que esto es intencional para ayudar con la seguridad a través de la oscuridad y la confusión.

Ok, bromas aparte, quería expandir algunos conceptos que describiste que descubrí en mi propio viaje por el mismo camino. Lo primero es que el uso del cifrado y su implementación dependen directamente del caso de uso. Por ejemplo, si desea abordar los datos en reposo, tendrá una solución muy diferente y luego intercambiará mensajes secretos a través del cable. Todos utilizan los mismos algoritmos y herramientas, pero la implementación real de su aplicación será diferente.

A continuación, la clave (en secretbox) es tu sangre vital. Debe ser guardado de forma segura y escondido. También es permanente en el caso de almacenar datos en reposo. En su ejemplo, lo mejor sería guardarlo fuera de la raíz del documento o posiblemente en una base de datos detrás de un firewall. Además, muchas implementaciones también cifrarán la clave con una frase de contraseña (esto es lo que hace GPG / PGP). Podría hacer esto antes de escribirlo en el disco y guardar la frase de contraseña ( randombytes_buf ) en una variable de entorno.

El nonce es único por cifrado ... err ... por texto cifrado creado. Por lo tanto, en su caso anterior, serializaría los tres campos en una cadena y los cifraría con una sola letra. Ahora para descifrar (leer) necesitas saber el punto. Aquí es donde los documentos y las publicaciones del blog se ponen divertidos. Solo he visto un ejemplo ( libsodium-wrappers ) donde concatenaron el búfer nonce con la creación del búfer de texto cifrado. un búfer grande con el nonce como prefijo.

Supongo que otro método sería serializar ambos en una forma analizable por el lector. Esta es mi pregunta para el mundo criptográfico. ¿Cuál es un mejor método de transporte?

Una cadena / carga binaria:

nonce
vvvvvv
bada55123456789abcdf
      ^^^^^^^^^^^^^^
      ciphertext

O separe los dos al serializar:

{
  "nonce": "bada55",
  "ciphertext": "123456789abcdef"
}
    
respondido por el Sukima 13.07.2018 - 05:50
fuente

Lea otras preguntas en las etiquetas