Cómo convertir SecureString del Sistema.¿Cuerda?


Todas las reservas sobre la falta de seguridad de su cadena de seguridad mediante la creación de un Sistema.String out of it aside, how can it be done?

Cómo puedo convertir un Sistema ordinario.Seguridad.SecureString del Sistema.¿Cuerda?

Estoy seguro de que muchos de ustedes que están familiarizados con Secureling van a responder que uno nunca debe transformar una secureling a una cadena.NET ordinaria porque elimina todas las protecciones de seguridad. Lo sé. Pero ahora mismo mi programa lo hace todo con cadenas ordinarias de todos modos, y estoy tratando de mejorar su seguridad y aunque voy a estar utilizando una API que devuelve una cadena de seguridad para mí estoy no tratando de usar eso para aumentar mi seguridad.

Estoy al tanto del Marshal.SecureStringToBSTR, pero no se como tomar ese BSTR y hacer un Sistema.Sal de ahí.

Para aquellos que exijan saber por qué querría hacer esto, bueno, estoy tomando una contraseña de un usuario y enviándola como una publicación de formulario html para registrar el usuario en un sitio web. Tan... esto realmente tiene que hacerse con búferes administrados y sin cifrar. Si pudiera incluso obtener acceso al búfer no administrado y sin cifrar, imagino que podría escribir byte-by-byte stream en el stream de red y espero que eso mantenga la contraseña segura todo el camino. Espero una respuesta a al menos uno de estos escenarios.

Author: wonea, 0000-00-00

2 answers

Utilice el System.Runtime.InteropServices.Marshal clase:

String SecureStringToString(SecureString value) {
  IntPtr valuePtr = IntPtr.Zero;
  try {
    valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
    return Marshal.PtrToStringUni(valuePtr);
  } finally {
    Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
  }
}

Si desea evitar la creación de un objeto de cadena administrada, puede acceder a los datos sin procesar utilizando Marshal.ReadInt16(IntPtr, Int32):

void HandleSecureString(SecureString value) {
  IntPtr valuePtr = IntPtr.Zero;
  try {
    valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
    for (int i=0; i < value.Length; i++) {
      short unicodeChar = Marshal.ReadInt16(valuePtr, i*2);
      // handle unicodeChar
    }
  } finally {
    Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
  }
}
 160
Author: Rasmus Faber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-03 09:19:03

Obviamente sabes cómo esto derrota todo el propósito de una secuencia segura, pero lo repetiré de todos modos.

Si quieres una línea, prueba esto: (. NET 4 y superior solamente)

string password = new System.Net.NetworkCredential(string.Empty, securePassword).Password;

Donde SecurePassword es una cadena de seguridad.

 71
Author: Steve In CO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-09 18:53:15