加密算法的基础学习

加密算法主要作用是把明文变成密文,防止信息泄露。加密后的密文看起来和乱码很像,但却不是乱码。大部分乱码是由于编码不一致导致的,编码不属于加密算法,只是改变了显示格式而已。

加密算法需要保证以下三点:

1.机密性:保证数据即使被盗取,小偷也不知道是啥。

2.完整性:保证数据在传输过程中即使被劫持修改,接收方能够发现信息已被截取,而选择换掉。

3.可用性:保证加密算法的开销、复杂度都在可用范围。

满足上述要求的加密算法经历了从古典密码过渡到现代密码的漫长历史发展时期。

加密算法的历史

最早的加密算法可以追溯到古罗马时期,古罗马时期是一个动荡的时期,会经常发生战争,加密算法就被应用到了战争中。

在大规模的战争中,部队之间常常需要信使往来,传递重要的军事情报。可是,一旦信使被敌军抓获,重要的军事情报就完全暴露给了敌方。甚至,狡猾的敌人有可能篡改军事情报,并收买信使把假情报传递给我方部队。这样一来,我方部队就完全落入到了敌方的陷阱之中。这种拦截并篡改信息的手法,在网络安全领域被称为中间人攻击。怎样防止这种情况的发生呢?不让信使被敌人抓获?这个肯定是无法绝对避免的。于是就产生了在情报内容上做文章的想法:就是让敌人获取了情报也看不懂情报的内容,这就是对情报的加密。

但是对于古罗马时代的加密是怎么进行实现的呢?就是选择一个便宜量,把明文中的字母表按照偏移量向后进行偏移。从而生成密文。

如下图所示:

image

经过上面的处理之后,就会生成一个新的字母表,然后将信息内容根据新的字母表进行改造就行了:

就比如说:egg ->dff,这种加密算法就被称为凯撒密码。凯撒密码终归是平移,这样的平移的最多也就是25中顺序,所以也就终归是能够进行试验没然后暴力破解的。

随着时间的发展,到二战时期,德国在信息传递过程中使用了一种叫做恩尼格码的东西,来加密信息。后来图灵发明了图灵机,用来使用机器对抗机器的方法,来进行破译德国的情报。最终赢得了战争。有部电影叫做《模仿游戏》,主要就是讲述这一段儿的故事。

再后来随着计算机的发展,信息安全的也变得越来越重要,然后就产生了加密密码等相关的知识内容。

加密算法的分类

在安全性要求比较高的系统中都会涉及到数据的加密、解密。按照可否进行解密来说,我们可以将加密算法分为可逆加密和不可逆加密。

不可逆加密

不可逆加密算法,特点:加密了,永远不能解密的算法。直到宇宙的尽头也不行。常见的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和SHA-512,其中SHA-224、SHA-256、SHA-384,和SHA-512我们可以统称为SHA2加密算法,SHA加密算法的安全性要比MD5更高,而SHA2加密算法比SHA1的要高。其中SHA后面的数字表示的是加密后的字符串长度,SHA1默认会产生一个160位的信息摘要。

由于这些加密都是不可逆的,因此比较常用的场景就是用户密码加密,其验证过程就是通过比较两个加密后的字符串是否一样来确认身份的。网上也有很多自称是可以破解MD5密码的网站,其原理也是一样,就是有一个巨大的资源库,存放了许多字符串及对应的MD5加密后的字符串,通过你输入的MD5加密串来进行比较,如果过你的密码复杂度比较低,还是有很大机率验证出来的。

MD5加密算法

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

NodeJs中只用MD5算法

在NodeJs中使用MD5算法其实很简单,直接使用MD5的一个库。

  1. 在项目中使用npm install md5来安装相对应的MD5的一个加密的包

  2. 然后开始使用

    const md5 = require('md5');
    
    console.log(md5('hello world'));
    
    // 运行输出的结果为:5eb63bbbe01eeed093cb22bb8f5acdc3
    

