У меня есть приведенный ниже myscript.ps1 который я использую для запроса имени пользователя и пароля, и в зависимости от этого он копирует файл в определенное место назначения. Я хотел сделать этот myscript.ps1 защищенным, чтобы никто не мог отредактировать его и увидеть имя пользователя и пароль, и я нашел найденное здесь решение, которое преобразует скрипт powershell в файл .exe . Когда я первоначально запускаю скрипт с использованием powershell, появляется приведенная ниже форма учетных данных, позволяющая мне ввести имя пользователя и пароль. Но после того, как .exe сгенерирован, и когда я его запускаю, форма учетных данных больше не появляется, вместо этого появляется косолье со словами «Credential:» Я не знаю, почему? Я хочу, чтобы форма учетных данных все еще появлялась при запуске exe. Любые мысли, пожалуйста?

$credentials = Get-Credential
if ($credentials.Username -eq "user1" -And $credentials.GetNetworkCredential().password -eq "pass1") 
{ Copy-Item "test1.pdf" "\test\test1.pdf"; } 
else 
{ Copy-Item "test2.pdf" "\test\test2.pdf"; }

Вывод при запуске скрипта через powershell:

Вывод при запуске сгенерированного exe-файла:

2 ответа2

1

Хранение паролей в секрете в исходном коде

Сначала я постараюсь ответить на ваш прямой вопрос:

Я хотел сделать этот 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).

0

Если пользователь может выполнить скрипт, он может прочитать его содержимое. (Вы можете выполнить скрипт, только если знаете, что написано, иначе вы не знаете, что запускать.) Поэтому невозможно, чтобы пользователь одновременно мог использовать ваш скрипт и не мог прочитать пароль из него. Вы можете включить пароль в качестве криптографического хэша, но если этот скрипт запускается как обычный пользователь, пользователь может просто обойти скрипт и скопировать test1.pdf в место назначения, не запуская ваш скрипт вообще.

Вместо этого вы должны применить элементы управления доступом к файлам / папкам назначения, чтобы привилегированная операция выполнялась как аутентифицированный пользователь. Затем вы можете указать предоставленные пользователем учетные данные в качестве параметра Start-Job в -Credential .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .