¿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!