¿Cómo puedo ocultar datos confidenciales en mi proyecto de código abierto?

13

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?

Vigneshwaran
fuente
1
Esa es realmente la única forma segura de hacerlo. También podría usar el cifrado pgp para codificar su clave secreta, luego solo podría decodificarla, pero ¿por qué molestarse en publicarla?
Prescott
Es posible que desee consultar esta pregunta: programmers.stackexchange.com/questions/180957/… : no se trata de las claves de la API de DropBox, pero el mensaje general es el mismo.
tdammers
git-crypt ha sido creado para ti :) github.com/AGWA/git-crypt
nha

Respuestas:

14

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.confarchivo 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 un key.conf.examplearchivo 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:

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.phparchivo 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 .

Spoike
fuente
Una cosa a tener en cuenta aquí: hacer que la aplicación misma modifique sus propios ajustes de configuración significa que el archivo de configuración debe ser editable por el usuario de la aplicación, lo que a su vez aumenta la superficie de ataque, por lo que debe pensar mucho si realmente necesita dicha interfaz de usuario.
tdammers
2

La forma más fácil es simplemente no publicar datos confidenciales. Algunas opciones:

  • Use un marcador de posición como en la pregunta.
  • Use un archivo de encabezado especialmente para la clave, no lo comprometa con el control de origen y solo distribúyalo de forma privada a partes confiables.

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.

Hugo
fuente
2

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.

Michael Shaw
fuente