У меня есть такой код в приложении winforms, которое я писал, чтобы запросить квоту хранилища почтового ящика пользователя.
DirectoryEntry mbstore = new DirectoryEntry(
@"LDAP://" + strhome,
m_serviceaccount,
[m_pwd],
AuthenticationTypes.Secure);
Независимо от того, какой подход я пробовал (например, SecureString), я легко могу увидеть пароль (m_pwd) либо с помощью Reflector, либо с помощью вкладки строк в Process Explorer для исполняемого файла.
Я знаю, что могу разместить этот код на сервере или усилить безопасность, используя такие механизмы, как делегирование и предоставление учетной записи службы только необходимых привилегий.
Может ли кто-нибудь предложить достаточно безопасный способ сохранить пароль в локальном приложении, не раскрывая пароль хакерам?
Хеширование невозможно, поскольку мне нужно знать точный пароль (а не только хеш для соответствия). Механизмы шифрования / дешифрования не работают, так как они зависят от машины.





Если вы сохраните его как защищенную строку и сохраните защищенную строку в файл (возможно, используя Изолированное хранилище, единственный раз, когда у вас будет простой текстовый пароль, это когда вы расшифруете его для создания своего mbstore. К сожалению, конструктор не принимает SecureString или объект учетных данных.
Освященный метод - использовать CryptoAPI и API защиты данных.
Для шифрования используйте что-то вроде этого (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;
Расшифровка противоположная:
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));
Если вы не укажете CRYPTPROTECT_LOCAL_MACHINE, то зашифрованный пароль можно будет безопасно сохранить в реестре или файле конфигурации, и только вы сможете его расшифровать. Если вы укажете LOCAL_MACHINE, то его сможет получить любой, у кого есть доступ к машине.
Я нашел эту книгу Кита Брауна. Руководство разработчика .NET по безопасности Windows. В нем есть несколько хороших примеров, охватывающих все виды сценариев безопасности. Также доступен бесплатный Онлайн-версия.
Как уже упоминалось, API защиты данных - хороший способ сделать это. Обратите внимание: если вы используете .NET 2.0 или выше, вам не нужно использовать P / Invoke для вызова DPAPI. Платформа оборачивает вызовы классом System.Security.Cryptography.ProtectedData.
@m_oLogin: посмотрите один из моих других ответов здесь