概念
对称加密是最快速、最简单的一种加密方式,加密(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控制台输出加解密值。
总结
- iv需要32位, key秘钥也需要32位。
- 对称加密优缺点:
优点: 加密效率高,易用。
缺点: 秘钥如何管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。
应用场景: 服务端之间的通信, 秘钥统一由运维管理。