2014-04-08 1 views
1

저는 나무 딸기 파이를 실행하고 보일러를 제어하기 위해 병이 약간있는 웹 앱을 작성했습니다. 로그인 페이지와 새 사용자 작성 페이지가 있습니다. 새 사용자를 만들면 소금을 생성하고 sha512를 사용하여 암호를 해시하고 둘 다 데이터베이스에 저장됩니다. 사용자가 로그인하면 사용자 아이디와 일치하고 데이터베이스에서 salt와 password 해시를 가져 와서 표시된 비밀번호를 데이터베이스의 salt로 해시하지만 항상 다른 해시를 생성하여 로그인에 실패합니다. 나는 그 무언가 어리 석다라고 확신한다. 그러나 나는 단지 그것을 분류 할 수 없다. 같은 암호 해시 함수가 다른 해시가 동일한 암호를 생성합니다

암호 해싱/검사/소금에게

def get_password(userid): 
    userid = userid.upper() 
    logging.debug('get password for %s' % userid) 
    conn_string = prop('database') 
    conn = psycopg2.connect(conn_string) 
    cursor = conn.cursor() 

    sql = """ 
      select password, salt from users where userid = %(userid)s 
      """ 
    cursor.execute(sql, {'userid':userid}) 
    row = cursor.fetchone() 
    if row is not None: 
     dbpassword = row[0] 
     dbsalt = str(row[1]) 
     logging.debug('db password hash %s' % dbpassword) 
     logging.debug('db password salt %s' % dbsalt) 
     return dbpassword, dbsalt 
    else: 
     logging.debug('No details found for user') 
     return None, None 

def check_password(password, userid): 
    logging.debug('username/password to check is %s/%s' % (password, userid)) 
    dbpassword, dbsalt = get_password(userid) 
    if dbpassword is not None: 
     test = hash_password(password, dbsalt) 
     logging.debug('test password hash %s' % test) 
     if test == dbpassword: 
      logging.debug('password correct') 
      return True 
     else: 
      logging.debug('password incorrect') 
      return False 
    else: 
     return False 

def hash_password(password, salt): 
    if salt == '0': 
     logging.debug('hashing password') 
     logging.debug('generate salt') 
     salt = uuid.uuid4().hex 
     logging.debug('salt = %s' % salt) 
     hashed_password = crypt(password, salt) 
     logging.debug('hashed password = %s' % hashed_password) 
     return salt, hashed_password 
    else: 
     logging.debug('hash password for compare') 
     hashed_password = crypt(password, salt) 
     logging.debug('hashed password = %s' % hashed_password) 
     return hashed_password 

def crypt(password, salt): 
    hashed_password = hashlib.sha512(password.encode(encoding='utf_8') + salt.encode(encoding='utf_8')).hexdigest() 
    return hashed_password 

을 수행하는 코드이며,이 로그인 페이지에서 정보를 얻는 비트입니다 :

def main(): 
    try: 
     rqstSession = request.get_cookie('pysessionid', secret=prop('cookieSecret')) 
     username = request.forms.get('username').upper() 
     password = request.forms.get('password') 
     if request.forms.get('override','').strip() is '': 
      if check_password(password, username) is True: 
       set_session(rqstSession)    
       return template('main') 
     elif check_session(rqstSession) is True: 
      if request.forms.get('override','').strip(): 
       logging.debug('override') 
       set_override() 
       return template('main')    
      else: 
       return template('login') 
    except Exception as e: 
     logging.debug('exception in main: %s' % e) 
     return '<p>Error</p>' 

이것은 세부 사항을 얻는다 새 사용자 페이지에서 :

def new_user(): 
try: 
    rqstSession = request.get_cookie('pysessionid', secret=prop('cookieSecret')) 
    if check_session(rqstSession) is True: 
     if request.forms.get('save','').strip(): 
      userid = request.forms.get('userid', '').upper() 
      password = request.forms.get('password','') 
      confpassword = request.forms.get('confpassword','') 
      salt = '0' 
      if password is not '' and password == confpassword and userid is not '': 
       salt, hashed_password = hash_password(userid, salt) 

       conn_string = prop('database') 
       conn = psycopg2.connect(conn_string) 
       cursor = conn.cursor() 

       sql = """ 
         insert into users (id_usrr, userid, password, salt) values (nextval('users_id_usrr_seq'), %(userid)s, %(password)s, %(salt)s) 
         """ 
       cursor.execute(sql, {'userid':userid, 'password':hashed_password, 'salt':salt}) 
       conn.commit() 
       cursor.close() 

      else: 
       return template('newuser') 
     else: 
      return template('newuser') 
    else: 
     pysessionid = '' 
     response.set_cookie('pysessionid', pysessionid, secret=prop('cookieSecret'), Expires='Thu, 01-Jan-1970 00:00:10 GMT', httponly=True) 
     return template('main') 
except Exception as e: 
    logging.debug(e) 
    return '<p>Error</p>' 

소금 제거를 시도 했으므로 도움이되지 않았습니다. on't는 아무것도 그와 함께 할 생각하지만 난 보안에 대해 많이 알고하지 않습니다 아담

+3

코드를 [최소, 완료, 테스트 및 판독 가능] (http://stackoverflow.com/help/mcve)로 낮추면 여러 번 문제를 쉽게 찾을 수 있습니다. 여기 당신의 문제와 무관 한 많은 코드가 있습니다. – mhlester

답변

0

을 한 후 마지막 2 시간 동안 벽에 머리를 쾅 것을 시도

감사 기꺼이 하지만 난 그 문제를 해결할 수 있다고 생각

>>> # import the hash algorithm 
>>> from passlib.hash import sha256_crypt 

>>> # generate new salt, and hash a password 
>>> hash = sha256_crypt.encrypt("toomanysecrets") 
>>> hash 
'$5$rounds=80000$zvpXD3gCkrt7tw.1$QqeTSolNHEfgryc5oMgiq1o8qCEAcmye3FoMSuvgToC' 

>>> # verifying the password 
>>> sha256_crypt.verify("toomanysecrets", hash) 
True 
>>> sha256_crypt.verify("joshua", hash) 
False 

그래서 뭔가 같은 :

if sha256_crypt.verify("given_pass", db_hash): 
    print("you are now logged in") 

passlib

+0

나는 그것을하는 나의 방법을 숨겨 뒀다. 그리고 팁과 함께 passlib와 그 훨씬 좋은 것을 사용하고있다. – user2565150