API аутентификации Python - PullRequest
       16

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

6 голосов
/ 16 сентября 2008

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

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

Ответы [ 6 ]

10 голосов
/ 17 сентября 2008

дбр сказал:

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

Это действительно небезопасный способ хэширования паролей. Вы не хотите сделать это. Если вы хотите узнать, зачем читали Bycrypt Paper от тех, кто занимался системой хеширования паролей для OpenBSD. Кроме того, если вы хотите получить хорошую дискуссию о том, как пароли взломаны, прочитайте это интервью с автором Джека Потрошителя (популярного взломщика паролей Unix).

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

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

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

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

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

3 голосов
/ 16 сентября 2008

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

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

0 голосов
/ 08 мая 2012

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

>>> import md5
>>> hh = md5.new()
>>> hh.update('anoop')
>>> hh.digest
<built-in method digest of _hashlib.HASH object at 0x01FE1E40>
0 голосов
/ 02 января 2010
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-a-party-site

0 голосов
/ 16 сентября 2008

Обрабатывать следующее как псевдокод ..

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

0 голосов
/ 16 сентября 2008

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

Например:

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"

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

...