문제

제가 작성 중인 데스크톱 앱에 대한 인증 방법을 만드는 데 도움이 되는 Python 라이브러리를 찾고 있습니다.나는 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()

이는 비밀번호를 해시하는 매우 안전하지 않은 방법입니다.너 ~하지 않다 이것을하고 싶습니다.이 글을 읽는 이유를 알고 싶다면 바이크립트 페이퍼 OpenBSD용 비밀번호 해싱 시스템을 만든 사람들이 만든 것입니다.또한 비밀번호가 어떻게 손상되는지에 대한 좋은 토론을 원한다면 확인하십시오. 이번 인터뷰 Jack the Ripper(인기 있는 유닉스 비밀번호 크래커)의 저자와 함께.

이제 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 상수입니다.이것이 이 시스템의 확장 가능한 비용 요소입니다.비밀번호 파일에 대한 오프라인 사전 기반 공격의 위험과 비교하여 각 해시가 계산될 때까지 기다려야 하는 예외적인 시간이 얼마나 되는지 확인하기 위해 테스트를 수행해야 합니다.

보안은 어렵고 제가 제시하는 방법은 이를 수행하는 최선의 방법은 아니지만 단순한 해시보다 훨씬 낫습니다.또한 구현하기가 매우 간단합니다.따라서 더 복잡한 솔루션을 선택하지 않더라도 이것이 최악은 아닙니다.

이것이 도움이되기를 바랍니다, 팀

애플리케이션에 가장 적합하게 만들 수 있지만 암호화를 위해 다음과 같은 라이브러리를 사용할 수 있으므로 자신만의 인증 방법을 만들어야 한다고 생각합니다. 파이크립토 또는 다른 좀 더 가벼운 라이브러리.

그런데, pycrypto용 Windows 바이너리가 필요하면 얻을 수 있습니다. 여기

간단하게 하려면 키가 사용자 이름이고 값이 비밀번호(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

또한보십시오 제3자 사이트에 대한 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