Защита Паролем Python



Я новичок, поэтому, если этот вопрос звучит глупо, пожалуйста, потерпите меня.



Мне интересно, что когда мы пишем код для проверки имени пользователя / пароля в python, если он не скомпилирован в exe ie script state, не будут ли люди легко открывать файл и удалять кодовое зелье, которое делает проверку пароля?

Я предполагаю, что вся программа полностью написана в python, Нет C или C++.

Даже если я использую такую программу, как py2exe, ее можно легко декомпилировать обратно в исходный код. Значит ли это, что бесполезно проверять пароль?

Как профессиональные программисты справляются с этим?

1269   7  

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
'$5$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 :(")

Django-scrypt

Если вы выполняете проверку на компьютере пользователя, он может редактировать код так, как ему нравится, в значительной степени независимо от того, что вы делаете. Если вам нужна такая безопасность, то код должен быть запущен в недоступном месте, например на сервере. "Не доверяйте клиенту" - это важный принцип компьютерной безопасности.

Я думаю, что вы хотите сделать серверный скрипт, к которому можно получить доступ только по паролю, данному ему клиентской программой. Эта серверная программа будет работать очень много как и в примере кода, приведенном в других ответах: при создании нового клиента они посылают открытый текстовый пароль на сервер, который помещает его через одностороннее шифрование и сохраняет его. Затем, когда клиент хочет использовать код, который является основной частью вашей программы, он отправляет пароль. Сервер использует одностороннее шифрование и проверяет, соответствует ли он сохраненным хэшированным паролям. Если это так, он выполняет код в основном теле программы и отправляет результат обратно на сервер. пользователь.

По смежной теме другие ответы предлагают использовать алгоритм md5. Однако это не самый безопасный алгоритм - в то время как достаточно безопасный для многих целей, Модуль 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 адресуют это) и надеяться, что он достаточно умен, чтобы защитить свой компьютер от вредоносных программ.

Если вы не доверяете авторизованному пользователю (он же 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()

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

Comments

    Ничего не найдено.