728x90

⚠️ 문제

공개적으로 배포하는 프로젝트일 경우, 비밀번호 암호화가 필수라고 한다.

💭 물론, db가 뚫리지않는게 가장 베스트긴 하지만,, 이게 내 맘대로 되는 건 아니니까ㅠ^ㅠ..

그래서 crypto node.js 라이브러리를 사용해서 암호화를 진행했다.

 


🏃 시도

#1

  • 암호화, 복호화 함수를 회원가입 부분에 추가했다.그래서 알게 된 게 salt 라는 건데, salt는 소금을 뿌리듯이 해시값에 임의의 값을 추가하는 것이라고 한다.
  • 근데 생각해보니, 복호화는 회원가입 부분이 아니라 passport나 세션에 직접적으로 넣어주는 부분에 구현해야한다는 걸 간과했다...

#2

  • bcrypto 를 사용해서 해시값을 생성하는 것 까진 됐는데.. compare 메서드로 해시값이랑 패스워드를 비교했을때 패스워드를 맞게 입력 했는데도 자꾸만 False를 반환한다..?→ VARCHAR(100) 으로 자료형 변경해줘서 해결 완료 ! ✨
  • → db에 자료형이 VARCHAR(50) 으로 되어있어서 해시값을 다 못 담았던 것...!

 


✨ 해결

  • salt를 db에 따로 컬럼으로 추가해주고 로그인할 때마다 꺼내와서 다시 돌리려고 했는데 무의미한 일이었다..
  • 고냥 bcypto 라이브러리를 사용하는 방향으로 개선했다.

 

📄 signup.js

bcrypt.hash(user_password, saltRounds, (err, hash) => {
...
}
  • 📄 signup.js (회원가입 라우터 구현) 에 해시값, 솔트값을 자동 생성해주는 hash 메서드를 사용해서 db에 해시값을 저장했다.

📄 index.js

bcrypt.compare(password, returnPassword, (err, result) => {
...
}
  • 📄 index.js (로그인 구현)에 해시값을 비교하는 compare 메서드를 사용해서 사용자 입력 패스워드와 db에 저장된 해시값을 비교한다.
    • 같으면 True 반환
    • 다르면 False 반환

 

🥰 구현완료!

 

 


🔗 참고

 


💡 깨달은 점

  • crypto 보다 bcrypto 가 보안성이 더 높다!
  • 보안을 더 강화하려면 salt (소금치듯이 일정값을 중간중간 추가해줌)를 여러번 수행하면 된다.
  • ❓ SHA-512
728x90