Хранение паролей в секрете в исходном коде
Сначала я постараюсь ответить на ваш прямой вопрос:
Я хотел сделать этот myscript.ps1 защищенным, чтобы никто не мог отредактировать его и увидеть имя пользователя и пароль
Я предполагаю, что вы на самом деле не заботитесь о людях, которые на самом деле редактируют / изменяют скрипт, а только хотят сохранить пароль в безопасности. Как сказал Бен, превращение его в исполняемый файл на самом деле мало что делает для предотвращения извлечения, потому что вы все еще встраиваете в него пароль.
Что вам действительно нужно, так это хеш пароля, который является односторонней функцией, которая преобразует пароль в хеш, который вы можете встроить. Учитывая только хеш, злоумышленник не может полностью изменить процесс, но вы можете проверить попытку пароля, хэшируя введенный пароль и сравнивая его с известным хешем правильного пароля.
Например, псевдокод:
$authorisedHash = 'thehashedpassword';
$password = (Get-Credential).Password;
if ((Get-Hash $password) -eq $authorisedHash)
{
echo 'Password correct';
}
Где $authorisedHash
- это предварительно вычисленный результат (псевдокода) Get-Hash
который вы сохраняете для последующего сравнения.
В идеале вы должны использовать такой алгоритм, как Bcrypt или PBKDF2, с высоким рабочим коэффициентом (то есть замедлять его), поэтому атаки методом «грубой силы» (угадывание с помощью каждого возможного пароля) занимают слишком много времени, чтобы быть осуществимым.
С помощью этого метода единственной строкой, которую вы когда-либо сохраняете в своем коде, является исходный вывод любой используемой вами функции « Get-Hash
» (псевдокод), что делает очень трудным, если не невозможным, получение исходного пароля из вашего источника. код.
Защита файла с помощью пароля
Однако, хотя это и хранит пароль в секрете, оно на самом деле не дает никаких преимуществ в плане безопасности. Как сказал Бен, на самом деле ничто не мешает пользователю вручную запустить Copy-Item
или даже просто скопировать файл с помощью Windows Explorer.
Для такого типа безопасности вам необходимо использовать списки контроля доступа Windows и отдельную учетную запись пользователя, которая фактически аутентифицирована в другом месте (например, с помощью команд входа в ОС Windows /runas). Вам нужна внешняя служба или учетная запись для выполнения копирования, потому что вам нужно убедиться, что у пользователя нет прямого доступа для обхода сценария.
Если это невозможно для вас (например, из-за того, что вы распространяете файлы вместе со сценарием, но не являетесь администратором машины), то вам следует зашифровать файл. Зашифровав файл паролем, вы убедитесь, что файл бесполезен без пароля (и, следовательно, копирование файла бесполезно, поскольку он остается нечитаемым до его расшифровки).
Теперь это можно сделать с помощью PowerShell, но есть и другие, более простые способы. Простой общий метод - сохранить файл в зашифрованном архиве, таком как ZIP 1, RAR, 7z и т.д., Где пользователь должен предоставить пароль для извлечения. Кроме того, сами PDF-файлы включают в себя поддержку шифрования, для которого требуется пароль, прежде чем их можно будет прочитать.
1 Обратите внимание, что встроенная в Windows криптографическая поддержка ZIP в XP до 7, возможно 8 и 10, не поддерживает AES. Он поддерживает только небезопасное устаревшее шифрование ZIP. Так что вам понадобятся сторонние инструменты для извлечения или самораспаковывающийся архив (exe).