[Node.js] bcrypt 비밀번호 암호화하기

kwonseokki·2022년 8월 20일
0

node

목록 보기
4/8

bcrypt란 암호화 해싱방법중 하나이다.
여러가지 암호화 방법이 있지만 우선 간단하게 bcrypt 부터 알아보자

bcrypt?

bcypt는 블로피시 암호에 기반을 둔 암호화 해시 함수로서 Niels Provos와 David Mazières가 설계하였으며 1999년 USENIX에서 발표되었다.[1] 레인보 테이블 공격 방지를 위해 솔트를 통합한 bcrypt는 적응형 함수의 하나이다. 시간이 지남에 따라 속도 저하를 위해 반복 횟수가 증가가 수반될 수 있으므로 연산 파워의 증가에도 브루트 포스 검색 공격에 대한 저항을 유지하게 된다.

bcrypt 함수는 OpenBSD[2] 및 수세 리눅스 등의 일부 리눅스 배포판을 포함한 기타 시스템용 기본 암호 해시 함수이다.[3]

C, C++, C#, Elixir,[4] Go,[5] Java,[6][7] 자바스크립트,[8] 펄, PHP, 파이썬,[9] Ruby 등의 언어용으로 bcrypt 구현체가 존재한다.

사전적 의미는 이러하다
지금은 회원가입을 하면 비밀번호를 관리자가 확인을 할수있는 상태이다.

이런식으로 비밀번호가 노출이 되는것은
보안적으로 상당히 문제이며 그렇게 되서도 안된다
bcrypt 라이브러리를 다운받아서
회원정보가 저장이 되기전에 비밀번호를 암호화해서 저장해주자.

설치

$ npm install bycrypt

document

bcrypt 패키지 readme 를 읽어보자
saltRounds 란 연산의 cost를 지정한다고 한다(10자리 salt를 이용해 비밀번호 암호화)
myPlaintextPassword 는 입력된 암호화 전의 비밀번호이다

비밀번호 암호화를 위한 sample code 이다
salt를 생성을 하고 콜백의 인자로 받아서 해당 salt로 hash 해준다
그뒤에 최종적으로 hash값을 받아서 user password 를 hash 값으로 갈아치운다.

models/User.js

const mongoose = require("mongoose");
const bcrypt = require("bcrypt");
const e = require("express");
const saltRounds = 10;

const userSchema = mongoose.Schema({
  name: {
    type: String,
    maxlength: 50,
  },
  email: {
    type: String,
    trim: true, // 공백 없애주는 설정
    unique: 1,
  },
  password: {
    type: String,
    minlength: 5,
  },
  lastname: {
    type: String,
    maxlength: 50,
  },
  role: {
    type: Number,
    default: 0,
  },
  image: String,
  token: {
    type: String,
  },
  tokenExp: {
    type: Number,
  },
});

userSchema.pre("save", function (next) { // user 정보가 저장되기전에 실행
  var user = this; 

  if (user.isModified("password")) { // user의 password가 수정될때만 
    bcrypt.genSalt(saltRounds, function (err, salt) {
      if (err) return next(err);
      bcrypt.hash(user.password, salt, function (err, hash) {
        if (err) return next(err);
        else {
          user.password = hash; // 비밀번호를 hash값으로 바꿔준다
          next();
        }
      });
    });
  } else {
    next();
  }
});
const User = mongoose.model("User", userSchema);
module.exports = {
  User,
};

요약📃
bcrypt 는 비밀번호 암호화 방법중 하나이고 최종적으로 회원정보에 등록이 되기전에 userSchema에 접근하여 hash된 값으로 비밀번호를 바꿔준다.

profile
프론트개발자가 되고싶어요

0개의 댓글