Rpi4+Pyqt5+SHA512

똔의 기록·2022년 2월 4일
0
post-thumbnail

백엔드를 맡아서 API를 구현하다가 라즈베리파이를 잠시 담당하게 되었다.

라즈베리파이에 pyqt5를 설치하고 qt-designer로 GUI를 만드는 과정은 나중에 글로 남기고 오늘 고생했던 SHA512에 대해서 적어보려한다.

백엔드에서 bcrypt 모듈로 암호화를 해놨기 때문에 DB에 있는 id, pw와 비교를 해서 완성시켜두었다.

아래가 바로 그 코드 ( db연결 관련 코드는 빼고 올렸다 )

from PyQt5 import QtSql
import bcrypt

class dbConnect:
    def __init__(self):
        super().__init__()
        self.dbInit()
        print("hi")
      
    
    def checkpw(self, id_l, pw_l):
        self.query = QtSql.QSqlQuery();
        self.query.prepare("select user_pw from user_t where user_id = :id")
        self.query.bindValue(":id", id_l)
        self.query.exec()
        
        self.query.next()
        hashpw = self.query.value(0)

        pw_l = pw_l.encode('utf-8')
        hashpw = hashpw.encode('utf-8')

       
        
        result=bcrypt.checkpw(pw_l,hashpw)
        #result = bcrypt.checkpw(pw, hashpw)
        
        print("기존:"+str(pw_l)+" 해쉬:"+str(hashpw))
        print(result)
        
        return result

로그인이 잘되고 다음 페이지로 넘어가지길래 완성된 줄 알았으나 테스트 계정이 swagger를 통해 만들어진 계정이라 백엔드에서만 암호화된 비밀번호였다.

알고보니 프론트에서 sha512로 한번 암호화해서 넘어오는 것!
이럴 줄 알았으면 DB에 바로 연결안하고 서버로 통신할걸이라며 잠시 팀원과 꿍시렁타임을 가지고 다시 검색해서 프론트와 같은 암호화 모듈인 sha512관련 코드를 넣기로 결정

일단 crypto 모듈을 설치해야한다. python3버전이라 명령어가 달라졌다.

pip install pycryptodome

import hashlib

    def get_hash(self,msg):
        h = hashlib.sha512()
        h.update(msg)
        h = h.hexdigest()
        print(h)
        return h
        
                
    def check(self):
        id_l = self.id_line.text()
        pw_l = self.pw_line.text()
        
        hv = self.get_hash(pw_l.encode())
        
        if self.dbConnect.checkid(id_l)==False or self.dbConnect.checkpw(id_l,hv)==False:
            self.msg = QMessageBox()
            self.msg.setText("Please check id/pw again      ")
            self.msg.exec()
        else:
            # 아이디랑 비밀번호가 맞으면
            # 기기등록창 아니면 로그인창 
            self.close()
            
            self.survey=survey(self.dbConnect)
            self.survey.show()

더 강력한 보안을 위해서 salting을 하기도 하지만 우리는 기본 코드로 구현을 했다.

알고보니 bcrypt도 sha암호에서 아이디어를 얻어 실력자들이 자신만의 방법으로 만든 암호화 라이브러리였다는거..!

이렇게 번거롭게 코드를 추가하는건 이번에 경험했으니 다음 프로젝트부터 iot기기를 연결할 일이 있으면 각자 서버를 구축해서 서버로 데이터를 주고 받는 것이 훨씬 작업하기 수월할 듯 하다

profile
Keep going and level up !

0개의 댓글