加密算法以及应用场景

204 阅读7分钟

一、加密算法概述

加密算法可以被分为单向加密算法双向加密算法

单向加密算法即不可逆的加密算法,将明文加密成密文后,无法由密文还原出明文,例如md5、sha1等。

双向加密算法即可逆的加密算法,明文加密为密文后,可以被解密还原为明文。加解密使用同一个密钥的称之为对称加密算法,例如AES、DES等;加解密使用不同密钥的称之为非对称加密算法,例如RSA、DSA等。

Q:base64是不是加密算法? A:不是,base64只是一种编码方式。

二、单向加密算法

1、md5

MD5(Message-Digest Algorithm)是信息摘要算法,对于任意输入产生出一个固定128bit(16字节、32个16进制数)的散列值(hash value)。

md5算法以512bit分组,每一组又分为16个32bit子分组,将若干个32bit的数据经过下面4种运算后,生成4个32位的分组,将这4个32位分组级联后最终生成一个128位的散列值。

F(X, Y, Z) = (X&Y) | ((~X) & Z)
G(X, Y, Z) = (X&Z) | (Y & (~Z))
H(X, Y, Z) = X^Y^Z
I(X, Y, Z) = Y^(X|(~Z))

在压缩的过程中中,是丢失了原信息的,举个例子:将人的名字取首字母,王小明会被加密成wxm,但是我们无法知道wxm到底是王小明还是汪小敏。

md5的安全性高不高?可以从两个方面来看: ① 知道密文M,容不容易找到一条记录A,使得md5(A)= M 【还原】 ② 知道明文A,容不容易找到另一条记录B,使得md5(A)= md5(B) 【碰撞

对于①,网上普遍都是采用的字典法、彩虹表法,属于暴力破解,创建明文密文对应查询数据库,如果加密算法越复杂 那么破解的时间就越长,如果生成的散列值越长 那么所需的硬盘空间内就越大。md5就属于算法又简单、散列值又短的,所以md5是被暴力破解的重灾区。

对于②,需要找到能产生hash碰撞的值,这是个难题,最终在04年被王小云教授用差分法攻破,目前用一台普通计算机在几秒内就可以找到碰撞值了。

所以在高安全性的场景下,md5已经被淘汰了,目前大多数用于查看数据包是否损坏。

md5 /users/a.pdf
MD5 (/users/a.pdf) = 96e79218965eb72c92a549dd5a330112

2、sha1

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

sha1是第一代安全散列算法,产生固定160bit的散列值,原理与md5类似,在05年的时候也被破解了,Google在17年的时候还发布了两份内容不同但SHA-1散列值相同的PDF文件作为证明。

sha1目前已经几乎没有应用场景了。

shasum -a 1 /users/a.pdf

3、sha2

sha2是第二代安全散列算法,包含了SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256六种,其中最出名的是SHA-256。

SHA-256将原数据分组后,经过以下六种位运算,产生出一个固定256位(32字节)的散列值。

Ch(x,y,z) = (x∧y) ⊕ (¬x∧z)
Ma(x,y,z) = (x∧y) ⊕ (x∧z) ⊕ (y∧z)
Σ0(x) = S²(x) ⊕ S¹³(x) ⊕ S²²(x)
Σ1(x) = S⁶(x) ⊕ S¹¹(x) ⊕ S²⁵(x)
σ0(x) = S⁷(x) ⊕ S¹⁸(x) ⊕ R³(x)
σ1(x) = S¹⁷(x) ⊕ S¹⁹(x) ⊕ R¹⁰(x)

∧:按位与
¬:按位非
⊕:异或
Sⁿ:循环右移n个bit
Rⁿ:右移n个bit

算法很复杂、散列值又比较长,厂商不愿意去算,导致现在sha256的查询数据库的内容远少于md5的。想找到sha256能产生碰撞的值更是没有一个良好的算法,几乎是不可能的。所以它非常安全。

shasum -a 256 /users/a.pdf

SHA-256目前被广泛应用于区块链技术中,以比特币举例:

image.png

区块链顾名思义就是链表,只有上一个区块的随机数K被计算出来了,才能计算下一个区块的K值。其中n值是动态控制的,n越大挖到矿的几率越小。

