如何从静态源生成crypto.createCipheriv参数

时间:2017-07-15 13:59:20

标签: javascript node.js security encoding cryptography

我使用以下代码加密node.js代码中的字符串。

我想了解如何从静态源生成KEYHMAC_KEY。在我的程序中,它是从现在开始随机生成的。由于它是随机生成的,我无法使用以下算法加密我的数据库密码。

crypto = require('crypto');

ALGORITHM = "AES-256-CBC"; 
HMAC_ALGORITHM = "SHA256"; 
KEY = crypto.randomBytes(32);
HMAC_KEY = crypto.randomBytes(32);

function (plain_text) {    
    var IV = new Buffer(crypto.randomBytes(16)); // ensure that the IV (initialization vector) is random   
    var cipher_text;
    var hmac;
    var encryptor;

    encryptor = crypto.createCipheriv(ALGORITHM, KEY, IV);
    encryptor.setEncoding('hex');
    encryptor.write(plain_text);
    encryptor.end();

    cipher_text = encryptor.read();

    hmac = crypto.createHmac(HMAC_ALGORITHM, HMAC_KEY);
    hmac.update(cipher_text);
    hmac.update(IV.toString('hex')); // ensure that both the IV and the cipher-text is protected by the HMAC

    // The IV isn't a secret so it can be stored along side everything else
    return cipher_text + "$" + IV.toString('hex') + "$" + hmac.digest('hex')

};

1 个答案:

答案 0 :(得分:1)

您必须将代码拆分为两个执行:

  1. 生成密钥并以可存储格式呈现密码的代码

    KEY = crypto.randomBytes(32);
    HMAC_KEY = crypto.randomBytes(32);
    console.log(KEY.toString('hex'));
    console.log(HMAC_KEY.toString('hex'));
    
  2. 使用存储密钥的代码

    KEY = Buffer.from('some key string', 'hex');
    HMAC_KEY = Buffer.from('some other key string', 'hex');
    
  3. 您只需确保您的密钥实际上不在您的代码中,而是放在某个文件中,因为在代码中硬编码密钥并将其检入您的版本控制系统是一个坏主意,可能会给您的开发人员访问他们可能不应该拥有的生产系统。