Tengo un proyecto de código abierto que carga archivos a DropBox entre varios hosts de archivos. En este momento estoy raspando la pantalla para DropBox. Para usar su API, tengo que codificar una CLAVE SECRETA que me proporcionaron para la autenticación OAuth. Pero me temo que la clave no será secreta si es visible para que cualquiera la vea.
Es 'posible' que alguien malicioso use mi clave para cargar un virus a la cuenta de un usuario (que ya permitió el acceso a mi aplicación) que se extenderá a su PC (si tenían habilitada la sincronización de escritorio) y a la PC de otros (si habían compartido carpetas) y así sucesivamente. : O
Encontré esta pregunta sin respuesta que tiene el mismo problema que la mía.
Pero me gustaría saber en general cómo se esconden los datos confidenciales en un proyecto de código abierto.
Tengo una idea
- ¿Tiene un marcador de posición en el código fuente como "<SECRET KEY AQUÍ>" y lo rellena solo cuando crea binarios para liberar? (¡qué asco!)
¿Alguna idea decente?
fuente
Respuestas:
La idea básica es que NO registre valores confidenciales en el código o en el binario compilado. Especialmente si el proyecto es de código abierto, realmente no deberías. Hay varias estrategias de configuración que puede tomar para hacerlo:
Marcadores de posición en el código (valores codificados)
Marcadores de posición en el código , como se sugirió, lo cual es más sensato y fácil de hacer en lenguajes de programación dinámicos, ya que el código es fácil de cambiar (sin necesidad de compilarlo). He visto muchos proyectos de código abierto hacer esto, como MediaWiki con él
LocalSettings.php
.La desventaja de esta estrategia es que la clave está codificada. Entonces, si el programa se distribuye como un binario, entonces tener la clave codificada no lo hace particularmente mantenible.
Archivos de texto de configuración
También puede hacer esto implementando archivos de texto de configuración , es decir, el programa / aplicación busca un archivo de configuración y lee valores de él. Puede registrar una configuración de muestra con marcadores de posición, pero tener la configuración real local en su máquina.
En su caso, puede crear un
key.conf
archivo de texto con la clave real, dejar que el programa use ese archivo y que el control de versiones lo ignore. Puede, por ser útil, registrar unkey.conf.example
archivo de texto con una clave falsa y verificar eso. Asegúrese de que su programa / aplicación envíe un mensaje de error útil para que el usuario agregue la clave real en el archivo correcto.Algunos lenguajes de programación tienen API que proporcionan esto automáticamente para usted, como:
App.Config
archivos accesibles a través de ConfigurationManager .NET APIpackage.json
o poner valores de configuración en archivos json, y con la API de módulos de archivos, los archivos son fáciles de analizar y usar, ya que son básicamente literales de objetos JavaScript .Si su aplicación es una aplicación de base de datos, considere colocar la clave u otras variables de configuración en la base de datos. Es lo mismo que el archivo de texto de configuración anterior, pero coloca todas las variables de configuración, como la clave, en una tabla de base de datos.
A través de la vista de preferencias o una aplicación de Back Office
Si el programa es una ventana o una aplicación web con vistas, también puede dejar que la aplicación cree el archivo de configuración, a través de una vista de preferencias. De esa manera, no necesita registrar un archivo de configuración de ejemplo como se sugirió anteriormente.
MediaWiki resolvió esto de manera similar al generar automáticamente el
LocalSettings.php
archivo en un proceso de instalación inicial.Es cierto que esta no es una opción para programas que solo se ejecutan como procesos en segundo plano, servicios o demonios. Sin embargo, es por eso que crea proyectos GUI separados para que estos creen un punto de entrada para la configuración de administración y preferencias, en aplicaciones web que generalmente se llaman una aplicación de Back Office .
fuente
La forma más fácil es simplemente no publicar datos confidenciales. Algunas opciones:
He usado la segunda opción para el desarrollo de código abierto porque significa que no tiene que preocuparse por completar los detalles justo antes de compilar, o tener un cambio para recordar no comprometerse.
fuente
Si alguien tiene el código fuente (o código de byte que se puede aplicar ingeniería inversa), entonces podrán obtener la clave secreta ejecutando el código en un depurador y colocando un punto de interrupción en el punto donde envía la clave.
Puede hacerlo un poco más difícil al proporcionar una biblioteca C precompilada que habla de drop box, con la clave codificada en eso, pero todavía hay muchas formas en que las claves se filtrarán (estoy pensando en cadenas por ejemplo).
La única forma segura en que puedo pensar en hacer esto es proporcionar un servicio web que publique el cuadro desplegable. De esa manera, la clave secreta permanece en su servidor bajo su control. Los costos de alojamiento y ancho de banda significan que esta solución es menos que ideal para una aplicación gratuita, pero la ventaja adicional es que su servidor puede autenticar a los clientes correctamente antes de retransmitir sus archivos que se envían a Dropbox.
fuente