前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初识加密算法

初识加密算法

作者头像
用户1462769
发布2019-08-09 13:54:41
1.1K0
发布2019-08-09 13:54:41
举报
文章被收录于专栏:全栈者全栈者

本文中使用到的代码可至https://github.com/FantasyGao/FantasyGao.github.io获取。 1.加密算法的意义

很简单,加密算法的出现正是为了解决万物互联下数据隐私与安全的问题,在畅游于网络之中时候,那便是数据在不停的交换和流动的时候,如果没有加密算法,我们的 各种密码,或者一些私密信息便在网络中“裸奔”,只要有攻击者去拦截你在交换数据时发出的请求操作,那便意味着你毫无私密可言。

2.加密算法的使用的场景

从我现在接触的技术来看,使用加密的场景其实并不是很多,因为互联网本来就是万物互联,信息共享为基础的,如很多的网站,出发点就是让人去阅读去了解它,但是你在 网站上做一些想要让其他人知道这个是你做的记录的时候,你便需要像现实生活中一样,创建一个网站身份证,这个操作就是你注册账号的过程,这时候会一个密码来让这个 账号只能让你登录,所以这个密码不能让其他人知道的,所以当你填写完密码提交的时候会发送一个加密后的串,提交给网站后台入库,为了安全不被脱库,网站只会存这个 串,所以这个密码一般是除了你连网站人员也不知道的,这就是你忘了密码后,只能改,不能找回的原因。这种加密方式是不可解密的。还是注册这个过程,很多时候我们都 是填手机号注册的,但是把用户存入数据库也是很不安全的,所以这时候还需要将手机号码加密后存进去,但是存入手机号后,网站一般需要给你发验证码什么的,这肯定不 能像加密密码那种不能解密的方式,这个时候就需要能够解密出来的算法,一般在这个环节,后台会使用对称加密算法加密你的手机号入库,这个操作是需要一个加密秘钥的, 当要给你发一些营销信息等等的时候,再用该密钥解密出来就可以了。

不需要解密的算法有很多种,如md5,sha1,sha0, sha256, sha384等,下面举几个例子

代码语言:javascript
复制
// node.js
require('crypto')
.createHash('md5'|'sha'|'sha1'|'sha256')
.update('password', 'utf8')
.digest('hex');
代码语言:javascript
复制
# 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这个的时候要选择一个算法为你 的数据加密,在那里的算法都是对称加密方式的。如下代码为对称加密例子

代码语言:javascript
复制
// 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');
代码语言:javascript
复制
# mysql
select AES_decrypt(AES_ENCRYPT('手机号码', 'my-key'), 'my-key')
select DES_decrypt(DES_ENCRYPT('手机号码', 'my-key'), 'my-key')

当我们在注册的过程中,甚至连手机号都不想暴露,但是又不能使用对称加密,因为对称加密需要秘钥协作完成,此时我们就需要一种新的方式完成,首先要使得前端传输的 数据加密,其次注册信息在后台还要能解析开,这时候就需要两把钥匙,一把能够公开的,一把不能公开的,它两必须是一对一的,客户端拿到公开的钥匙将数据加密,返回 至服务端,服务端拿私有的钥匙解开数据,完成过程,该过程就叫做非对称加密。

对称加密相比非对称加密更加高效快速,而非对称加密则更加安全,所以使用的过程中应该有所选择,选择合适的方式。

3.https与加密算法

在没有https之前我们使用http,它就属于“裸奔”的那种,所有数据交换信息都是明文传输,安全性较低。https的出现就是为传输数据加锁,提高安全性与可靠性,https等于http加SSL/TLS,https中既有对称加密也有非对称加密,它就是充分利用各个算法优点。https原理可看这边文章,我觉得写的很棒。

4.md5碰撞

碰撞的意思就是有两个不同的来源却得出相同的结果。学习的时候,看到的例子。

代码语言:javascript
复制
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)

5.sha1碰撞

谷歌工程师对于两张不同的PDF,通过sha1算法获取文件hash值得时候,发现他们的hash完全相等。pdf1pdf2

代码语言:javascript
复制
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

6.总结

加密算法只是对数据世界的给一个身份证,它是有限多的,但是数据是无限多的,任何的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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文中使用到的代码可至https://github.com/FantasyGao/FantasyGao.github.io获取。 1.加密算法的意义
  • 2.加密算法的使用的场景
  • 3.https与加密算法
  • 4.md5碰撞
  • 5.sha1碰撞
  • 6.总结
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档