سؤال

أنا أبحث عن مكتبة بيثون التي من شأنها أن تساعد لي أن إنشاء أسلوب المصادقة على سطح المكتب التطبيق أنا أكتب.لقد وجدت عدة الأسلوب في إطار الشبكة مثل django أو turbogears.

أريد فقط نوع من اسم المستخدم-كلمة جمعية المخزنة في ملف محلي.أستطيع أن أكتب بنفسي, ولكن أنا حقا كان موجودا بالفعل و سوف يكون أفضل حل (أنا لا يجيد جدا مع التشفير).

هل كانت مفيدة؟

المحلول

علاج التالية الزائفة رمز..

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()

هذا هو حقا آمنة طريقة تجزئة كلمات السر.لك لا تريد أن تفعل هذا.إذا كنت تريد أن تعرف لماذا قراءة Bycrypt الورق من قبل الرجال الذين لم تجزئة كلمة مرور نظام اكبر برهان.بالإضافة إلى ذلك إذا كان يريد مناقشة جيدة حول كيفية كسر كلمات المرور تحقق هذه المقابلة مع الكاتب جاك السفاح (شعبية unix password cracker).

الان ب-Crypt كبيرة ولكن يجب أن أعترف أنني لا تستخدم هذا النظام لأنه لم يكن لدى EKS-خوارزمية السمكة المنتفخة المتاحة ولا تريد تنفيذ ذلك نفسي.أنا استخدم قليلا من النسخة المحدثة من فري النظام الذي سوف أنشر أدناه.هذا جوهر.لا مجرد تجزئة كلمة المرور.الملح كلمة المرور ثم تجزئة كلمة المرور و تكرار 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 المستمر.هذا هو تحجيم عامل التكلفة في هذا النظام.سوف تحتاج إلى القيام به اختبار لتحديد ما هو exceptable مقدار الوقت الذي ترغب في الانتظار لكل تجزئة احتساب مقابل خطر القاموس حاليا على أساس الهجوم على ملف كلمة المرور الخاصة بك.

الأمن هو الثابت وطريقة أقدم ليست أفضل طريقة للقيام بذلك ، ولكن هذا هو أفضل بكثير من بسيط التجزئة.بالإضافة إلى ذلك فإنه ميت بسيطة لتنفيذ.حتى أنت لا تختار أكثر تعقيدا حل هذا ليس أسوأ من هناك.

ويساعد هذا الأمل ، تيم

أعتقد أن عليك أن تجعل الخاصة بك أسلوب المصادقة كما يمكنك جعلها تناسب التطبيق الخاص بك أفضل ولكن استخدام مكتبة التشفير, مثل pycrypto أو بعض أخرى أكثر خفيفة الوزن المكتبة.

راجع للشغل, إذا كنت بحاجة إلى ويندوز ثنائيات 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

انظر أيضا جي إن مصادقة-to-a-3-الطرف-موقع

استخدام " 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