Защита Паролем Python
Я новичок, поэтому если этот вопрос звучит глупо, пожалуйста, медведь со мной.
мне интересно, что когда мы пишем код для проверки имени пользователя/пароля в python, если он не скомпилирован в exe ie script state
, не будут ли люди легко открыть файл и удалить код зелье, которое делает проверку пароля?
Я предполагаю, что вся программа полностью написана на python
, нет C
или C++
.
даже если я использую такую программу, как py2exe
он может быть легко декомпилируется обратно в исходный код. Значит ли это, что бесполезно проверять пароль?
как профессиональные программисты справляются с этим?
7 ответов
Edit: ваш пересмотренный вопрос дает понять, что вы обеспокоены тем, что люди редактируют код, чтобы обойти проверку пароля. Да, это вполне возможно. Вы можете доставить свой код .форма pyc, но это не обязательно помешает кому-то декомпилировать и изменить ее. К сожалению, Python просто не предназначен для предотвращения изменения кода. Лучшее, что вы можете сделать, это выполнить какую-то транзакцию аутентификации с защищенным сервером, чтобы независимо от того, как кто-то изменяет код, они не могу обойти этот шаг. В зависимости от вашего точного приложения, это может быть излишним.
проблема управления аутентификацией пароля-сложная проблема безопасности, на которую люди тратят всю карьеру. Однако вот некоторая информация об этом, которая предполагает, что вы пытаетесь свернуть свою собственную аутентификацию пароля с нуля:
даже для случайной защиты паролем, как правило, пароли пользователей не хранятся в виде открытого текста. Вместо, обычно надежная односторонняя хэш-функция используется для создания битового шаблона, который не похож на пароль. При вводе пароля применяется та же хэш-функция и сравниваются битовые шаблоны. Если они одинаковы, вероятность того, что пароль был введен правильно, довольно высока.
Что представляет собой "надежную" хэш-функцию, сложно. Некоторые из них широко используются, а некоторые из общих хэш-функций подвержены известным эксплойтам.
Noelkd предоставляет некоторый код, который демонстрирует этот подход, хотя MD5, который использует его код, (я считаю), который был скомпрометирован до такой степени, что есть лучшие варианты. Эта статья также предлагает некоторый код, чтобы сделать что-то подобное:
аутентификация пользователей и паролей в Python
Если ваша проблема заключается в сохранении фактического пароля, который вы должны передать в базу данных SQLite в открытом тексте, это другая проблема. Большую часть времени, Я видел такие пароли, хранящиеся в открытом тексте в скриптах или файле конфигурации, и приложение структурировано таким образом, что компрометация этого пароля является вопросом скромного риска.
вы можете проверить хэш того, что пользователь ввел против хэш вашего пароля, чтобы проверить, если пользователь ввел правильный пароль, я сделал очень простой пример, чтобы показать это:
""" Python Password Check """
import hashlib
import sys
password = "2034f6e32958647fdff75d265b455ebf"
def main():
# Code goes here
print "Doing some stuff"
sys.exit(0)
while True:
input = raw_input("Enter password: ")
if hashlib.md5(input).hexdigest() == password:
print "welcome to the program"
main()
else:
print "Wrong Password"
в Примере хэшированный пароль "secretpassword"
который хэши "2034f6e32958647fdff75d265b455ebf"
так как вы можете видеть, даже если исходный код декомпилирован, вы все равно можете видеть только хэш пароля, а не текст плана пароля.
чтобы дать это немного обновления для 2016, в настоящее время, если ваши пароли хэширования в python вы должны смотреть на одну из трех следующих библиотек:
passlib
>>> # import the hash algorithm
>>> from passlib.hash import sha256_crypt
>>> # generate new salt, and hash a password
>>> hash = sha256_crypt.encrypt("toomanysecrets")
>>> hash
'$rounds=80000$zvpXD3gCkrt7tw.1$QqeTSolNHEfgryc5oMgiq1o8qCEAcmye3FoMSuvgToC'
>>> # verifying the password
>>> sha256_crypt.verify("toomanysecrets", hash)
True
>>> sha256_crypt.verify("joshua", hash)
False
пример снят с здесь
bcrypt
import bcrypt
password = b"super secret password"
# Hash a password for the first time, with a certain number of rounds
hashed = bcrypt.hashpw(password, bcrypt.gensalt(14))
# Check that a unhashed password matches one that has previously been
# hashed
if bcrypt.hashpw(password, hashed) == hashed:
print("It Matches!")
else:
print("It Does not Match :(")
Джанго-скрипт
Если вы делаете проверку на машине пользователя, они могут редактировать код, как им нравится, в значительной степени независимо от того, что вы делаете. Если вам нужна такая безопасность, то код должен быть запущен в недоступном месте, например на сервере. "Не доверяйте клиенту" - важный принцип компьютерной безопасности.
Я думаю, что вы хотите сделать сценарий сервера, к которому можно получить доступ только с помощью пароля, данного ему клиентской программой. Эта серверная программа будет работать очень как и в примере кода, приведенном в других ответах: при создании нового клиента они отправляют открытый текстовый пароль на сервер, который помещает его через одностороннее шифрование и сохраняет его. Затем, когда клиент хочет использовать код, который является основной частью вашей программы, они отправляют пароль. Сервер помещает это через одностороннее шифрование и видит, соответствует ли оно любым сохраненным хэшированным паролям. Если это так, он выполняет код в основной части программы и отправляет результат обратно в пользователь.
по связанной теме другие ответы предлагают использовать . Однако это не самый безопасный алгоритм - в то время как достаточно безопасный для многих целей,hashlib
модуль в стандартной библиотеке дает другие, более безопасные алгоритмы, и нет причин не использовать эти.
на сервере только администраторы сервера должны иметь право менять код. Следовательно, чтобы изменить код, вы должны иметь доступ администратора, и если вы это сделаете, то вы можете получить доступ ко всему в любом случае. :-)
то же самое касается клиентской программы. Если единственной защитой является проверка пароля, вам не нужно обходить проверку пароля, вы можете просто прочитать файлы данных напрямую.
в обоих случаях, чтобы предотвратить людей, которые имеет доступ к файлам от чтения этих файлов недостаточно для проверки пароля. Вы должны зашифровать данные.
давайте начнем с основного сейчас, не так ли? При выполнении шифрования пароля учетных данных для входа в систему мы всегда должны делать одностороннее шифрование. Один из способов шифрования означает, что вы не можете расшифровать текст после его шифрования. Там шифрование называется md5
которых только один способ шифрования.
для него уже доступна библиотека в Python под названием hashlib
.
из документов python:
>>> import hashlib
>>> m = hashlib.md5()
>>> m.update("Nobody inspects")
>>> m.update(" the spammish repetition")
>>> m.digest()
'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
>>> m.digest_size
16
>>> m.block_size
64
подробнее об этом: http://docs.python.org/2/library/hashlib.html?highlight=hashlib#hashlib
чтобы защитить данные, хранящиеся на клиентском компьютере, вы должны зашифровать их. Период.
Если Вы доверяете авторизованному пользователю, вы можете использовать ключ шифрования на основе пароля (многие другие ответы на Stack Exchange адресуют это) и надеяться, что он достаточно умен, чтобы защитить свой компьютер от вредоносных программ.
Если вы не доверяйте авторизованному пользователю (a.к. a. DRM) вам просто не повезло-найдите другой проект.;-)
Я провел последние пару дней, уточняя это и запуская его через взломщики паролей, и он, кажется, держится довольно сильно.
вот мой код для вас, чтобы смотреть на:
import time
import os
import random
import string
passwordScore = 0
def optionOne():
global passwordScore
#Code for checking a password
os.system('cls')
print('Option One has been selected')
password = input('Please type in your password here: ')
#Password check begins
if (len(password) > 7) and (password.isspace() == False):
#Check for capitalisation
for p in password:
if p.isupper() == True:
passwordScore += 1
else:
pass
passwordScore += 2
for s in string.punctuation:
#Beginning test for special letters
for p in password:
if s == p:
passwordScore += 1
else:
pass
else:
pass
# Returning results to the user
if passwordScore >= 5:
print('Your password is safe enough to use')
time.sleep(2)
elif passwordScore == 3:
print('We believe your password could be safer')
time.sleep(2)
else:
print('Your password is not safe enough to use')
print('using this password may place your data at risk')
time.sleep(2)
def optionTwo():
#Code for creating a password at random
print('Option Two has been selected')
chars = string.ascii_uppercase + string.ascii_lowercase + string.digits + string.punctuation
size = random.randint(8, 12)
newPassword = ''.join(random.choice(chars) for x in range(size))
print(newPassword)
def start():
print('Option 1: Check my passsword')
print('Option 2: Create a password')
option = input('Please chose your option here [ENTER]: ')
if option == '1':
#Option 1 has been selected
return optionOne()
elif option == '2':
#Option 2 has been selected
return optionTwo()
else:
#An error has occured
print('You have not selected a valid option')
time.sleep(1)
os.system('cls')
return start()
for i in range(1):
start()
Это должно сделать работу почти для всего, пока вы настраиваете ее на свои потребности!!