API аутентификации Python

Я ищу библиотеку Python, которая поможет мне создать метод аутентификации для настольного приложения, которое я пишу. Я нашел несколько методов в веб-фреймворке, таких как django или turbogears.

Мне просто нужна своего рода ассоциация имени пользователя и пароля, хранящаяся в локальном файле. Я могу написать это сам, но я действительно, что он уже существует и будет лучшим решением (я не очень хорошо владею шифрованием).

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
0
10 018
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я думаю, вам следует создать свой собственный метод аутентификации, поскольку вы можете сделать его наиболее подходящим для вашего приложения, но использовать библиотеку для шифрования, такую ​​как пикрипто или какую-либо другую более легкую библиотеку.

кстати, если вам нужны двоичные файлы Windows для pycrypto, вы можете получить их здесь

Спасибо за ссылку на pycripto. Это поможет легко создать процесс шифрования, который мне не нравится.

Bertrand 16.09.2008 13:39

Если вы хотите простого, используйте словарь, где ключи - это имена пользователей, а значения - пароли (зашифрованные чем-то вроде SHA256). Соленый огурец это на диск / с диска (поскольку это настольное приложение, я предполагаю, что накладные расходы на его хранение в памяти будут незначительными).

Например:

import pickle
import hashlib

# Load from disk
pwd_file = "mypasswords"
if os.path.exists(pwd_file):
    pwds = pickle.load(open(pwd_file, "rb"))
else:
    pwds = {}

# Save to disk
pickle.dump(pwds, open(pwd_file, "wb"))

# Add password
pwds[username] = hashlib.sha256(password).hexdigest()

# Check password
if pwds[username] = hashlib.sha256(password).hexdigest():
   print "Good"
else:
   print "No match"

Обратите внимание, что при этом пароли хранятся в виде хэш, поэтому их невозможно восстановить. Если вы потеряете свой пароль, вам будет назначен новый, а не вернуть старый.

Ответ принят как подходящий

Рассматривайте следующее как псевдокод ..

try:
    from hashlib import sha as hasher
except ImportError:
    # You could probably exclude the try/except bit,
    # but older Python distros dont have hashlib.
    try:
        import sha as hasher
    except ImportError:
        import md5 as hasher


def hash_password(password):
    """Returns the hashed version of a string
    """
    return hasher.new( str(password) ).hexdigest()

def load_auth_file(path):
    """Loads a comma-seperated file.
    Important: make sure the username
    doesn't contain any commas!
    """
    # Open the file, or return an empty auth list.
    try:
        f = open(path)
    except IOError:
        print "Warning: auth file not found"
        return {}

    ret = {}
    for line in f.readlines():
        split_line = line.split(",")
        if len(split_line) > 2:
            print "Warning: Malformed line:"
            print split_line
            continue # skip it..
        else:
            username, password = split_line
            ret[username] = password
        #end if
    #end for
    return ret

def main():
    auth_file = "/home/blah/.myauth.txt"
    u = raw_input("Username:")
    p = raw_input("Password:") # getpass is probably better..
    if auth_file.has_key(u.strip()):
        if auth_file[u] == hash_password(p):
            # The hash matches the stored one
            print "Welcome, sir!"

Вместо использования файла с разделителями-запятыми я бы рекомендовал использовать SQLite3 (который можно использовать для других настроек и т. д.

Кроме того, помните, что это не очень безопасно - если приложение является локальным, злоумышленники, вероятно, могут просто заменить файл ~/.myauth.txt. Локальную аутентификацию приложения трудно сделать правильно. Вам придется зашифровать любые данные, которые он читает, используя пароль пользователя, и, как правило, будьте очень осторожны.

Это очень небезопасно. вообще не предлагается.

Kiarash 26.07.2013 06:56

dbr сказал:

def hash_password(password):
    """Returns the hashed version of a string
    """
    return hasher.new( str(password) ).hexdigest()

Это действительно небезопасный способ хеширования паролей. Вы, не, хотите это сделать. Если вы хотите знать, зачем читать Бумага Bycrypt парней, которые создавали систему хеширования паролей для OpenBSD. Кроме того, если вы хотите хорошо обсудить, как взламываются пароли, ознакомьтесь с это интервью с автором Jack the Ripper (популярный взломщик паролей unix).

Теперь B-Crypt великолепен, но я должен признать, что не использую эту систему, потому что у меня не было доступного алгоритма EKS-Blowfish, и я не хотел реализовывать его самостоятельно. Я использую слегка обновленную версию системы FreeBSD, которую я опубликую ниже. Суть в следующем. Не просто хешируйте пароль. Солите пароль, затем хешируйте пароль и повторите примерно 10 000 раз.

Если это не имело смысла, вот код:

#note I am using the Python Cryptography Toolkit
from Crypto.Hash import SHA256

HASH_REPS = 50000

def __saltedhash(string, salt):
    sha256 = SHA256.new()
    sha256.update(string)
    sha256.update(salt)
    for x in xrange(HASH_REPS): 
        sha256.update(sha256.digest())
        if x % 10: sha256.update(salt)
    return sha256

def saltedhash_bin(string, salt):
    """returns the hash in binary format"""
    return __saltedhash(string, salt).digest()

def saltedhash_hex(string, salt):
    """returns the hash in hex format"""
    return __saltedhash(string, salt).hexdigest()

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

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

надеюсь это поможет, Тим

import hashlib
import random

def gen_salt():
    salt_seed = str(random.getrandbits(128))
    salt = hashlib.sha256(salt_seed).hexdigest()
    return salt

def hash_password(password, salt):
    h = hashlib.sha256()
    h.update(salt)
    h.update(password)
    return h.hexdigest()

#in datastore
password_stored_hash = "41e2282a9c18a6c051a0636d369ad2d4727f8c70f7ddeebd11e6f49d9e6ba13c"
salt_stored = "fcc64c0c2bc30156f79c9bdcabfadcd71030775823cb993f11a4e6b01f9632c3"

password_supplied = 'password'

password_supplied_hash = hash_password(password_supplied, salt_stored)
authenticated = (password_supplied_hash == password_stored_hash)
print authenticated #True

см. также gae-Authenticate-to-a-3rd-party-site

Используйте "md5", это намного лучше, чем base64

>>> import md5
>>> hh = md5.new()
>>> hh.update('anoop')
>>> hh.digest
<built-in method digest of _hashlib.HASH object at 0x01FE1E40>

Другие вопросы по теме