본문 바로가기
Web/React Node js

노드 기초 강의 (8) - Bcrypt로 비밀번호 암호화

by SeleniumBindingProtein 2022. 2. 27.
728x90
반응형

1. Bcrypt : Blowfish를 기반으로 만들어진 단방향 암호화 해싱함수이며, Rainbow table 공격을 막기 위해 salt를 사용하며,

                  암호검사 요청이 반복될수록 cost를 늘림으로써, 무차별 대입 공격(brute-force search)를 막을 수 있음

                  (cost는 반복횟수로 2^n)

  - npm install bcrypt --save

  - Bcrypt 비밀번호 암호화 순서

const express = require('express')
const app = express()
const port = 6660

const config = require('./config/key');

const {User} = require("./models/User");
const bodyParser = require('body-parser');
//application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({extended: true}));
//application/json
app.use(bodyParser.json());

const mongoose = require('mongoose')
mongoose.connect(config.mongoURI, {
}).then(() => console.log('MongoDB Connected...'))
  .catch(err => console.log(err))

app.get('/', (req, res) => {
  res.send('Hello World! nodemon')
})

app.post('/register', (req,res) =>{
    //회원 가입할 때 필요한 정보들을 client에서 가져오면 그것들을 데이터베이스에 넣어준다. 
    
    const user = new User(req.body)
    user.save((err, userInfo) => {
        if(err) return res.json({success: false, err})
        return res.status(200).json({
            success: true
        })
    })
})



app.listen(port, () => {
  console.log('Example app listening on port ${port}')
})

 

  - User 정보가 저장되어 있는 곳에서 공식문서 Usage를 참조하여 암호화를 진행해줌

const mongoose = require('mongoose');

//salt를 이용해서 비밀번호를 먼저 암호화하며, saltRounds는 slat의 자릿수를 얘기함
const bcrypt = require('bcrypt');
const saltRounds = 10


const userSchema = mongoose.Schema({
    name: {
        type: String,
        maxlength: 50
    },
    email: {
        type: String,
        trim: true,
        unique: 1
    },
    password: {
        type: String,
        minilength: 5
    },
    lastname: {
        type: String,
        maxlength: 50
    },
    role: {
        type: Number,
        default: 0
    },
    image: String,
    token: {
        type: String
    },
    tokenExp: {
        type: Number
    }
})

//pre('save',function()) 유저모델에 유저 정보를 저장하기 전에 이 함수를 실행시키겠다는 의미
userSchema.pre('save', function(next){ // next : register route로 보내주는 기능
    var user = this;
    
    //email이나 이름을 바꿀 경우에도 암호화를 진행하면 안되기 때문에 
    //비밀번호를 바꿀때만 암호화를 진행할 수 있는 조건을 넣어줌 
    if(user.isModified('password')){
        //비밀번호를 암호화
        bcrypt.genSalt(saltRounds, function(err, salt) {
            if(err) return next(err)
			//hash가 암호화된 비밀번호를 의미함
            bcrypt.hash(user.password, salt, function(err, hash){
                if(err) return next(err)
                user.password = hash
                next()
            })
        })
    } 
})

const User = mongoose.model('User', userSchema)

module.exports = {User}

 

  - Bcrypt 공식사이트 Usage 참조 

- 포스트맨을 이용하여 아이디와 비밀번호를 데이터베이스로 보내면 암호화가 되어 저장된 비밀번호를 확인할 수 있음

- MongoDB에서 나온 결과이며, 이전 패스워드와 다르게 암호화가 걸린 비밀번호가 보내진 것을 확인할 수 있음 

728x90
반응형

댓글