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
반응형
'Web > React Node js' 카테고리의 다른 글
노드 기초 강의 (10) - Auth 기능 (0) | 2022.02.28 |
---|---|
노드 기초 강의 (9) - 로그인 기능 with Bcrypt & 토큰 생성 with JSON WEBTOKEN (0) | 2022.02.27 |
노드 기초 강의 (7) - 비밀 설정 정보 관리 (0) | 2022.02.27 |
노드 기초 강의 (6) - Nodemon 설치 (0) | 2022.02.26 |
노드 기초 강의 (5) - BodyParser & PostMan & 회원가입 기능 (0) | 2022.02.26 |
댓글