一口气带你掌握hash加密、对称加密、非对称加密
一口气带你掌握hash加密、对称加密、非对称加密
从古至今,加密都与我们息息相关,到现代网络安全中,加密技术更是作为核心支柱。今天,我们就用通俗易读的方式来讲讲常见的加密方式及其原理。
场景如下:
假设皇叔和丞相在现代,皇叔正在东讨东吴,现在要告知丞相今晚驻扎于夷陵,但又害怕被敌人知道情报,于是需要对信息进行加密
这里先推荐一个在线加解密网站https://www.sojson.com/encrypt.html
Hash加密
定义
hash加密是一种单向的加密方式,他可以将任意长度的输入数据转化为固定长度的输出数据,这个过程一般是“不可逆”的
常见的Hash加密方法
- MD5
目前算是比较常用的加密方法,但是由于一些常见的简单密码已经被破解,存在一定风险
- SHA系列
SHA1(160)、SHA2(224)、SHA224、SHA256、SHA384、SHA512等
后面的位数代表生成hash值的二进制数,但一般展示给我们的是人易读的16进制数(也就是0-F),也就是它的二进制数/4位。
位数越多,代表越难被暴力破解
- HMAC系列
HmacMD5、HmacSHA1、HmacSHA2、HmacSHA256、HmacSHA384等
Hash缺点
想必大家也注意到了我之前在不可逆处打了引号,因为他毕竟是生成的固定的数据,可以想象一下,如果我们有一个超大的数据库,里面保存了常见密码或数字组合hash加密后的数据,是不是我们只需要去匹配加密结果,就能得到想要的原文?所以这也就存在了被暴力破解的风险。
但是啊如果密码复杂一些,还是很难做到的,毕竟别人需要用大量的时间和资源去验证你的原文,这是非常不划算的。
Hash应用场景
说回我们原始场景,如果皇叔的消息想要传到到丞相那里,皇叔选择了SHA256的加密方式,加密后的密文如下:
可以看到这个消息,除了加密的皇叔,其他人都不知道什么意思,但如果要让丞相知道含义,那么丞相那里必须存有一套他们常用话语加密后的模版,待收到消息后再进行对照找到具体的含义。
可是这安全了吗?如果丞相那边失窃怎么办,不就等于明文在传输?
这也说明hash加密只能适用用于特定场景的验证需求,比如密码的校验,数据库密码为保证用户隐私用hash存储,用户输入密码只需要校验hash值是否一致即可验证密码是否正确。
那如果皇叔要和丞相连续发消息怎么保证信息安全呢?于是聪明的人们又想到了另一种方法
对称加密
定义
对称加密的加密和解密都需要使用一个相同的密钥。这意味着,如果某人使用某个密钥对消息进行了加密,那么只有持有相同密钥的人才能解密该消息。
常见的对称加密方法
AES
DES
安全性不高,可以被暴力破解,也就是我们说的“撞库”
- RC系列算法
RC2、RC4、RC5等
- rabbit
皇叔和丞相约定了一个密钥
皇叔666
,那么他发送给丞相的就是加密后的
U2FsdGVkX18XQF6vnbNbK2B2kO3K3T5MfGrtwLanl0d5e+gq0oMzwEdkhK3FTW0/
而丞相也可以把密文,用约定的密钥解成原文
对称加密之间的区别
那既然对称加密算法都是使用相同的密钥进行加密和解密,他们有啥区别?
- 加解密效率
加密也是通过程序设计者通过算法来实现的,设计者不同,算法就会有差异,而算法的不同就会带来加解密效率的差异,毕竟谁也不想加解密占用过多的资源和时间。
- 安全性
一些加密算法由于设计时间太早已经不符合现代安全需求,如DES因为密钥长度太短,容易被暴力破解
而AES支持128、192、256位密钥的加密,所以安全级别会高一些
缺点
好了,现在皇叔和丞相可以实时聊天了,那问题又来了,陆逊嘟嘟有没有办法知道他们之间的密钥呢?皇叔和丞相如果第一次约定密钥如果不是线下约定而是通过聊天软件或邮件的方式,是不是也有可能被知道?
如何再安全一点?
非对称加密
定义
非对称加密是一种使用一对密钥进行加密和解密的加密方式。这一对密钥包括一个公开密钥(Public Key)和一个私有密钥(Private Key)。公开密钥可以公开给任何人使用,而私有密钥则只有密钥的持有者自己才知道。加密和解密操作分别使用这两个不同的密钥进行。
简而言之就是我们把上面的密钥
皇叔666
变成丞相的公钥,这个公钥暴露在外面,谁都可以知道,但是丞相自己有一个私钥可以进行解密,这种情况就算被截获了也无所谓,对方无法知道具体内容。
常见的非对称加密方式
- RSA
RSA算法具有较高的安全性和较好的性能,广泛应用于数字证书、SSL/TLS协议、加密货币等领域
- DSA
DSA算法的密钥长度比RSA算法短,但加密效率相对较低。不过,它在数字签名方面表现出色,常用于确保数据的真实性和完整性。
- ECC
但大家有没有发现这里有一个问题,陆逊嘟嘟虽然不知道刘皇叔说了什么,但是他也可以使用丞相的公钥自己加密一个消息发给丞相。一个致命的问题,如何证明皇叔是皇叔?
为了防止嘟嘟对消息的伪造和篡改,于是我们引出签名的概念
数字签名
众所周知,既然丞相能有自己的公钥和私钥,那我皇叔也能!
于是皇叔在发送消息时,用自己的私钥对信息内容进行签名,丞相收到消息时,用皇叔的公钥进行验签,若一致,则证明是皇叔本人。
这时候如果嘟嘟在篡改消息时用自己的私钥去签名,那么丞相在用皇叔的公钥进行验签时,就会出现签名不一致的情况,那就证明这个消息是被篡改过的!
一些关系非对称加密的问题
- 为什么我的私钥签名的东西,能用公钥验签/为什么我公钥加密的东西,能用私钥解密呢?
私钥签名的原理:
当你使用私钥对数据进行签名时,你实际上是在对数据进行某种数学变换,这种变换是基于私钥的。签名算法会生成一个与数据内容和私钥都相关的唯一签名值。
公钥验签的原理:
当你使用公钥对签名进行验证时,你实际上是在检查签名值是否由对应的私钥生成。验证过程涉及对签名值进行某种数学变换,这种变换是基于公钥的。如果签名值是由对应的私钥生成的,那么验证过程将成功,表明数据的完整性和真实性得到了确认。
既然私钥这么重要,我私钥的安全谁来替我保证呢?
私有性:私钥具有高度的私密性。只有私钥的持有者(或生成者)知道私钥的具体内容,而这个一般保存于持有者物理介质-硬件中。
唯一性:每个私钥都是独一无二的,与特定的公钥相对应,具体不可复制和替代性。
加密与权限控制:私钥文件往往使用强密码或其他加密技术来保护私钥的机密性,且设有严格的访问控制机制
以上这些原因都保障了个人私钥安全性
- 如何生成一个我的公钥和私钥呢?以Windows-RSA举例
Windows
1. 打开cmd,输入
ssh-keygen -t rsa -b 1024
这里的-t rsa表示生成RSA类型的密钥,-b 1024指定密钥长度为1024位
2. 然后系统会提示你选择文件保存路径
默认为C:\Users\YourUsername\.ssh\id_rsa
3. 生成的文件包括id_rsa.pub(公钥)和id_rsa(私钥)
其他系统可自行搜索方法
非对称加密与对称加密的区别
毫无疑问,非对称加密的
安全性
远远高于对称加密
正因为其出色的安全性,加密和解密都涉及到了复杂的数学运算,他的速度远远不如对称加密,其带来的资源消耗也远远大于对称加密
所以一般情况下,双方在第一次会使用非对称加密来约定一个双方以后使用的密钥,在这之后将会用这个密钥并使用对称加密的方式来传输信息。然后再定期更换密钥。