数据加密
http://www.cnblogs.com/chyingp/p/nodejs-learning-crypto-theory.html
摘要算法
//应用场景
文件校验:比如从网上下载一个软件,一般网站都会将软件的md5值附在网页上,用户下载完软件后,可对下载到本地的软件进行md5运算,然后跟网站上的md5值进行对比,确保下载的软件是完整的(或正确的)
密码保护:将md5后的密码保存到数据库,而不是保存明文密码,避免拖库等事件发生后,明文密码外泄。
防止篡改:比如数字证书的防篡改,就用到了摘要算法。(当然还要结合数字签名等手段)
//简单示例
var crypto = require('crypto');
var md5 = crypto.createHash('md5');
var result = md5.update('a').digest('hex');
console.log(result);
//=> 0cc175b9c0f1b6a831c399e269772661
//密码保护
//方式1:直接加密()
var crypto = require('crypto');
function cryptPwd(password) {
var md5 = crypto.createHash('md5');
return md5.update(password).digest('hex');
}
var password = '123456';
var cryptedPassword = cryptPwd(password);
console.log(cryptedPassword);
// 输出:e10adc3949ba59abbe56e057f20f883e
//方式2:固定加盐
var crypto = require('crypto');
function cryptPwd(password, salt) {
// 密码“加盐”
var saltPassword = password + ':' + salt;
console.log('原始密码:%s', password);
console.log('加盐后的密码:%s', saltPassword);
// 加盐密码的md5值
var md5 = crypto.createHash('md5');
var result = md5.update(saltPassword).digest('hex');
console.log('加盐密码的md5值:%s', result);
}
cryptPwd('123456', 'abc');
cryptPwd('123456', 'bcd');
//方式3:随机加盐
var crypto = require('crypto');
function getRandomSalt(){
return Math.random().toString().slice(2, 5);
}
function cryptPwd(password, salt) {
// 密码“加盐”
var saltPassword = password + ':' + salt;
console.log('原始密码:%s', password);
console.log('加盐后的密码:%s', saltPassword);
// 加盐密码的md5值
var md5 = crypto.createHash('md5');
var result = md5.update(saltPassword).digest('hex');
console.log('加盐密码的md5值:%s', result);
}
var password = '123456';
cryptPwd('123456', getRandomSalt());
cryptPwd('123456', getRandomSalt());
//方式4:避免碰撞?
//摘要碰撞:简单的说,就是两段不同的字符串,经过MD5运算后,得出相同的结果。
function getHashResult(hexString){
// 转成16进制,比如 0x4d 0xc9 ...
hexString = hexString.replace(/(\w{2,2})/g, '0x$1 ').trim();
// 转成16进制数组,如 [0x4d, 0xc9, ...]
var arr = hexString.split(' ');
// 转成对应的buffer,如:<Buffer 4d c9 ...>
var buff = Buffer.from(arr);
var crypto = require('crypto');
var hash = crypto.createHash('md5');
// 计算md5值
var result = hash.update(buff).digest('hex');
return result;
}
var str1 = 'd131dd02c5e6eec4693d9a0698aff95c2fcab58712467eab4004583eb8fb7f8955ad340609f4b30283e488832571415a085125e8f7cdc99fd91dbdf280373c5bd8823e3156348f5bae6dacd436c919c6dd53e2b487da03fd02396306d248cda0e99f33420f577ee8ce54b67080a80d1ec69821bcb6a8839396f9652b6ff72a70';
var str2 = 'd131dd02c5e6eec4693d9a0698aff95c2fcab50712467eab4004583eb8fb7f8955ad340609f4b30283e4888325f1415a085125e8f7cdc99fd91dbd7280373c5bd8823e3156348f5bae6dacd436c919c6dd53e23487da03fd02396306d248cda0e99f33420f577ee8ce54b67080280d1ec69821bcb6a8839396f965ab6ff72a70';
var result1 = getHashResult(str1);
var result2 = getHashResult(str2);
if(result1 === result2) {
console.log(`Got the same md5 result: ${result1}`);
}else{
console.log(`Not the same md5 result`);
}
相关文档
http://www.cnblogs.com/chyingp/p/nodejs-learning-crypto-md5.html