단방향 암호화 - md5
# 단방향 암호화 방법
- 원래의 문자를 암호화된 문자로 (암호화) 바꿀 수는 있지만, 암호화된 문자를 원래의 문자로 (복호화) 바꿀 수는 없다
- ex) md5
- md5로 유저의 비밀번호인 '111'을 암호화하면 '698d51a19d8a121ce581499d7b701668' 이 나오는데, user 의 회원정보 배열에 '111' 대신 이 문자를 넣는다.
var user = {
username: 'egoing',
password: '698d51a19d8a121ce581499d7b701668',
displayName: 'Egoing'
};
- 로그인 시 회원정보와 입력받은 비밀번호를 비교하는 if문에서 입력받은 비밀번호인 pw 값도 md5로 암호화하여 비교하도록 한다.
- 비밀번호 111로 로그인하면 로그인이 성공한다.
if (uname === user.username && md5(pw) === user.password) {
req.session.displayName = user.displayName;
req.session.save(()=>{
res.redirect('/welcome');
});
- md5가 복호화가 안되긴 하지만, 간단한 비밀번호의 경우에는 컴퓨터에 의해 쉽게 복호화되기도 한다.
- 단순히 md5로 암호화하면 쉽게 복호화될 수 있는 단점이 있다.
salt
- salt값을 추가해 비밀번호와 salt를 더해 md5로 암호화하면 쉽게 복호화되지 않는다.
var salt = '$%#$fdfsd21';
var user = {
username: 'egoing',
password: 'eed0db851a8112a2c1144ce5e655232e',
displayName: 'Egoing'
};
if (uname === user.username && md5(pw+salt) === user.password) {
req.session.displayName = user.displayName;
req.session.save(()=>{
res.redirect('/welcome');
});
- 하지만, 위의 경우 만약 서로 다른 사용자인데 비밀번호가 같다면, 한 명의 비밀번호가 유출될 경우 다른 사람 역시 유출 될 가능성이 있어 위험한 방식이다.
- 사용자마다 다른 salt 제공하여 암호화환다.
var users = [
{
username: 'egoing',
password: '3897f74ffbd57ce71e68908d8ff8b7f0',
salt : '6742Sw123@$^%',
displayName: 'Egoing'
},
{
username: 'coding',
password: '42ea59fc5ec3b6209fc94e49e1ea37a6',
salt : '2ds0s!!#56',
displayName: 'coding'
}
];
- 회원 정보 비교하는 if문에서도 입력받은 pw 값에 각 유저의 salt를 더하고, md5로 암호화 해 비교한다.
app.post('/auth/login', (req, res) => {
var uname = req.body.username;
var pw = req.body.password;
for (var i = 0; i < users.length; i++) {
var user = users[i];
if (uname === user.username && md5(pw + user.salt) === user.password) {
req.session.displayName = user.displayName;
return req.session.save(() => {
res.redirect('/welcome');
});
}
}
res.send(`Who are you?<a href = "/auth/login">login</a>`);
});
- 하지만 현재는 md5를 암호화 방법으로 쓰지 않음
sha256
- md5대신 sha256을 사용
sha256
Compute SHA256 of bytes or strings.. Latest version: 0.2.0, last published: 8 years ago. Start using sha256 in your project by running `npm i sha256`. There are 527 other projects in the npm registry using sha256.
www.npmjs.com
var users = [
{
username: 'egoing',
password: 'e3f78369a284d177860857d3bdc0471e7f1e2ac2a0ce48674f6118181b800c02',
salt: '6742Sw123@$^%',
displayName: 'Egoing'
},
{
username: 'coding',
password: 'c3878d5103b62b729626e3fe7e4d3875a01c68065e030c8761dcc1d10538a81f',
salt: '2ds0s!!#56',
displayName: 'coding'
}
];
app.post('/auth/login', (req, res) => {
var uname = req.body.username;
var pw = req.body.password;
for (var i = 0; i < users.length; i++) {
var user = users[i];
if (uname === user.username && sha256(pw + user.salt) === user.password) {
req.session.displayName = user.displayName;
return req.session.save(() => {
res.redirect('/welcome');
});
}
}
res.send(`Who are you?<a href = "/auth/login">login</a>`);
});
PBKDF2(Password-Based Key Derivation Function2)
#pbkdf2
- salt값을 자동으로 생성해 부여함
pbkdf2-password
Easy salt/password creation for Node.js, extracted from Mosca. Latest version: 1.2.1, last published: 6 years ago. Start using pbkdf2-password in your project by running `npm i pbkdf2-password`. There are 14 other projects in the npm registry using pbkdf2-
www.npmjs.com
- 같은 '111'로 해시값을 생성해도 자동으로 생성된 salt 값이 다르기 때문에 결과가 다름
var users = [
{
username: 'egoing',
password: 'NEJxUfa4q3gf7LMfO1jqKmnOmBW8Ikhg9Ju63vCN20Is0Jlb77ZXABfE4nKxm5EG1OiBQC2w4GJWtpQS+d5bCLyMWTDUF7APM7e+Wcs2Xdt0uVVnKG6wQmfqa1So4cNuqtaqkKG07wgs5J0k3YyHnYXImfRGqrShfbyfghrEYEM=',
salt: 'R0aNjtbM4v7vw8TrqPQGWHzObuwxlWvJn2poi0+yerRBZ3YEr/jaK6TcVLyALft3EmeJyIbZn0XdmC7uCilE+g==',
displayName: 'Egoing'
},
{
username: 'coding',
password: 'sirR3yXY2UeWEsATxBVqu+0BrvfwQ/t1ma7B2VTWDAnbyRTyQMaaoCkkiZoKZJPNbcMETr26bTU8Vq47lEXoC11ppfBKhddqRW/+hslTaABdXvKe9kHXocm1pqTDi9ixISufNY2vCmZ8XCP+2D5RTF93t2smTAxovZghrDiC+uo=',
salt: 'lYynoNfP2BNMPCJY1x1IDdGWIXSt6hRbZjMEf9EAuhQon+fEXBRQmRs9t9CqkQBCmjfYRQW/Hw6JfD7NKUvmCw==',
displayName: 'coding'
}
];
app.post('/auth/login', (req, res) => {
var uname = req.body.username;
var pw = req.body.password;
for (var i = 0; i < users.length; i++) {
var user = users[i];
if (uname === user.username) {
return hasher({ password: pw, salt: user.salt }, (err, pass, salt, hash) => {
if (hash === user.password) {
req.session.displayName = user.displayName;
req.session.save(() => {
return res.redirect('/welcome');
})
} else {
res.send(`Who are you?<a href = "/auth/login">login</a>`);
}
});
}
}
res.send(`Who are you?<a href = "/auth/login">login</a>`);
});
'BACKEND > Node.js' 카테고리의 다른 글
[ 생활코딩 - Node.js 활용하기 ] 05. mySQL 버전 로그인 인증 ( local 방식 / facebook 방식) (0) | 2022.12.05 |
---|---|
[ 생활코딩 - Node.js 활용하기 ] 04. 인증을 쉽게 도와주는 PassportJS모듈 (0) | 2022.12.02 |
[ 생활코딩 - Node.js 활용하기] 2. Session (0) | 2022.11.28 |
[ 생활코딩 - Node.js 활용하기] 1. cookie (0) | 2022.11.27 |
[코드잇 - Node.js 기본기] 4. 서드파티 모듈과 npm 제대로 배우기 (1) | 2022.11.26 |