У меня есть скрипт Python, который создает соединение ODBC. Соединение ODBC создается с помощью строки подключения. В этой строке подключения я должен указать имя пользователя и пароль для этого подключения.
Есть ли простой способ скрыть этот пароль в файле (просто чтобы никто не мог прочитать пароль, когда я редактирую файл)?
Ответы:
Кодировка Base64 находится в стандартной библиотеке и подойдет, чтобы остановить серферов по плечу:
источник
base64
это лучше запутать, чемrot13
в данном контексте. Напротив,base64
имеет свои типичные характеристики (знак равенства, ...) и поэтому его легче обнаружить, чем другие подходы. Однако всякая обфускация не имеет практической пользы. Действительно плохо, что этот ответ так высоко оценен. Это просто дает ложное чувство безопасности ...base64
предпочтительнее,rot13
чем в стандартной библиотеке Python.Douglas F Shearer's - это обычно одобренное решение в Unix, когда вам нужно указать пароль для удаленного входа в систему.
Вы добавляете параметр --password-from-file, чтобы указать путь и прочитать открытый текст из файла.
После этого файл может находиться в собственной области пользователя, защищенной операционной системой. Это также позволяет различным пользователям автоматически выбирать свой собственный файл.
Для паролей, которые пользователю сценария не разрешено знать - вы можете запустить сценарий с повышенным разрешением и иметь файл паролей, принадлежащий этому пользователю root / admin.
источник
Вот простой способ:
Это должно быть немного безопаснее, чем декодирование base64, хотя оно уязвимо для декомпилятора py_to_pyc.
источник
import peekabo
пароль доступен какpeekaboo.password
(если peekaboo.py содержитсяpassword='secret'
)cythonizing
вашего скрипта и, поделившись сгенерированным двоичным файлом, вы получите преимущество этого ответа + добавьте еще один уровень обфускации, потому что теперь у вас есть декомпилированный код C, чтобы получить пароль. Это не на 100% безопасно, но потребуется много усилий, чтобы добраться до конфиденциальных данных, которые вы хотите скрыть.Если вы работаете в системе Unix, воспользуйтесь преимуществами модуля netrc в стандартной библиотеке Python. Он считывает пароли из отдельного текстового файла (.netrc), формат которого описан здесь .
Вот небольшой пример использования:
источник
Лучшее решение, предполагающее, что имя пользователя и пароль не могут быть указаны пользователем во время выполнения, вероятно, представляет собой отдельный исходный файл, содержащий только инициализацию переменных для имени пользователя и пароля, которые импортируются в ваш основной код. Этот файл потребуется редактировать только при изменении учетных данных. В противном случае, если вас беспокоят только плечевые серферы со средней памятью, кодировка base 64, вероятно, будет самым простым решением. ROT13 слишком легко декодировать вручную, он не чувствителен к регистру и сохраняет слишком много смысла в зашифрованном состоянии. Закодируйте свой пароль и идентификатор пользователя вне сценария Python. Он должен декодировать сценарий во время выполнения для использования.
Предоставление учетных данных сценариям для автоматизированных задач - всегда рискованное предложение. У вашего сценария должны быть собственные учетные данные, а используемая им учетная запись не должна иметь доступа, кроме необходимого. По крайней мере, пароль должен быть длинным и случайным.
источник
Как насчет импорта имени пользователя и пароля из файла, внешнего по отношению к сценарию? Таким образом, даже если кто-то завладеет скриптом, он не получит пароль автоматически.
источник
base64 - это способ удовлетворить ваши простые потребности. Импортировать ничего не нужно:
источник
для обфускации python3 использование
base64
выполняется иначе:что приводит к
и декодирование обратно в исходную строку
чтобы использовать этот результат там, где требуются строковые объекты, можно перевести объект байтов
для получения дополнительной информации о том, как python3 обрабатывает байты (и соответственно строки), см. официальную документацию .
источник
Это довольно распространенная проблема. Обычно лучшее, что вы можете сделать, - это либо
A) создать какую-то функцию шифрования ceasar для кодирования / декодирования (только не rot13) или
Б) предпочтительным методом является использование ключа шифрования, доступного для вашей программы, для кодирования / декодирования пароля. В котором вы можете использовать защиту файлов для защиты доступа к ключу.
В соответствии с этими строками, если ваше приложение работает как служба / демон (например, веб-сервер), вы можете поместить свой ключ в защищенное паролем хранилище ключей с вводом пароля как часть запуска службы. Для перезапуска вашего приложения потребуется администратор, но у вас будет действительно хорошая защита для ваших паролей конфигурации.
источник
Ваша операционная система, вероятно, предоставляет средства для безопасного шифрования данных. Например, в Windows есть DPAPI (API защиты данных). Почему бы не спросить у пользователя их учетные данные при первом запуске, а затем зашифровать их для последующих запусков?
источник
Больше отечественной оценки, а не преобразования аутентификации / паролей / имени пользователя в зашифрованные данные. FTPLIB - это всего лишь пример. " pass.csv " - это имя файла csv.
Сохраните пароль в CSV, как показано ниже:
user_name
пользовательский пароль
(Без заголовка столбца)
Чтение CSV и сохранение его в списке.
Использование элементов списка в качестве деталей аутентификации.
Полный код.
источник
Вот мой фрагмент на такую штуку. Вы в основном импортируете или копируете функцию в свой код. getCredentials создаст зашифрованный файл, если он не существует, и вернет словарь, а updateCredential обновится.
источник
Поместите информацию о конфигурации в зашифрованный файл конфигурации. Запросите эту информацию в своем коде с помощью ключа. Поместите этот ключ в отдельный файл для каждой среды и не храните его вместе с кодом.
источник
Вы знаете яму?
https://pypi.python.org/pypi/pit (только для py2 (версия 0.3))
https://github.com/yoshiori/pit (будет работать на py3 (текущая версия 0.4))
test.py
Бегать:
~ / .Pit / default.yml:
источник
/usr/lib/python3.7/site-packages/pit.py:93: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details. return yaml.load(open(Pit._config))
Если вы работаете в Windows, вы можете рассмотреть возможность использования библиотеки win32crypt. Он позволяет хранить и извлекать защищенные данные (ключи, пароли) пользователем, который запускает скрипт, поэтому пароли никогда не хранятся в открытом тексте или в запутанном формате в вашем коде. Я не уверен, есть ли эквивалентная реализация для других платформ, поэтому при строгом использовании win32crypt ваш код не переносится.
Я считаю, что модуль можно получить здесь: http://timgolden.me.uk/pywin32-docs/win32crypt.html
источник
Я сделал это следующим образом:
В оболочке Python:
Затем создайте модуль со следующим кодом:
Как только вы это сделаете, вы можете либо напрямую импортировать mypassword, либо импортировать токен и шифр для дешифрования по мере необходимости.
Очевидно, у этого подхода есть некоторые недостатки. Если у кого-то есть и токен, и ключ (как если бы у них был сценарий), он мог легко расшифровать. Однако он запутывается, и если вы скомпилируете код (с чем-то вроде Nuitka), по крайней мере, ваш пароль не будет отображаться в виде обычного текста в шестнадцатеричном редакторе.
источник
Это не совсем ответ на ваш вопрос, но это связано. Я собирался добавить в качестве комментария, но мне не разрешили. Я столкнулся с этой же проблемой, и мы решили предоставить скрипт пользователям, использующим Jenkins. Это позволяет нам хранить учетные данные db в отдельном файле, который зашифрован и защищен на сервере и недоступен для пользователей, не являющихся администраторами. Это также позволяет нам немного ускорить создание пользовательского интерфейса и регулирование выполнения.
источник
Вы также можете рассмотреть возможность хранения пароля вне сценария и предоставления его во время выполнения.
например, fred.py
который можно запустить как
Дополнительные уровни «безопасности через неясность» могут быть достигнуты путем использования
base64
(как предложено выше), использования менее очевидных имен в коде и дальнейшего отделения фактического пароля от кода.Если код находится в репозитории, часто бывает полезно хранить секреты вне него , чтобы можно было добавить его
~/.bashrc
(или в хранилище, или сценарий запуска, ...)и изменить
fred.py
назатем повторно авторизуйтесь и
источник
Почему бы не использовать простой xor?
Преимущества:
Я дохожу до того, что распознаю простые строки b64 для общих слов, а также rot13. Xor сделает это намного сложнее.
источник
источник
В сети есть несколько утилит ROT13, написанных на Python - просто погуглите. ROT13 кодирует строку в автономном режиме, копирует ее в источник, декодирует в точке передачи.
Но это действительно слабая защита ...
источник