Это свойство небезопасная строка пароля кэшируется в памяти - PullRequest
0 голосов
/ 09 мая 2019

Если я делаю следующее в классе, мой пароль кэшируется / обнаруживается в памяти?

public class ConnectionInfo
    {
        private SecureString _password;
        public string UserName;

        public string Password
        {
            get
            {
                IntPtr valuePtr = IntPtr.Zero;
                try
                {
                    valuePtr = Marshal.SecureStringToGlobalAllocUnicode(_password);
                    return Marshal.PtrToStringUni(valuePtr);
                }
                finally
                {
                    Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
                }
            }
            set
            {
                _password = new SecureString();
                foreach (char c in value)
                {
                    _password.AppendChar(c);
                }
            }
        }
    }

Другими словами, если я использую его следующим образом

ConnectionInfo connectionInfo = new Models.DomainInfo();
connectionInfo.Password = "Password1";

ипозже используйте его с каталогом. Entry

DirectoryEntry entry = new DirectoryEntry("LDAP://Domain.com", $"Domain\\{connectionInfo.UserName}", connectionInfo.Password);

. Пароль в открытом тексте кэшируется через свойство Password?(Я не имею в виду какие-либо утечки, которые могут произойти через DirectoryEntry и т. Д., Только свойство)

Пароль хранится в web / app.config и извлекается через этот

staticKey = Encoding.UTF8.GetBytes(sEncryptionKey.Substring(0, 8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
inputByteArray = Convert.FromBase64String(stringToDecrypt);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(staticKey, staticIV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
Encoding encoding = Encoding.UTF8;
return encoding.GetString(ms.ToArray());

Является лидостаточно сильное шифрование?

1 Ответ

1 голос
/ 09 мая 2019

Ответ сложный - да, само свойство безопасно, кэширование не выполняется. НО - возвращаемая строка будет управляться сборщиком мусора и существовать до тех пор, пока не будет собран мусор.

Честно говоря, я не думаю, что SecureString стоит того. Это несколько защищает от анализа дампа памяти, но только сокращает окно угрозы. Поскольку вход и использование обычно представляют собой простые старые строки, пароль рано или поздно появится в дампе памяти.

Кроме того, как вы получаете пароль к приложению? Обычно это та часть, где злоумышленник может получить PW.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...