很简单,加密算法的出现正是为了解决万物互联下数据隐私与安全的问题,在畅游于网络之中时候,那即是数据在不停的交换和流动的时候,若是没有加密算法,咱们的 各类密码,或者一些私密信息便在网络中“裸奔”,只要有攻击者去拦截你在交换数据时发出的请求操做,那便意味着你毫无私密可言。javascript
从我如今接触的技术来看,使用加密的场景其实并非不少,由于互联网原本就是万物互联,信息共享为基础的,如不少的网站,出发点就是让人去阅读去了解它,可是你在 网站上作一些想要让其余人知道这个是你作的记录的时候,你便须要像现实生活中同样,建立一个网站身份证,这个操做就是你注册帐号的过程,这时候会一个密码来让这个 帐号只能让你登陆,因此这个密码不能让其余人知道的,因此当你填写完密码提交的时候会发送一个加密后的串,提交给网站后台入库,为了安全不被脱库,网站只会存这个 串,因此这个密码通常是除了你连网站人员也不知道的,这就是你忘了密码后,只能改,不能找回的缘由。这种加密方式是不可解密的。仍是注册这个过程,不少时候咱们都 是填手机号注册的,可是把用户存入数据库也是很不安全的,因此这时候还须要将手机号码加密后存进去,可是存入手机号后,网站通常须要给你发验证码什么的,这确定不 能像加密密码那种不能解密的方式,这个时候就须要可以解密出来的算法,通常在这个环节,后台会使用对称加密算法加密你的手机号入库,这个操做是须要一个加密秘钥的, 当要给你发一些营销信息等等的时候,再用该密钥解密出来就能够了。html
不须要解密的算法有不少种,如md5,sha1,sha0, sha256, sha384等,下面举几个例子前端
// node.js
require('crypto')
.createHash('md5'|'sha'|'sha1'|'sha256')
.update('password', 'utf8')
.digest('hex');
# mysql
select MD5|SHA|SHA1('password');
select SHA2('password', 256| 384 | 512);复制代码
如上均可以达到加密的效果,至于各类方式的差异来讲,md5和sha,sha1在目前来讲已经在高标准加密的场合被启用了,例如之前github的log是sha1的,后来更换到了 sha256,由于位数较短,在运算愈来愈快的计算机环境下,逆向破解的过程也被加快,从而变得不安全。说明一下,上述的任何加密算法都是有可能被逆向破解出来的,只 是运算力够不够,运算的时间长不长的问题。由于加密以后的结果终归是有限结果集,就如256位的sha2算法,他有2的256次方的结果,当你枚举完后全部结果,是否是就 会有一种和你输入的密码达到一样的效果,从而冒充你登陆网站不安全呢,固然目前这很难作到,因此说这个算法在如今是很安全的。java
对称加密的算法,AES,DES、TripleDES、RC二、RC四、RC5和Blowfish等,还有用过ss软件的同窗必定知道选method这个的时候要选择一个算法为你 的数据加密,在那里的算法都是对称加密方式的。以下代码为对称加密例子node
// node.js
const aes = require('crypto').createCipher('aes192', 'my-key')
const secret = aes.update('手机号','utf8', 'hex') + aes.final('hex')
console.log(secret);
const des = require('crypto').createDecipher('aes192', 'my-key')
des.update(secret, 'hex', 'utf8')
console.log(des.final('utf8'));
//mysql-aes
require('mysql-aes').encrypt('手机号码', 'my-key');
require('mysql-aes').decrypt('480AE3E13FA619C5CBF3921E447A6C79', 'my-key');
复制代码
# mysql
select AES_decrypt(AES_ENCRYPT('手机号码', 'my-key'), 'my-key')
select DES_decrypt(DES_ENCRYPT('手机号码', 'my-key'), 'my-key')复制代码
当咱们在注册的过程当中,甚至连手机号都不想暴露,可是又不能使用对称加密,由于对称加密须要秘钥协做完成,此时咱们就须要一种新的方式完成,首先要使得前端传输的 数据加密,其次注册信息在后台还要能解析开,这时候就须要两把钥匙,一把可以公开的,一把不能公开的,它两必须是一对一的,客户端拿到公开的钥匙将数据加密,返回 至服务端,服务端拿私有的钥匙解开数据,完成过程,该过程就叫作非对称加密。mysql
对称加密相比非对称加密更加高效快速,而非对称加密则更加安全,因此使用的过程当中应该有所选择,选择合适的方式。
git
在没有https以前咱们使用http,它就属于“裸奔”的那种,全部数据交换信息都是明文传输,安全性较低。https的出现就是为传输数据加锁,提升安全性与可靠性,https等于http加SSL/TLS,https中既有对称加密也有非对称加密,它就是充分利用各个算法优势。https原理可看这边文章,我以为写的很棒。github
碰撞的意思就是有两个不一样的来源却得出相同的结果。学习的时候,看到的例子。算法
const crypto = require('crypto');
const hexStr2hexArr = str => {
let result = []
for(let i = 0; i<str.length/2; i++) {
const hexStr = str.slice(i*2, (i+1)*2)
result.push(parseInt(hexStr, 16))
}
return result
}
var tst = '0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc942feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef'
var tst1= '0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc942feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef'
var bt = hexStr2hexArr(tst)console.log(bt)var bt1 = hexStr2hexArr(tst1)console.log(bt1)const hash = crypto
.createHash('md5')
.update(Buffer(bt))
.digest('hex')const hash1 = crypto
.createHash('md5')
.update(Buffer(bt1))
.digest('hex')
console.log('hash', hash)
console.log('hash', hash1)复制代码
谷歌工程师对于两张不一样的PDF,经过sha1算法获取文件hash值得时候,发现他们的hash彻底相等。pdf1pdf2sql
const stream1 = require('fs').createReadStream('./20181230_2.pdf')
const stream2 = require('fs').createReadStream('./20181230_3.pdf')
const hash1 = require('crypto').createHash('sha1')
const hash2 = require('crypto').createHash('sha1')
stream1.on('data', data => hash1.update(data))
stream2.on('data', data => hash2.update(data))
stream1.on('end', ()=>console.log('file1 hash', hash1.digest('hex')))
stream2.on('end', ()=>console.log('file2 hash', hash2.digest('hex')))
$ node sha1.js
file1 hash 38762cf7f55934b34d179ae6a4c80cadccbb7f0a
file2 hash 38762cf7f55934b34d179ae6a4c80cadccbb7f0a复制代码
加密算法只是对数据世界的给一个身份证,它是有限多的,可是数据是无限多的,任何的hash算法都是有可能出现重复的,可能性小到能够忽略不计。
参考:https://www.jianshu.com/p/bf1d7eee28d0https://juejin.im/post/5b48b0d7e51d4519962ea383https://blog.csdn.net/caiqiiqi/article/details/68953730https://cherryblog.site/HTTPS.html