音乐
先来一首陈势安的 《 天后 》来缓解一下疲惫的心情吧
MD5简介
1.定义
MD5即Message-Digest Algorithm 5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用
的一种散列函数,用以提供消息的完整性保护。
2.作用
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被”压缩”成一种保密的格式(就是把一
个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有
sha-1、RIPEMD以及Haval等。
3.MD5算法特点
MD5算法具有以下特点:
(1) 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
(2) 容易计算:从原数据计算出MD5值很容易。
(3) 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
(4) 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困
难的。
Node.js使用MD5
注: MD5是一种常用的哈希算法,用于给任意数据一个“签名”。这个签名通常用一个十六进制的字符串表示:
const crypto = require('crypto'); //引入crypto加密模块
const hash = crypto.createHash('md5'); //规定使用哈希算法中的MD5算法
// 可任意多次调用update(),效果相当于多个字符串相加
hash.update('123a');
hash.update('456');
//最终加密的字符串为'123a456',hash.digest('hex')表示输出的格式为16进制
console.log(hash.digest('hex')); // 57d15a6ee827933b25dab42111b6803b
update()方法默认字符串编码为UTF-8,也可以传入Buffer。
注:
如果要计算SHA1,只需要把'md5'改成'sha1',就可以得到SHA1的结果
3be8b1b4c1b081f65522c4dd69b1d5c5713b038b。当然还可以使用更安全的sha256和sha512。
同样,可以将MD5算法封装成一个函数 , 方便重复调用
const crypto = require('crypto');
function md5 (text) {
return crypto.createHash('md5').update(text).digest('hex');
};
目前单次的MD5加密并不安全,很容易被暴力破解,因此推荐多次加密和使用秘钥加密
1.多次MD5加密
例如要加密 '123' 这个字符串
const crypto = require('crypto');
function md5 (text) {
return crypto.createHash('md5').update(text).digest('hex');
};
多次加密:
var str='123';
var pass=md5(str);
var FinalPass=md5(pass);
多次MD5加密不容易被破解,但是嵌套起来也比较麻烦, 因此我再介绍另外一种方法
2.MD5结合秘钥加密
例如要加密 '123' 这个字符串
const crypto = require('crypto');
function md5 (text) {
return crypto.createHash('md5').update(text).digest('hex');
};
结合秘钥加密:
var str='123';
var md5_suffix='asd1wdad1d哈do捱三顶五#&8qw'; //md5_suffix作为秘钥,越复杂越好
var FinalPass=md5(str+md5_suffix);
结合秘钥使用MD5加密更难被破解,但是也有一定的缺陷,就是如果秘钥一旦丢失就无法进行验证
MD5加密语句的详细讲解
(1) crypto.createHash(algorithm)
创建并返回一个hash对象,它是一个指定算法的加密hash,用于生成hash摘要。
参数algorithm可选择系统上安装的OpenSSL版本所支持的算法。例如:'sha1', 'md5', 'sha256',
'sha512'等。在近期发行的版本中,openssl list-message-digest-algorithms会显示这些可用的摘要算法
(2) hash.update(data)
更新hash的内容为指定的data。当使用流数据时可能会多次调用该方法。
(3) hash.digest(encoding='binary')
计算所有传入数据的hash摘要。参数encoding(编码方式)可以为'hex', 'binary' 或者'base64'。