반응형

//예제 샘플 : https://gist.github.com/vlucas/2bd40f62d20c1d49237a109d491974eb?permalink_comment_id=2981938  

//샘플 변경 내용: const ENCRYPTION_KEY  대신 GetHashKey() 를 사용하여 OS 에 로그인 한 사용자 이름으로 Hash 코드 생성 후 필요한 길이 만큼만 사용하여 암호화/복호화에 사용

//////////////////////////////////////////////////////////////////////////////////////////////////
//  string -> encrypt
//  encrypted string -> decrypt
//////////////////////////////////////////////////////////////////////////////////////////////////

const crypto = require('crypto');
const os = require('os');

//(예제코드) const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY; // Must be 256 bits (32 characters)
 
const IV_LENGTH = 16; // For AES, this is always 16


module.exports = {

    //암호화
    encryptHandler : function(text)
    {
         let iv = crypto.randomBytes(IV_LENGTH);
        //(예제코드) let cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY), iv);
         let cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(GetHashKey()), iv);
         let encrypted = cipher.update(text);
         encrypted = Buffer.concat([encrypted, cipher.final()]);
         return iv.toString('hex') + ':' + encrypted.toString('hex');
    },

    //복호화
    decryptHandler : function(text)
    {
        let textParts = text.split(':');
        let iv = Buffer.from(textParts.shift(), 'hex');
        let encryptedText = Buffer.from(textParts.join(':'), 'hex');
        //(예제코드)  let decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY), iv);
        let decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(GetHashKey()), iv);
        let decrypted = decipher.update(encryptedText);      
        decrypted = Buffer.concat([decrypted, decipher.final()]);
        return decrypted.toString();
    }
 
}

//사용자 이름으로 Hash 값 발생
//발생 후 32 길이만 사용
function GetHashKey()
{    
    var result = crypto.createHash('sha256').update(os.userInfo().username).digest('hex');
    result = result.substring(0, 32);
    console.log("gethashkey -> hash = "+ result);
    return result;
}

 

반응형

+ Recent posts