Hashing no funcionará, ya que, como menciona skjaidev, es de una sola manera.
Si tiene un temor razonable de que su archivo o base de datos sea robado (*), la encriptación es el camino a seguir. Pero, de hecho, como mencionas, tu aplicación necesitará la clave de descifrado, por lo que la pregunta es dónde almacenarla. Obviamente almacenarlo en el mismo lugar que los datos, no mejora la seguridad. Tenga en cuenta lo siguiente:
- Cuando sus datos se encuentran en una base de datos, es (lo más probable) menos seguro que en un archivo plano. Esto se debe a que existen técnicas de inyección de base de datos que pueden permitirle leer la base de datos, pero no los archivos. En este caso, tiene sentido poner su clave de descifrado en algún lugar del sistema de archivos (en su código): en ese caso, los datos de la base de datos son inútiles.
- Incluso cuando sus datos están en un archivo plano, colocar la clave de descifrado en algún lugar de un archivo puede reducir el riesgo. Muchos sistemas se "piratean" cuando el pirata informático obtiene acceso a un sistema que ni siquiera se suponía que debía contener esos datos, que contenía copias de seguridad antiguas de los datos o, de alguna otra forma, no (necesariamente) contiene su código con el descifrado. llave.
Lo mejor es tener su clave de descifrado en absoluto en el sistema de archivos, sino solo en la memoria de la computadora. Un buen hacker con acceso raíz o acceso físico aún puede llegar a él, pero yo diría que en el 99% de los casos en que los piratas informáticos tienen acceso a los sistemas de archivos, tampoco podrán leer la memoria (en el casos en los que roban copias de seguridad, roban la máquina física (apagándola en el proceso), obtienen acceso a nivel de usuario, etc.). Este es básicamente el enfoque de llavero. El problema es cómo obtener la clave de descifrado en la memoria, y solo hay una solución que conozco: escribirla (o alguna otra contraseña que descifre la clave de descifrado) cada vez que se inicia la aplicación. Si esto es aceptable depende de la frecuencia con la que se reiniciará la aplicación.
Hay otro método. Si solo necesita acceso a Dropbox cuando los usuarios realmente inician sesión en su aplicación, puede considerar encriptar el token con alguna propiedad de usuario única (o instancia, la contraseña que usa el usuario para iniciar sesión en su sitio, o alguna cadena aleatoria que poner en una cookie en la primera visita). En este caso, también puede considerar almacenar el token de acceso completo cifrado en una cookie (y no en su servidor en absoluto).
Cualquiera que sea el método que elija, nunca lo protegerá realmente, como usted mismo menciona. Si su aplicación puede obtener tokens descifrados (que puede, de lo contrario su aplicación no necesitaría almacenarlos en primer lugar), también puede hacerlo un hacker con privilegios ilimitados. Sin embargo, lo bueno de los tokens de acceso es que probablemente se puedan revocar fácilmente, por lo que si se los roban probablemente no sea el fin del mundo; y un hacker sabe que pueden ser fácilmente revocados, por lo que difícilmente serán interesantes como objetivo.
(*) Nota: siempre es razonable suponer que las cosas serán robadas de una forma u otra. Sin embargo, puedo imaginar que si configura un sitio pequeño para 20 amigos en la PC de su hogar, se preocupa menos por el robo de sus contraseñas que cuando está construyendo la siguiente instagram. Siempre es una compensación entre la seguridad y la cantidad de trabajo. Como se mencionó, tener sus tokens en un archivo plano en lugar de una base de datos (si se maneja correctamente) debería hacer que sea menos probable que sean robados.
Hashing es generalmente de una sola manera. ¿Su plataforma tiene una instalación de llavero? – jman
Tenga en cuenta que SQLite también usa un archivo para la base de datos, y es trivial obtener datos de él. Por lo tanto, no agregará ninguna seguridad sobre los archivos planos. –