2017-01-03 1 views
0

사용자가 사용자 이름과 비밀번호를 제공하는 웹 애플리케이션 등록 시스템을 구축 중입니다. 이 데이터는 postgresql 데이터베이스에 저장됩니다. b'$2b$12$GskbcRCMFHGuXumrNt3FLO'데이터베이스에서 비밀번호를 가져 오는 방법

가 나는 postgresql 데이터베이스에이 값을 저장하고 - 나는

import bcrypt 
hashed = bcrypt.hashpw(PasswordFromWebForm.encode('UTF-8'), bcrypt.gensalt()) 

이 이런 식으로 뭔가를 보이는 소금 비밀번호를 생성을 다음과 같이 사용자가 입력 한 암호의 소금에 절인 해시를 생성하는 bcrypt을 사용하고 있습니다. 그런 다음 사용자가 시스템에 로그인하려고하면 사용자의 자격 증명을 확인하려고합니다. 이렇게하려면 다음 줄을 따라 뭔가를하려고합니다. -

import psycopg2 
conn = psycopg2.connect("dbname=test user=me") 
cur = conn.cursor() 

saltedpassword = cur.execute("SELECT saltedpassword FROM test WHERE loginid = %s", (LoginIDFromWebForm,)) 

if bcrypt.hashpw(PasswordFromWebForm.encode('UTF-8'), saltedpassword) == saltedpassword: 
    print("Success") 

이것은 작동하지 않습니다. 다음 TypeError: Unicode-objects must be encoded before hashing 오류가 발생합니다.

내가 대신 그냥 일반 b'$2b$12$GskbcRCMFHGuXumrNt3FLO'"b'$2b$12$GskbcRCMFHGuXumrNt3FLO'" 같은 문자열로 변수 saltedpassword 저장 값이 나는이 문제를 어떻게합니까

(이전의 소금에 절인 비밀번호를 둘러싸는 따옴표를주의) 때문에이 오류가 의심 문제? 데이터베이스에 소금에 절인 해시 암호를 저장하는 가장 좋은 방법은 무엇이며 어떻게 확인을 위해 필요할 때 검색 할 수 있습니까? 다소 긴 질문에 사과드립니다. 제발 도와주세요.

답변

2

psycopg2 저장 유니 코드 텍스트, 당신은 데이터베이스에 삽입하기 전에 소금에 절인 암호를 해독해야합니다

cur.execute("INSERT INTO test VALUES (%s, %s)", 
      (LoginIDFromWebForm, saltedpassword.decode('ascii'))) 

이것은 str() 변환 대신 삽입되는 것을 방지 (데이터베이스에 당신에게 "b'....'"을 제공).

다음으로 saltedpassword을 쿼리하는 것이 문자열이 아니므로 cursor.execute()은 결과를 반환하지 않습니다. 대신 None을 반환합니다.

당신은 fetch the result row해야합니다 : 행이 유니 코드 텍스트를 포함

cur.execute("SELECT saltedpassword FROM test WHERE loginid = %s", (LoginIDFromWebForm,)) 
row = cur.fetchone() 
if not row: 
    # No such login ID, handle accordingly 
saltedpassword = row[0].encode('ascii') 

때문에, 당신은 bcrypt로 전달하기 전에 bytestring 먼저 인코딩해야합니다. 또한 암호를 확인하기 위해 bcrypt.checkpw() 기능을 사용하려면 : 당신의 코드에 취약 뭔가를 문자열을 비교할 때

if bcrypt.checkpw(PasswordFromWebForm.encode('UTF-8'), saltedpassword): 
    print("Success") 

bcrypt.checkpw()timing attacks를 피할 수 있습니다.

+1

공평하게 bcrypt 문서는'if bcrypt.hashpw (암호, 해시) == 해시 됨 '을 사용하여 암호를 확인합니다. - https://pypi.python.org/pypi/bcrypt/2.0.0 – slim

+1

@slim : 참조 bcrypt 3에 대한 업데이트 된 문서 : https://pypi.python.org/pypi/bcrypt/3.1.2, checkpw()가 3.1.0에 추가되었습니다. –

+1

아 예, 방금 보았습니다. – slim

관련 문제