Скрытие пароля в скрипте Python (только небезопасное запутывание) - PullRequest
113 голосов
/ 01 октября 2008

У меня есть скрипт Python, который создает соединение ODBC. Соединение ODBC создается со строкой соединения. В этой строке подключения я должен указать имя пользователя и пароль для этого подключения.

Существует ли простой способ скрыть этот пароль в файле (просто никто не может прочитать пароль при редактировании файла)?

Ответы [ 16 ]

101 голосов
/ 01 октября 2008

Base64 кодировка находится в стандартной библиотеке и предназначена для остановки серферов:

>>> import base64
>>> print base64.b64encode("password")
cGFzc3dvcmQ=
>>> print base64.b64decode("cGFzc3dvcmQ=")
password
48 голосов
/ 01 октября 2008

Douglas F Shearer - это общепринятое решение в Unix, когда вам нужно указать пароль для удаленного входа.
Вы добавляете параметр - пароль из файла , чтобы указать путь и читать открытый текст из файла.
Затем файл может находиться в собственной области пользователя, защищенной операционной системой. Это также позволяет различным пользователям автоматически выбирать свой собственный файл.

Для паролей, которые пользователь скрипта не может знать - вы можете запустить скрипт с разрешенным разрешением и иметь файл паролей, принадлежащий этому пользователю root / admin.

41 голосов
/ 02 апреля 2014

Вот простой метод:

  1. Создайте модуль python - назовем его peekaboo.py.
  2. В peekaboo.py включите как пароль, так и любой код, для которого требуется этот пароль
  3. Создайте скомпилированную версию peekaboo.pyc, импортировав этот модуль (через командную строку python и т. Д.)
  4. Теперь удалите peekaboo.py.
  5. Теперь вы можете счастливо импортировать peekaboo, полагаясь только на peekaboo.pyc. Поскольку peekaboo.pyc скомпилирован в байтах, он не доступен для чтения обычному пользователю.

Это должно быть немного более безопасно, чем декодирование base64 - хотя оно уязвимо для декомпилятора py_to_pyc.

25 голосов
/ 23 июня 2011

Если вы работаете в системе Unix, воспользуйтесь модулем netrc в стандартной библиотеке Python. Он считывает пароли из отдельного текстового файла (.netrc), формат которого указан здесь .

Вот небольшой пример использования:

import netrc

# Define which host in the .netrc file to use
HOST = 'mailcluster.loopia.se'

# Read from the .netrc file in your home directory
secrets = netrc.netrc()
username, account, password = secrets.authenticators( HOST )

print username, password
18 голосов
/ 01 октября 2008

Лучшее решение, если предположить, что имя пользователя и пароль не могут быть заданы пользователем во время выполнения, возможно, это отдельный исходный файл, содержащий только переменную инициализацию для имени пользователя и пароля, которая импортируется в ваш основной код. Этот файл нужно будет редактировать только при изменении учетных данных. В противном случае, если вас беспокоит только плечо серферов со средним объемом памяти, кодировка base 64, вероятно, является самым простым решением. ROT13 просто слишком легко декодировать вручную, он не чувствителен к регистру и сохраняет слишком много значения в зашифрованном состоянии. Кодируйте свой пароль и идентификатор пользователя вне скрипта Python. У него есть сценарий декодирования во время выполнения для использования.

Предоставление учетных данных сценариев для автоматизированных задач всегда является рискованным предложением. Ваш сценарий должен иметь свои собственные учетные данные, а используемая им учетная запись не должна иметь доступа, кроме той, которая необходима. По крайней мере, пароль должен быть длинным и довольно случайным.

16 голосов
/ 01 октября 2008

Как насчет импорта имени пользователя и пароля из файла, внешнего по отношению к сценарию? Таким образом, даже если кто-то получит скрипт, он не получит пароль автоматически.

15 голосов
/ 02 октября 2008

base64 - это способ удовлетворить ваши простые потребности. Нет необходимости импортировать что-либо:

>>> 'your string'.encode('base64')
'eW91ciBzdHJpbmc=\n'
>>> _.decode('base64')
'your string'
4 голосов
/ 01 октября 2008

Это довольно распространенная проблема. Как правило, лучшее, что вы можете сделать, это либо

A) создайте некую функцию шифрования ceasar для кодирования / декодирования (только не rot13) или же Б) предпочтительный метод - использовать ключ шифрования, в пределах досягаемости вашей программы, кодировать / декодировать пароль. В котором вы можете использовать защиту файлов для защиты доступа к ключу. Кроме того, если ваше приложение работает как сервис / демон (например, веб-сервер), вы можете поместить свой ключ в хранилище ключей, защищенное паролем, и ввести пароль как часть запуска службы. Для перезапуска вашего приложения потребуется админ, но у вас будет действительно хорошая предварительная защита для ваших паролей конфигурации.

2 голосов
/ 03 апреля 2019

для python3 обфускация с использованием base64 выполняется по-другому:

import base64
base64.b64encode(b'PasswordStringAsStreamOfBytes')

, что приводит к

b'UGFzc3dvcmRTdHJpbmdBc1N0cmVhbU9mQnl0ZXM='

обратите внимание на неформальное строковое представление, фактическая строка в кавычках

и декодирование обратно в исходную строку

base64.b64decode(b'UGFzc3dvcmRTdHJpbmdBc1N0cmVhbU9mQnl0ZXM=')
b'PasswordStringAsStreamOfBytes'

для использования этого результата, когда требуются строковые объекты, объект байтов может быть переведен

repr = base64.b64decode(b'UGFzc3dvcmRTdHJpbmdBc1N0cmVhbU9mQnl0ZXM=')
secret = repr.decode('utf-8')
print(secret)

для получения дополнительной информации о том, как python3 обрабатывает байты (и соответственно строки), см. Официальную документацию .

2 голосов
/ 30 мая 2013

Больше доморощенных appraoch вместо преобразования аутентификации / паролей / имени пользователя в зашифрованные данные FTPLIB - только пример. « pass.csv » - это имя файла csv

Сохранить пароль в CSV, как показано ниже:

user_name

user_password

(без заголовка столбца)

Чтение CSV и сохранение его в список.

Использование элементов списка в качестве деталей аутентификации.

Полный код.

import os
import ftplib
import csv 
cred_detail = []
os.chdir("Folder where the csv file is stored")
for row in csv.reader(open("pass.csv","rb")):       
        cred_detail.append(row)
ftp = ftplib.FTP('server_name',cred_detail[0][0],cred_detail[1][0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...