저는 나무 딸기 파이를 실행하고 보일러를 제어하기 위해 병이 약간있는 웹 앱을 작성했습니다. 로그인 페이지와 새 사용자 작성 페이지가 있습니다. 새 사용자를 만들면 소금을 생성하고 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는 아무것도 그와 함께 할 생각하지만 난 보안에 대해 많이 알고하지 않습니다 아담
코드를 [최소, 완료, 테스트 및 판독 가능] (http://stackoverflow.com/help/mcve)로 낮추면 여러 번 문제를 쉽게 찾을 수 있습니다. 여기 당신의 문제와 무관 한 많은 코드가 있습니다. – mhlester