Вопрос

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

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

Это было полезно?

Решение

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

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 файл..Аутентификацию локального приложения сложно выполнить хорошо.Вам придется шифровать любые считываемые данные, используя пароль пользователя, и, как правило, быть очень осторожным.

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

dbr сказал:

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

Это действительно небезопасный способ хэширования паролей.Ты не хочу это сделать.Если вы хотите знать, почему, прочтите Бикрипт Бумага ребятами, которые создали систему хеширования паролей для 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.Это масштабируемый фактор стоимости в этой системе.Вам нужно будет провести тестирование, чтобы определить, какое исключительное время вы хотите ждать для вычисления каждого хеша по сравнению с риском атаки на ваш файл паролей на основе автономного словаря.

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

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

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

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

Если вы хотите простоты, используйте словарь, где ключи — это имена пользователей, а значения — пароли (зашифрованные чем-то вроде 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"

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

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-аутентификация-на-стороннем-сайте

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

>>> import md5
>>> hh = md5.new()
>>> hh.update('anoop')
>>> hh.digest
<built-in method digest of _hashlib.HASH object at 0x01FE1E40>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top