当然这个MD5的库,还具有第二个参数,即options。具体的使用可以参看其文档:

https://github.com/pvorb/node-md5

还有另外的一个库:https://github.com/brix/crypto-js,这个库中存在有常用的多种加密的算法可供我们进行使用。

MD5算法的使用场景

有关MD5算法的常用的使用场景如下:

  • 对用户密码进行加密
  • 请求参数进行校验
  • 对文件进行校验

SHA系列算法

SHA安全散列算法SHA (Secure Hash Algorithm,SHA)

是美国国家标准技术研究所发布的国家标准FIPS PUB 180,最新的标准已经于2008年更新到FIPS PUB 180-3。其中规定了SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512这几种单向散列算法。SHA-1,SHA-224和SHA-256适用于长度不超过264二进制位的消息。SHA-384和SHA-512适用于长度不超过2128二进制位的消息。

HMAC加密算法

由H.Krawezyk,M.Bellare,R.Canetti于1996年提出的一种基于Hash函数和密钥进行消息认证的方法,它可以与任何迭代散列函数捆绑使用。

HMAC运算利用hash算法,以一个消息M和一个密钥K作为输入,生成一个定长的消息摘要作为输出。HMAC算法利用已有的Hash函数,关键问题是如何使用密钥。

HMAC的密钥长度可以是任意大小,如果小于n(hash输出值的大小),那么将会消弱算法安全的强度。建议使用长度大于n的密钥,但是采用长度大的密钥并不意味着增强了函数的安全性。密钥应该是随机选取的,可以采用一种强伪随机发生器,并且密钥需要周期性更新,这样可以减少散列函数弱密钥的危险性以及已经暴露密钥所带来的破坏。

MD5算法和SHA系列算法的特点

1、压缩性:无论数据长度是多少,计算出来的MD5SHA256值长度相同

2、容易计算性:由原数据容易计算出MD5SHA256

3、抗修改性:即便修改一个字节,计算出来的MD5SHA256值也会巨大差异

4、抗碰撞性:知道数据和MD5SHA256值,很小概率找到相同MD5SHA256值相同的原数据。

可逆加密算法

可逆加密算法相对于不可逆加密算法来讲,其特点就是特点:加密了,还能够进行解密(即还原成原来的内容)。

可逆加密算法又被分为对称加密算法和非对称加密算法。

对称加密算法

对称加密就是加密密钥和解密秘钥是同一个,这种加密方式应该是较容易理解,这也是一种使用比较早的加密方式。我们平时碰到的绝大多数加密就是对称加密,比如:指纹解锁,PIN 码锁,保险箱密码锁,账号密码等都是使用了对称加密。

常见的对称加密算法有以下三种:

  1. DES(Data Encryption Standard):数据加密标准(现在用的比较少,因为它的加密强度不够,能够暴力破解)
  2. 3DES:原理和DES几乎是一样的,只是使用3个密钥,对相同的数据执行三次加密,增强加密强度。(缺点:要维护3个密钥,大大增加了维护成本)
  3. AES(Advanced Encryption Standard):高级加密标准,目前美国国家安全局使用的,苹果的钥匙串访问采用的就AES加密。是现在公认的最安全的加密方式,是对称密钥加密中最流行的算法。

对称加密的优缺点:

  • 算法公开,计算量小,加密速度快,加密效率高

  • 双方使用相同的钥匙,安全性得不到保证

非对称加密

非对称加密有两个密钥:公钥和私钥,如果使用公钥进行加密,那么只能使用私钥才能对解密;如果使用私钥进行加密,那么只能使用公钥才能够进行解密。因为加密秘钥和解密秘钥是两个不同的秘钥,因此,被称为非对称加密。

常见的非对称加密方法有:

  • RSA加密算法
  • DSA加密算法
RSA加密算法

这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。

