2012-05-15 23 views
5

Estoy trabajando en una aplicación javascript de código abierto. Estoy tratando de interactuar con una API de terceros (github específicamente). Intento mantener toda mi aplicación solo en el lado del cliente, así que realmente no tendré un servidor en el que recurrir o almacenar archivos ocultos. Como parte del proceso de OAuth, debo proporcionar la clave secreta provista para mi clave de API. No se supone que publique o comparta esta clave.Ocultar clave secreta en el repositorio público

he llegado con la siguiente solución:

  1. cifrar la clave secreta utilizando DES triple y una frase de contraseña.
  2. Ponga la versión encriptada en mi repositorio en alguna parte.
  3. Cuando necesito autenticar a través de Oauth, solicito la frase de contraseña y recupero la clave secreta.
  4. Una vez conocido, almacene el secreto en el almacenamiento local para evitar futuras solicitudes.

Estoy esencialmente almacenando una versión transformada de la clave secreta. Supongo que todo lo que esto me compra es que debo obtener la frase de contraseña del usuario en lugar de la clave completa. Debería ser un poco más fácil de recordar que los bytes aleatorios.

¿Es esto suficientemente seguro? No es una aplicación súper crítica, pero quiero hacer todo lo posible para proteger las cosas que me dicen que no comparta. ¿Hay alguna manera mejor que 3DES para encriptar la clave de forma reversible?

+0

Resulta del lado del cliente OAuth realmente no es compatible con github por este mismo motivo de todos modos. No quieren que se muestren las claves secretas. Sin embargo, podría ser útil si se trata de apis menos exigentes. – captncraig

+0

Realmente no entiendo el escenario. ¿Estás tratando de ocultar la clave a github del usuario, a pesar de que están ejecutando el cliente que usa la clave? Si es así, no puedes hacerlo de forma segura; un usuario determinado siempre podrá recuperar esta clave, y desde un punto de vista ético, no debe tratar de ocultar la información almacenada en una máquina de su propietario. Si cada usuario obtiene su propia clave github, y solo está buscando una forma más conveniente de recordarla, su solución es buena. – erickson

Respuesta

2

Eso suena más que adecuado para mantener algo en secreto; aunque Triple DES es un poco anticuado.

Usaría X rondas de SHA-256 para cifrar la frase de contraseña, luego usaría ese hash como clave AES-256.

+0

O simplemente use una biblioteca como [SJCL] (https://crypto.stanford.edu/sjcl/) que proporciona un algoritmo que funciona como usted presentó. Cuando se trata de criptografía, implementar algo usted mismo a menudo resulta en problemas de seguridad. – Robert

+1

No solo use SHA-256, use un algoritmo de derivación de clave real (como PBKDF2) que esté bien diseñado y revisado. Por ejemplo, la derivación de clave debería usar sal. – erickson

5

El problema con esta solución es que la aplicación debe contener el código (y posiblemente la clave) para descifrarlo. La mejor solución es no poner nada en el repositorio.

La mayoría de las aplicaciones almacenan este tipo de datos en un archivo de configuración que el software de control de versiones ignora. Luego incluya un archivo de configuración de ejemplo con una clave falsa e instrucciones sobre cómo cambiar el nombre del archivo y adquirir una clave api propia.

Un buen ejemplo de esto está en wordpress's config file en "Authentication Unique Keys and Salts". sección.

+0

Cuando se aloja en github-pages, el repositorio es la implementación. No hay forma de separar los dos. – captncraig

+0

Eso es un problema interesante, supongo que no hay una buena manera de asegurar la clave. Eso significa que te quedan mitigación. Mantenga una clave separada para esta aplicación.Si se pone en peligro, puede descartarlo sin afectar otras aplicaciones. – AaronAsAChimp

Cuestiones relacionadas