¿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. Ahora mismo 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 malintencionado use mi clave para cargar un virus en la cuenta de un usuario (que ya permitió el acceso a mi aplicación) que se propagará a su PC (si tienen la sincronización de escritorio habilitada) y a otras personas PC (si tenían carpetas compartidas) 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 ocultan los datos confidenciales en un proyecto de código abierto.

Tengo una idea.

  • Tener un marcador de posición en el código fuente como "< SECRET KEY HERE >" y llenarlo solo al construir binario para el lanzamiento? (¡puaj!)

¿Alguna idea decente?

    
pregunta Vigneshwaran 30.12.2012 - 09:03

3 respuestas

14

La idea básica es que usted NO ingrese 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 código (valores codificados)

Marcadores de posición en código , como se sugirió, que es lo 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 compilar). He visto que muchos proyectos de código abierto hacen esto como MediaWiki con LocalSettings.php .

El inconveniente de esta estrategia es que la clave está codificada. Entonces, si el programa se distribuye como binario, tener la clave codificada no lo hace particularmente fácil de mantener.

Archivos de texto de configuración

También puede hacer esto mediante la implementación de archivos de texto de configuración , es decir, el programa / aplicación busca un archivo de configuración y lee los valores de éste. 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 archivo de texto key.conf con la clave real, dejar que el programa use ese archivo y dejar que el control de versiones lo ignore. Puede, para ser útil, registrar un archivo de texto key.conf.example con una clave falsa y verificar eso. Asegúrese de que su programa / aplicación haga 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 lo proporcionan automáticamente, como:

Si su aplicación es una aplicación de base de datos, considere la posibilidad de colocar la clave u otras variables de configuración en la base de datos. Es igual al archivo de texto de configuración anterior, pero en su lugar, todas las variables de configuración, como la clave, se incluyen 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 permitir que la aplicación cree el archivo de configuración, a través de una vista de preferencias de orden. De esa manera, no necesita revisar un archivo de configuración de ejemplo como se sugirió anteriormente.

MediaWiki resolvió esto de manera similar al generar automáticamente el archivo LocalSettings.php en un proceso de instalación inicial.

Es cierto que esta no es una opción para programas que solo se ejecutan como procesos, servicios o demonios en segundo plano. Sin embargo, es por eso que crea proyectos de GUI separados para estos para crear un punto de entrada para la administración y la configuración de preferencias, en aplicaciones web generalmente llamadas aplicación de Back Office .

    
respondido por el Spoike 30.12.2012 - 10:04
2

La forma más sencilla 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 código fuente 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 tienes que preocuparte por completar los detalles justo antes de compilar, o tener un cambio para recordar que no cometer.

    
respondido por el Hugo 30.12.2012 - 09:50
2

Si alguien tiene el código fuente (o el código de byte que se puede diseñar por ingeniería inversa), entonces podrá 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. .

Puedes hacerlo un poco más difícil al proporcionar una biblioteca de C precompilada que habla con el cuadro desplegable, con la clave codificada en eso, pero todavía hay muchas maneras en que las claves se filtrarán (estoy pensando en cadenas, por ejemplo ).

La única manera segura en que puedo pensar en hacer esto, es proporcionar un servicio web que haga la publicación en el buzón. 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 no es ideal para una aplicación gratuita, pero la ventaja adicional es que su servidor puede autenticar a los clientes correctamente antes de enviar sus archivos a Dropbox.

    
respondido por el Michael Shaw 30.12.2012 - 13:46

Lea otras preguntas en las etiquetas