这种加密算法的特点主要是密钥的变化,上文我们看到DES只有一个密钥。相当于只有一把钥匙,如果这把钥匙丢了,数据也就不安全了。RSA同时有两把钥匙,公钥与私钥。同时支持数字签名。数字签名的意义在于,对传输过来的数据进行校验。确保数据在传输工程中不被修改。

有管这个RSA的加密算法是不是看上去很眼熟,没错,这个就是我们在给gitlab或者是github添加SSH公钥的时候见过:

类似于下面

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMVf93CVHj8qwqRlB/rbLxSBrY
pAjeZT5cdrQoAGj5csE8wzxk2P4w7aRgDxDckUtA/YUwF9FNy9SkcwnRVJnzm9ub
OwWA/Uz1m3WRaToPcMmGz/F6r1ItqC2zpV8rwT7JibHI7acuEajnrGk/hWHR4le9
QOQGACfpeHlGJwYczwIDAQAB
-----END PUBLIC KEY-----

而私钥则类似于下面的内容:

-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCMVf93CVHj8qwqRlB/rbLxSBrYpAjeZT5cdrQoAGj5csE8wzxk
2P4w7aRgDxDckUtA/YUwF9FNy9SkcwnRVJnzm9ubOwWA/Uz1m3WRaToPcMmGz/F6
r1ItqC2zpV8rwT7JibHI7acuEajnrGk/hWHR4le9QOQGACfpeHlGJwYczwIDAQAB
AoGAKAnZKxMjpA92g1EwYl0icqiJ0ElsplboZeUQHWGQkarl6vog3vzx+O+0OBvU
SbnCaLZsK36AHtwKvSh9IpYqneLyA3QL3YGVmxaMhAUtYN6B99rKk5+kH65lC2vK
35CJ8IA2/wlBn1txQdVjGu09xo4S9b7k7mMJATW59foFbHECQQDchjzrntZMj2vJ
Eb35w58febvaoUXsdu7LKxddqeDeTLorIKPETbSO/IhnVkh5DNlW3G8tpEvvNWxq
i4GDCbNbAkEAoulksIJUTkjhFoz5ZFN/djZEasdemUsH2DVTWUilqvt3JbpBt9bu
8JsojPDJiJWmwUuNW7+yEikPBWWSM7m6nQJAVFgbcNsdh8bLKOpaSO8jKzy6NtK8
FccfaiGfHDnfQecCxYAEYw59Yrr/yNZdfb8GWYySEVjnmiRKxS16aY4KRQJABIWL
2OZVJrMZJEIXbfRvVj2dWoVcF88gUZzxSkoc5wkBvpdT2aFqkl0MHBVW0qassTLC
oqhIbf6bvx+ZljvydQJAI8/FGcE04XgReuvZEDaJ6h44k5BfH7je+8LEvLBvyhwh
B4TNrwfO5UnsRuu6BwXWK+TCydr996ScrlSBsjQGhA==
-----END RSA PRIVATE KEY-----
DSA加密算法

DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard)。简单的说,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签 名。如果数据和签名不匹配则认为验证失败!数字签名的作用就是校验数据在传输过程中不被修改。数字签名,是单向加密的升级!

DSA算法和RSA算法的有什么区别
  • 二者都是数字签名算法中的重要组成,缺一不可;

  • DSA算法仅仅包含数字签名算法,一般不用于加密算法中(某些扩展可以支持加密);

  • DSA算法仅产生数字证书,信息仅能用于验证,不适合进行加密通信,所以HTTPS不会使用这个算法;

  • RSA算法包含加解密的密钥信息,同时可作为数字签名算法;

小结

有关加密算的内容远不止我上面更新的这么多,只是最近研究https的时候引出了对称加密和分对称加密,促使我稍微深入的了解了一下加密相关的基础内容。

至于对加密算法的研究后续应该还是会进行更加的深入的了解和学习,上面的东西仅仅只是我对加算法的一个扫盲。

posted @ 2021-12-06 23:20  水之水的水  阅读(807)  评论(0编辑  收藏  举报