i * must * almacena credenciales de terceros en mi base de datos. ¿mejor manera?

Mi aplicación debe leer un URL de SSL de un tercero. ¿Cómo puedo almacenar mejor las credenciales de terceros en mi propia base de datos, que protege las credenciales de terceros para que no se vean comprometidas? Considere la seguridad absoluta y la practicidad. El hashing unidireccional de las credenciales no es útil ya que debo restaurar las credenciales a texto sin formato para la llamada SSL. Estoy usando python en el motor de aplicaciones de Google, y mi aplicación se autentica con las credenciales de Google.

  • cifre las credenciales utilizando, por ejemplo, AES y guarde la clave de cifrado en otro lugar (solo mueve el problema), o derévelas de las credenciales y mantenga el algoritmo en secreto (solo mueve el problema)
  • cifre las credenciales utilizando un cifrado de flujo síncrono , derive la entropía (no) de las credenciales y mantenga el algoritmo en secreto (solo se mueve el problema)
  • En una aplicación web separada dedicada al almacenamiento de credenciales de terceros, proporcione una URL de SSL para recibir las credenciales de terceros, se accede a esta URL con credenciales de Google (igual que mi aplicación) y puede usar authsub o algo para transferir la autorización a la otra aplicación web . esto suena más seguro porque es más difícil piratear una aplicación web trivialmente simple, y si mi compleja aplicación principal se ve comprometida, las credenciales de terceros no están expuestas.

¿Qué piensas de todos los enfoques?

Es una tarea difícil, y ningún enfoque le ahorrará la molestia de asegurarse de que no haya un enlace débil. Para empezar, no sabría si hospedar en Google es la mejor opción, ya que perderá el control (realmente no sé si App Engine está diseñado con el nivel de seguridad requerido en mente, debería encontrarlo fuera) y probablemente no pueda hacer pruebas de penetración (lo que debería hacer).

Tener una aplicación pequeña por separado es probablemente una buena idea, pero eso no le ahorra tener que cifrar de una manera u otra las credenciales en esta aplicación más pequeña. Simplemente le compra simplicidad, lo que a su vez hace que las cosas sean más fáciles de analizar.

Personalmente, intentaría diseñar la aplicación para que la clave cambie aleatoriamente después de cada uso, teniendo un tipo de enfoque de un solo disco . No especifica la aplicación con suficiente detalle para ver si esto es factible.

¿Cómo se utilizan las credenciales? Si su uso solo es activado por el propietario original (por ejemplo, está almacenando un número de tarjeta bancaria y está haciendo su segunda compra), entonces pueden proporcionar una contraseña en ese punto que se usa como su clave de cifrado. Por lo tanto, nunca necesitaría almacenar esa clave localmente y el contenido de la base de datos solo es inútil para un atacante.

Si necesita almacenar credenciales de manera reversible, simplemente no hay solución. Use AES y mantenga la clave secreta bajo guardia armada bien pagada.

Si usa Windows, verifico la Cred * Win32 API (advapi32.dll) que le permitiría al menos administrar la clave de acceso a Windows syskey donde TPM y / o frase de contraseña de inicio pueden proporcionar protección contra el compromiso de bajo nivel (unidades de disco robadas)

Obviamente, si su aplicación o el contexto de seguridad en el que se ejecuta se ve comprometido, ninguno de los anteriores sería de mucha ayuda.

Un libro decente que cubre este tipo de situación es Cryptography In The Database .