2、hs256

hs256是HMAC-SHA256的简写,HMAC(Hash-based Message Authentication Code)是密钥相关的哈希运算消息认证码,是在SHA-256的基础上加入了密钥,步骤:

① HMAC(明文M,密钥K) => 密文M1 ② SHA256(M1) => 最终的密文M2

就算有一天SHA256被攻破了,只要密钥K没有泄漏,该算法也是绝对安全的。

该算法主要是用于JWT(JSON Web Token)认证,在用户登录时,服务器会签发一个token传给客户端,客户端每次请求时,通常会把token放在请求头的Authorization字段中。

Authorization格式:

Authorization: <type> <credentials>

下面是小贷项目真实的请求头:

Accept  application/json, text/plain, */*
Content-Type  application/x-www-form-urlencoded
authorization  Basic dV85Njc5MzM4MzY4NjIzODA0MzM6ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKSVV6STFOaUo5LmV5SnJaWGxPWVcxbElqb2lNelJpWW1SbU5EaGlaamRtTkRreU1XRTNZekU0WTJKa1lURTBOelkyWlRBaUxDSmxlSEFpT2pFMk56QTBNREl3TmpZc0luVnpaWEpKWkNJNk9UWTNPVE16T0RNMk9EWXlNemd3TkRNekxDSjBiMnRsYmlJNkluWXpYek01WXpVeVpHUTFZelUxWWpSak4yUmhZV0ZpWVdNMU16a3paR0psTWpoaUluMC5sbVlzdHBCYVhqTzk4VzRhTUNDYUt0ZVZMZHl6aU9YS2tqa2djUWpUMHFr
x-auth-type  basic

Basic表示凭证部分是经过了base64编码的,解码下:

u_967933836862380433:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJrZXlOYW1lIjoiMzRiYmRmNDhiZjdmNDkyMWE3YzE4Y2JkYTE0NzY2ZTAiLCJleHAiOjE2NzA0MDIwNjYsInVzZXJJZCI6OTY3OTMzODM2ODYyMzgwNDMzLCJ0b2tlbiI6InYzXzM5YzUyZGQ1YzU1YjRjN2RhYWFiYWM1MzkzZGJlMjhiIn0.lmYstpBaXjO98W4aMCCaKteVLdyziOXKkjkgcQjT0qk

冒号前的内容是ymmUid,冒号后则为JWT的内容,JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature),这3部分都是用base64编码过的,用 . 进行分割。

将Header解码:

{"typ":"JWT","alg":"HS256"}

将Payload解码:

{"keyName":"34bbdf48bf7f4921a7c18cbda14766e0","exp":1670402066,"userId":967933836862380433,"token":"v3_39c52dd5c55b4c7daaabac5393dbe28b"}

将Signature解码会提示“不能解码转换为合法的UTF-8字符串”,这是因为解码后的二进制串不在UTF-8的字符集中。

Signature = HMAC-SHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)

三、双向加密算法

1、对称加密算法AES

AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。

原理为将明文拆分为128bit的明文块(明文长度不为128bit的倍数时,填充至128bit倍数,填充方式有多种),经过字节间减法运算(SubBytes)、行移位(ShiftRows)、列混合(MixColumns)、轮密钥加法运算(AddRoundKey)等操作生成同样长度的密文块,然后把密文块拼接起来。

7dd13e200f51413786880d0339af7ae2.jpeg

对称加密的优点:快,适合对大量数据进行加解密。

对称加密的缺点:密钥在一端生成后如果需要通过网络传给另一端,则在网络上传输的过程中有被盗的风险。

2、非对称加密算法RSA

非对称加密有一把公钥一把私钥,公钥加密的数据只能用私钥解密,私钥加密的数据只能用公钥解密。

RSA是非对称加密中的佼佼者,利用的是超大整数的因数分解极其困难的特性。

非对称加密的优点:更安全。

非对称加密的缺点:慢,相比AES,要慢1000倍左右。

四、各种加密的集大成者-HTTPS

HTTPS结合了单向加密、对称加密和非对称加密,保证数据传输的安全,请看图。

image.png