2016-12-06 2 views
0

pycrypto 라이브러리의 AES 알고리즘을 사용하여 파이썬 플라스크 &에 파이썬 플라스크에 웹 사이트를 구축 중입니다. 가입 웹 페이지에서 암호화 된 키 &을 텍스트 파일에 암호화하여 저장합니다. 로그인 페이지에서 내가 코드AES 알고리즘을 사용하는 파이썬의 해독 문제

def decryption(encryptedString,key_from_file): 
    PADDING = '{' 
    DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING) 
    #Key is FROM the printout of 'secret' in encryption 
    #below is the encryption. 
    encryption = encryptedString 
    key = key_from_file 
    cipher = AES.new(key) #### error comes here 
    decoded = DecodeAES(cipher, encryption) 
    return decoded 

def login(): 
    if request.method == 'GET': 
     return render_template('login.html') 
    if request.method == 'POST': 
     username = request.form['username'] 
     password = request.form['password'] 
     d2 = pandas.read_csv("Employee_Info.txt",header=0) 
     search_id = d2[d2['email'] == username] 
     pdb.set_trace() 
     if search_id.empty: 
      error = "username does not exists" 
      return render_template('login.html', error = error) 
     else: 
      pwd_from_file=search_id.iloc[0]['pwd'] 
      key_from_file=search_id.iloc[0]['key'] 

      if decryption(pwd_from_file,key_from_file) == password: 
       print "matching password" 
      else: 
       print "mismatch" 

이하로 사용하여, 해독 pwd을 사용하여 입력 PWD을 비교하고하지만 난 ValueError: AES key must be 16,24 or 32 bytes long.

텍스트 파일로 오류를 얻고 것은 필드 아래에있다 : 당신은 저장하고

id,email,pwd,key 
qq,qq,h4vvEPuVNwjw22yJKz8QGg==,xéðjŸ¸AOݬ‡ 

답변

1

을 원시 유니 코드 바이트의 키이므로 serialization/deserialization 오류가 발생할 가능성이 큽니다. 원시 키 바이트를 파일에 저장하기 전에 16 진수 또는 Base64로 인코딩 한 다음 암호를 초기화하기 전에 다시 원시로 변환하십시오.

참고 : 자격 증명 데이터 저장소에 키를 저장하는 자격 검증을 위해 암호를 암호화 아주 나쁜 것은 또한 아주 나쁜입니다. 자세한 내용은 Why should I hash passwordsHow to securely hash passwords을보십시오.