Pregunta

Tengo algo de código como este en una aplicación winforms que estaba escribiendo para la consulta de correo electrónico del usuario cuadro de la Cuota de Almacenamiento.

DirectoryEntry mbstore = new DirectoryEntry(
      @"LDAP://" + strhome, 
      m_serviceaccount, 
      [m_pwd], 
      AuthenticationTypes.Secure);

No importa cuál es la estrategia que he intentado (como SecureStringYo soy capaz de ver la contraseña (m_pwd), ya sea mediante Reflector o el uso de cadenas ficha de Proceso Explorer para el ejecutable.

Sé que podría poner este código en el servidor o reforzar la seguridad en el uso de mecanismos como la delegación y dar sólo los privilegios necesarios para la cuenta de servicio.

Puede alguien sugerir razonablemente una forma segura de guardar la contraseña en la aplicación local sin revelar la contraseña a los hackers?

Hash no es posible ya que necesito saber la contraseña exacta (no sólo el valor hash de la coincidencia de propósito).El cifrado/Descifrado de los mecanismos no están funcionando, ya que son dependiente de la máquina.

¿Fue útil?

Solución

Los santificados método es el uso de CryptoAPI y la Protección de Datos de la Api.

Para cifrar, usar algo como esto (C++):

DATA_BLOB blobIn, blobOut;
blobIn.pbData=(BYTE*)data;
blobIn.cbData=wcslen(data)*sizeof(WCHAR);

CryptProtectData(&blobIn, description, NULL, NULL, NULL, CRYPTPROTECT_LOCAL_MACHINE | CRYPTPROTECT_UI_FORBIDDEN, &blobOut);
_encrypted=blobOut.pbData;
_length=blobOut.cbData;

La decodificación es el opuesto:

DATA_BLOB blobIn, blobOut;
blobIn.pbData=const_cast<BYTE*>(data);
blobIn.cbData=length;

CryptUnprotectData(&blobIn, NULL, NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &blobOut);

std::wstring _decrypted;
_decrypted.assign((LPCWSTR)blobOut.pbData,(LPCWSTR)blobOut.pbData+blobOut.cbData/sizeof(WCHAR));

Si no se especifica CRYPTPROTECT_LOCAL_MACHINE, a continuación, la contraseña cifrada puede ser almacenada de forma segura en el registro o fichero de configuración y sólo puede descifrarlo.Si especifica LOCAL_MACHINE, a continuación, cualquier persona con acceso a la máquina, puede obtener.

Otros consejos

Como se ha mencionado, la API de Protección de Datos es una buena manera de hacer esto.Tenga en cuenta que si usted está utilizando .NET 2.0 o superior, usted no necesita usar P/invoke para Invocar el DPAPI.El marco ajusta las llamadas con el Sistema.De seguridad.La criptografía.ProtectedData clase.

He encontrado este libro de keith Brown El .NET Desarrollador de la Guía de Seguridad de Windows.Tiene algunas buenas muestras que abarcan todo tipo de escenarios de seguridad.Gratis Versión en línea también está disponible.

Si la almacena como una cadena segura y guardar la cadena segura a un archivo (posiblemente usando El Almacenamiento Aislado, el único momento en que usted tendrá una contraseña de texto plano es cuando descifrar para crear su mbstore.Por desgracia, el constructor no tiene que tener un SecureString o un objeto de Credenciales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top