DEVELOP
article thumbnail

단방향 암호화 - 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>`);
});

 

profile

DEVELOP

@JUNGY00N