aes对称加密 -- node版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bob_baobao/article/details/78321711

概念

对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。 主流的有 AES, DES。
非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。主流的有RSA,DSA。

Node例子

util.js 加解密实现

const crypto = require('crypto');
const _algorithm = 'aes-256-cbc';
const _iv = '66666666666666666666666666666666';
const ivBuffer = new Buffer(_iv, 'hex');
var util = {};
/**
 * @desc: 加密
 * @param: data: 待加密的内容; dataEncoding: 内容编码; key: 秘钥; 
 *         keyEncoding: 秘钥编码; padding: 自动填充加密向量
 */
util.encrypt = function(data, dataEncoding, key, keyEncoding, padding) {
    let keyBuf = null;

    if (key instanceof Buffer) {
        keyBuf = key;
    } else {
        keyBuf = new Buffer(key, keyEncoding);
    }

    let dataBuf = null;
    if (data instanceof Buffer) {
        dataBuf = data;
    } else {
        dataBuf = new Buffer(data, dataEncoding);
    }

    let cipher = crypto.createCipheriv(_algorithm, keyBuf, ivBuffer);
    cipher.setAutoPadding(padding);
    let cipherData = cipher.update(dataBuf, 'buffer', 'base64');
    cipherData += cipher.final('base64');

    return cipherData;
};

/**
 * @desc:  解密
 * @param: data: 待解密的内容; dataEncoding: 内容编码; key: 秘钥; 
 *         keyEncoding: 秘钥编码; padding: 自动填充加密向量
 */
util.decypt = function(data, dataEncoding, key, keyEncoding, padding) {

    let keyBuf = null;
    if (key instanceof Buffer) {
        keyBuf = key;
    } else {
        keyBuf = new Buffer(key, keyEncoding);
    }

    let dataBuf = null;
    if (data instanceof Buffer) {
        dataBuf = data;
    } else {
        dataBuf = new Buffer(data, dataEncoding);
    }

    var decipher = crypto.createDecipheriv(_algorithm, keyBuf, ivBuffer);
    decipher.setAutoPadding(padding);
    var decipherData = decipher.update(dataBuf, 'binary', 'binary');
    decipherData += decipher.final('binary');
    var str3 = Buffer.from(decipherData, 'binary');

    return str3.toString('utf8');
};

module.exports = util;

test.js 调用加解密

const util = require('./util');
const _srvKey = Buffer.from('11111111111111111111111111111111', 'utf8').toString('hex');

let test = function () {
  // 加密
  let enData = util.encrypt('Bob Gao', 'utf8', _srvKey, 'hex', true);
  console.log('enData', enData);
  // 解密
  let deData = util.decypt(enData, 'base64', _srvKey, 'hex', true);
  console.log('deData', deData);
};

test();

module.exports = test;

效果: node控制台输出加解密值。
这里写图片描述

总结

  1. iv需要32位, key秘钥也需要32位。
  2. 对称加密优缺点:
    优点: 加密效率高,易用。
    缺点: 秘钥如何管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。

应用场景: 服务端之间的通信, 秘钥统一由运维管理。

展开阅读全文

没有更多推荐了,返回首页