La mejor manera de guardar el nombre de usuario / contraseña programáticamente

3

Tengo el requisito de guardar mediante programación un nombre de usuario y una contraseña en la estación de trabajo local y recuperarlos.

¿Cuál sería la forma más segura de hacer esto?

He utilizado DPAPI en el pasado con éxito, pero parece que DPAPI usa 3des que ha quedado en desuso.

¿CNG-DPAPI sería la mejor opción? ¿Algún otro método que sea más seguro?

Gracias, Mike

    
pregunta Mike M 08.09.2018 - 00:00
fuente

1 respuesta

0

3DES no ha quedado en desuso, ni DPAPI. Si bien el algoritmo 3DES no es ideal y no se debe usar en nuevos diseños donde sea evitable, el mejor ataque que conocemos es un ataque de encuentro en el medio que requiere 512PiB de RAM de corrección de errores y 2 112 + 2 56 operaciones. Teniendo en cuenta otros posibles ataques contra DPAPI, por ejemplo. Al utilizar el módulo DPAPI mimikatz en un sistema en ejecución, esto parece bastante extravagante.

CNG-DPAPI (que ahora se llama DPAPI-NG) sería una mejor opción para los diseños modernos. Desafortunadamente, los ejemplos son bastante escasos, lo que te deja trabajar muchas cosas por tu cuenta. El siguiente es un ejemplo de alto nivel de cómo podría implementar el almacenamiento secreto utilizando DPAPI-NG:

  • Llama a NCryptCreateProtectionDescriptor con dwFlags establecido en 0 y pwszDescriptorString establecido en una cadena de descriptor de protección. Para proteger los datos de manera que solo el usuario actual pueda acceder a ellos, use "LOCAL=user" , y para la protección en toda la máquina use "LOCAL=machine" . También puede cifrar un conjunto de credenciales web en un contexto ASP, un certificado del almacén de certificados, un usuario de dominio especificando un SID, o puede especificar un descriptor de seguridad completamente personalizado mediante SSDL.
  • Llame a NCryptProtectSecret , pasando el identificador que obtuvo de la operación anterior, para cifrar pequeñas cantidades de datos (por ejemplo, una cadena de credenciales)
  • Llame a NCryptStreamOpenToProtect si desea cifrar una gran cantidad de datos. Esto abre un flujo en el que puede escribir datos a través de NCryptStreamUpdate .
  • Llame a NCryptUnprotectSecret para descifrar los datos cifrados con NCryptProtectSecret .
  • Llame a NCryptStreamOpenToUnprotect para descifrar los datos que se cifraron con NCryptStreamOpenToProtect . De nuevo, aquí se usa NCryptStreamUpdate .
  • Si usaste cualquiera de las funciones de transmisión, llama a NCryptStreamClose para cerrarlas.
  • Llame a NCryptCloseProtectionDescriptor para cerrar el identificador de protección que creó en el primer paso.

DPAPI-NG todavía está afectado por herramientas como mimikatz, pero eso es solo una parte inherente de cómo funciona la seguridad del sistema operativo: si un atacante está ejecutando un código como administrador, ha ganado.

La antigua API para DPAPI es mucho más simple, pero la nueva API tiene un soporte más completo para diferentes escenarios de seguridad como se describe anteriormente. La criptografía en uso ciertamente no es el eslabón más débil de la cadena para ninguna API.

    
respondido por el Polynomial 12.11.2018 - 16:19
fuente

Lea otras preguntas en las etiquetas