TIL. 43 Node.js 패스워드 암호화- bcrypt

조윤식·2022년 9월 1일
0

NodeJS에서 bcrypt로 패스워드 암호화하는 방법을 알아볼게요.

bcrypt는 현업에서 많이 사용하고 있는 패스워드 암호화 알고리즘이에요.

기본적으로 salt를 추가하여 해싱하기 때문에 오래 전부터 많이 사용하는 SHA256이나 SHA512보다 보안성이 높다는 평가를 받아요.

물론 다른 알고리즘들도 어떻게 개발자가 salt를 활용하여 커스텀하게 구현하느냐에 따라 보안 강도가 달라지지만 bcrypt를 선택했다는 것만으로도 안정성을 어느 정도 보장받는다고 보시면 되요.

이제부터 NodeJS로 어떻게 평문을 bcrypt를 활용하여 암호화하고 검증하는지 코딩을 해볼게요.

bcrypt 모듈을 설치

npm install bcrypt

bcrypt 모듈을 소스 상에서 임포트

const bcrypt = require('bcrypt')

비밀번호 암호화 (hashSync or hash)

const password = '1234'
const encryptedPassowrd = bcrypt.hashSync(password, 10) // sync

const password = '1234'
bcrypt.hash(password, 10, (err, encryptedPassowrd) => {
// async callback
})

비밀번호 비교 (compareSync or compare

const password = '1234'
const encodedPassword = '2a$10tUUfk1E0jGr90ntHxl/wE.lzrVvAQfxJ7nRo3RYXi2XqJtlv2h.UW'
const same = bcrypt.compareSync(password, encodedPassword) // sync

const password = '1234'
const encodedPassword = '2a$10tUUfk1E0jGr90ntHxl/wE.lzrVvAQfxJ7nRo3RYXi2XqJtlv2h.UW'
bcrypt.compare(password, encodedPassword, (err, same) => {
// async callback
})

Sync가 붙지 않으면 비동기 방식으로 콜백을 받아서 처리하게 끔 되어있구요.

Sync가 붙으면 동기 방식으로 메서드 기능에 맞게 데이터를 리턴을 받게 끔 되어있어요.

상황에 맞게 적절히 사용하시면 됩니다.

hash할 때 숫자 10 파라미터명은 saltOrRounds이에요.

암호화에 사용할 솔트 (The salt to be used in encryption.)

즉, salt를 몇 번 돌릴거냐는 뜻이구요. 보통 기본 10으로 설정한다고 보시면 됩니다.

saltOrRounds가 높을 수록 암호화가 강력해지지만 속도는 현저히 느려져요.

const signUp = async (username, email, password) => {
// controller 단에서 username, email, password 받아옴
const user = await userDao.getUserEmail(email) // userDao에서 email정보 불러옴
if (user.length !== 0) { // 불러온 email 정보가 0 이 아니라면 존재하는 email로 에러 발송
const error = new Error('EXISTING_EMAIL')
error.statusCode = 409
throw error
}
const encryptedPW = bcrypt.hashSync(password, bcrypt.genSaltSync())
// 패스워드 암호화 bcrypt 로 암호화 진행 genSaltSync는 default 10회
const newUser = await userDao.createuUser(username, email, encryptedPW)
return newUser
}

profile
Slow and steady wins the race

0개의 댓글