2016-11-10

Sails.js Tutorial : 개인정보 양방향암호화(AES256) 하기


  • 이 예제에는 개인정보 데이터가 없긴 하지만, 별명(Nick)을 개인정보라 간주하고 암호화를 진행해보겠습니다.
  • xyz/api/services/EncryptionService.js 파일을 생성한다.
    const crypto = require('crypto');
    const SECRET_KEY = '중요한키';
     
    module.exports = {
      encrypt: function (data) {
        var cipher = crypto.createCipher('aes256', SECRET_KEY); // Cipher 객체 생성
        cipher.update(data, 'utf8', 'base64');                  // 인코딩 방식에 따라 암호화
        var result = cipher.final('base64');                    // 암호화된 결과 값
        return result;
      },
     
      decrypt: function (data) {
        var decipher = crypto.createDecipher('aes256', SECRET_KEY); // Decipher 객체 생성
        decipher.update(data, 'base64', 'utf8');                    // 인코딩 방식에 따라 복호화
        var result = decipher.final('utf8');
        return result;
      },
    };
  • xyz/api/models/Admin.js 에 다음처럼 수정한다.
    // Admin.js
    const crypto = require('crypto');
     
    module.exports = {
      tableName: 'tb_admin',
      attributes: {
        userid:   { type: 'string', unique: true },
        password: { type: 'string', required: true },
        nick:     { type: 'string', unique: true },
     
        getNick: function (){
          return EncryptionService.decrypt(this.nick);
        },
      },
      autoUpdatedAt: false,
      autoCreatedAt: false,
     
     
      beforeCreate: function (values, cb) {
        if (values.password != undefined) {
          values.password = crypto.createHash('sha256').update(values.password).digest('base64');
        }
     
        if (values.nick != undefined) {
          values.nick = EncryptionService.encrypt(values.nick);
        }
     
        console.log(values); // 관리자 추가시 확인용
        cb();
      },
     
      beforeUpdate: function (values, cb) {
        if (values.password != undefined) {
          values.password = crypto.createHash('sha256').update(values.password).digest('base64');
        }
     
        if (values.nick != undefined) {
          values.nick = EncryptionService.encrypt(values.nick);
        }
     
        console.log(values); // 비밀번호 변경시 확인용
        cb();
      },
    }
  • xyz/views/mgmt/admin/index.ejs 와 xyz/views/mgmt/admin/update_form.ejs 에서 admin.nick 으로 표시된 부분을 admin.getNick() 으로 변경합니다.
  • DB의 내용을 모두 삭제한 후에, 관리자를 추가해봅니다. 그리고, DB에서 Nick 이 암호화되어 있는지도 봅시다.
    ...
     
    null { userid: 'userid5',
      password: 'DurIFxdo0M3vOiD+5ttDYtAZyR4QZiprVRhjNuGkJ3g=',
      nick: 'j7m+XXpovYiYPWRHmuRZ8Q==',
      id: 240 }
    { nick: 'v2bcacVv58tBYHRSlgpWBA==' }
    [ { userid: 'userid1',
        password: '5sPaWyBmNNfz81htdH/9s2tcZ1dXs4DGpf5cVwxxQ0k=',
        nick: 'v2bcacVv58tBYHRSlgpWBA==',
        id: 236 } ]
     
    ...
    제대로 암호화되어서 무슨 내용인지 알아볼 수 없네요. ^^;

댓글 없음:

댓글 쓰기