프로그래밍/NodeJS

bcrypt를 사용한 암호 해시화(암호화)하기

타코코딩 2023. 10. 26. 16:14

 

bcrypt
는 비밀번호를 안전하게 저장하기 위한 해싱 라이브러리입니다.

$2a$10$A4hKdXuPsN3uJBtsvm.iyeQ/7CyWiSz3xsMQgCzE.JNA4Ubo3o0lm
위 같은 형태로 해싱이 됩니다.

2a 어떤 알고리즘을 쓰는지

나머지는 중 반틈은 salt인데 랜덤으로 만드는 문자열, 

단방향통신 - 인코딩은 가능하나 디코딩은 안됨
(사이트에서 비밀번호 찾기 하면 새로운 비밀번호로 변경하라는 이유)

 


사용예시
  1. 터미널 npm install bcryptjs 설치
import * as signupRepository from "../repository/signupRepository.js";
import bcrypt from "bcryptjs";

export async function signUp(req, res) {
  let { id, pass, name, content } = req.body;
  const hashPass = bcrypt.hashSync(pass, 10);
  const params = [id, hashPass, name, content];
  const result = await signupRepository.signUp(params);
  if (result == "success") res.redirect("/dwitter");
}

2. 회원가입 폼에서 body에 붙어 오는 pass라는 비밀번호 값을 hashpass라는 변수로 할당합니다.

bcrypt.hashSync(불러온 비밀번호, salt값)으로 입력을 하는데 함수 두 번째 인자인 salt값은 8-10 정도가 적당합니다.

너무 많은 값을 입력하면 프로그램 돌아가는데 시간이 많이 걸립니다.

export async function login(id) {
  return db
    .execute("select pass from dwitter where id=?", [id])
    .then((result) => result[0][0]);
}

3. 아이디 값에 맞는 비밀번호를 db에서 select 조회를 합니다.

import * as loginRepository from "../repository/loginRepository.js";
import bcrypt from "bcryptjs";

export async function login(req, res) {
  let { id, pass } = req.body;
  // db에 저장된 password 가져오기
  const dpass = await loginRepository.login(id);
  console.log(dpass);
  // bycrypt.compare();
  const result = await bcrypt.compare(pass, dpass.pass);
  console.log(result);
}

4. 로그인 값을 불러올 때, bcrypt.compare() 함수를 사용해서 bcrypt.compare(유저가 로그인할 때입력한 값, 해싱된 db값)

을 비교해 줍니다.

그러면 result 값을  log로 찍어보면 true나 false 값을 반환하는데 조건문으로 분류하여 결과에 맞는 화면을 개발하면 됩니다.

설명
  1. bcrypt라이브러리 설치:

먼저 프로젝트 디렉터리에서bcrypt라이브러리를 설치합니다.(저는 npm install bcryptjs로 진행했습니다)

npm install bcrypt

 

비밀번호 해시화:

다음은 비밀번호를 해시화하는 예시 코드입니다.

const bcrypt = require('bcrypt');
const saltRounds = 10; // 솔트(salt) 라운드 수
const plainPassword = 'mySecurePassword'; // 해시화할 비밀번호
// 비밀번호 해시 생성
bcrypt.hash(plainPassword, saltRounds, (err, hash) => {
if (err) {
console.error('비밀번호 해시 생성 오류:', err);
return;
}
// 해시 생성 성공
console.log('생성된 해시:', hash);
// 이제 'hash'를 데이터베이스에 저장하면 됩니다.
});

 

위의 코드에서 bcrypt.hash함수를 사용하여 비밀번호를 해시화합니다. saltRounds는 해시에 사용할 솔트 라운드 수를 나타냅니다. 솔트는 해시를 보다 안전하게 만드는 데 도움을 주는 임의의 데이터입니다.

비밀번호 검증:

저장된 해시된 비밀번호를 검증하려면 bcrypt.compare함수를 사용합니다. 예시 코드는 다음과 같습니다.

 

 

위의 코드에서 bcrypt.compare함수를 사용하여 사용자가 제출한 비밀번호와 데이터베이스에서 가져온 해시된 비밀번호를 비교합니다. 결과가 true이면 비밀번호가 일치하고, false이면 불일치합니다.