很简单,加密算法的出现正是为了解决万物互联下数据隐私与安全的问题,在畅游于网络之中时候,那便是数据在不停的交换和流动的时候,如果没有加密算法,我们的 各种密码,或者一些私密信息便在网络中“裸奔”,只要有攻击者去拦截你在交换数据时发出的请求操作,那便意味着你毫无私密可言。
从我现在接触的技术来看,使用加密的场景其实并不是很多,因为互联网本来就是万物互联,信息共享为基础的,如很多的网站,出发点就是让人去阅读去了解它,但是你在 网站上做一些想要让其他人知道这个是你做的记录的时候,你便需要像现实生活中一样,创建一个网站身份证,这个操作就是你注册账号的过程,这时候会一个密码来让这个 账号只能让你登录,所以这个密码不能让其他人知道的,所以当你填写完密码提交的时候会发送一个加密后的串,提交给网站后台入库,为了安全不被脱库,网站只会存这个 串,所以这个密码一般是除了你连网站人员也不知道的,这就是你忘了密码后,只能改,不能找回的原因。这种加密方式是不可解密的。还是注册这个过程,很多时候我们都 是填手机号注册的,但是把用户存入数据库也是很不安全的,所以这时候还需要将手机号码加密后存进去,但是存入手机号后,网站一般需要给你发验证码什么的,这肯定不 能像加密密码那种不能解密的方式,这个时候就需要能够解密出来的算法,一般在这个环节,后台会使用对称加密算法加密你的手机号入库,这个操作是需要一个加密秘钥的, 当要给你发一些营销信息等等的时候,再用该密钥解密出来就可以了。
不需要解密的算法有很多种,如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次方的结果,当你枚举完后所有结果,是不是就 会有一种和你输入的密码达到同样的效果,从而冒充你登录网站不安全呢,当然目前这很难做到,所以说这个算法在现在是很安全的。
对称加密的算法,AES,DES、TripleDES、RC2、RC4、RC5和Blowfish等,还有用过shadowsocks的同学一定知道选method这个的时候要选择一个算法为你 的数据加密,在那里的算法都是对称加密方式的。如下代码为对称加密例子
// 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')
当我们在注册的过程中,甚至连手机号都不想暴露,但是又不能使用对称加密,因为对称加密需要秘钥协作完成,此时我们就需要一种新的方式完成,首先要使得前端传输的 数据加密,其次注册信息在后台还要能解析开,这时候就需要两把钥匙,一把能够公开的,一把不能公开的,它两必须是一对一的,客户端拿到公开的钥匙将数据加密,返回 至服务端,服务端拿私有的钥匙解开数据,完成过程,该过程就叫做非对称加密。
对称加密相比非对称加密更加高效快速,而非对称加密则更加安全,所以使用的过程中应该有所选择,选择合适的方式。
在没有https之前我们使用http,它就属于“裸奔”的那种,所有数据交换信息都是明文传输,安全性较低。https的出现就是为传输数据加锁,提高安全性与可靠性,https等于http加SSL/TLS,https中既有对称加密也有非对称加密,它就是充分利用各个算法优点。https原理可看这边文章,我觉得写的很棒。
碰撞的意思就是有两个不同的来源却得出相同的结果。学习的时候,看到的例子。
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完全相等。pdf1pdf2
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/bf1d7eee28d0 https://juejin.im/post/5b48b0d7e51d4519962ea383 https://blog.csdn.net/caiqiiqi/article/details/68953730 https://cherryblog.site/HTTPS.html