关于加密解密的小小总结

一、前言

这篇文章不讲具体的加密算法,主要总结加密解密在项目中的具体应用,其中加密算法介绍内容来自

流程内容自于自己平常工作学习的总结,在这里小小记录一下。

二、可逆加密与不可逆加密

加密算法我们整体可以分为:可逆加密和不可逆加密,可逆加密又可以分为:对称加密和非对称加密

1、不可逆加密

常见的不可逆加密算法有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加密串来进行比较,如果过你的密码复杂度比较低,还是有很大机率验证出来的。

这里我们介绍一下SHA256,简单来说就是一个哈希函数。哈希函数,又称散列算法,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(或哈希值)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。

对于任意长度的消息,SHA256都会产生一个256bit长的哈希值,称作消息摘要。这个摘要相当于是个长度为32个字节的数组,通常用一个长度为64的十六进制字符串来表示。

2、对称加密算法

对称加密算法是应用比较早的算法,在数据加密和解密的时用的都是同一个密钥,这就造成了密钥管理困难的问题。常见的对称加密算法有DES、3DES、AES128、AES192、AES256 (默认安装的 JDK 尚不支持 AES256,需要安装对应的 jce 补丁进行升级 jce1.7,jce1.8)。其中AES后面的数字代表的是密钥长度。对称加密算法的安全性相对较低,比较适用的场景就是内网环境中的加解密。

3、非对称加密算法

非对称加密算法有两个密钥,这两个密钥完全不同但又完全匹配。只有使用匹配的一对公钥和私钥,才能完成对明文的加密和解密过程。常见的非对称加密有RSA、SM2等。

4、加密盐

加密盐也是比较常听到的一个概念,盐就是一个随机字符串用来和我们的加密串拼接后进行加密。加盐主要是为了提供加密字符串的安全性。假如有一个加盐后的加密串,黑客通过一定手段这个加密串,他拿到的明文,并不是我们加密前的字符串,而是加密前的字符串和盐组合的字符串,这样相对来说又增加了字符串的安全性。

三、应用场景

1、注册登陆加密流程(SM2+SHA256)

注册:
1、前端传入账号密码
2、对密码使用SHA256哈希盐值加密(不可逆),最终加密后的数据存入数据库
可能格式:加密算法$迭代次数$盐值$最终密文
登陆:
1、前端获取SM2公钥,对密码明文进行加密
2、后端通过SM2私钥解密密码密文,之后从数据库获得用户的密码(盐值加密后的数据),在密文中获得加密算法、盐值等数据,对SM2解密得到的密码明文进行盐值加密,比较两个数据是否一致

2、API调用数据传输加密(RSA+AES、SM2+AES)

RSA+AES、SM2+AES用于传输加密,为请求/返回信息做加密处理,保障数据传输的安全性。

RSA和SM2为非对称加密算法,SM2算法是一种更先进安全的算法,在安全性能、速度性能等方面都优于RSA算法,在我国商用密码体系中被用来替换RSA算法。

AES是对称加密算法,使用非对称加密算法和对称加密算法混合模式,在支持对大量数据加解密的同时,保证了加解密速度,安全性更高,主要应用于一些用户信息、敏感信息加密的安全性要求较高的场景。

RSA/SM2:在API调用过程中,为每位用户创建相互独立的RSA、SM2密钥对,“公钥加密、私钥解密,私钥加密、公钥解密”。RSA/SM2公钥对用户可见,私钥平台进行管理。 RSA/SM2公钥用途:对AES密钥进行加密处理。 RSA/SM2私钥用途:对RSA/SM2公钥加密后的AES密钥进行解密

AES:需调用者通过程序手动生成AES密钥。 AES密钥用途:对请求/返回信息进行加密/解密处理

下面是传输加密的具体流程。

客户端:

  1. 主动生成 AES主密钥
  2. 使用 AES主密钥 加密 请求信息
  3. 使用 RSA公钥(由私钥平台管理/提供) 加密 AES主密钥
  4. 发送 “RSA公钥加密后的AES主密钥” 和 由AES主密钥加密后的请求信息

服务端:

  1. 获取API的RSA公钥私钥信息(与上面的是同一对),通过 RSA私钥 解密得到 AES主密钥
  2. 通过 AES主密钥 解密请求信息
  3. 通过 AES主密钥 加密返回数据,返回结果

3、AK/SK签名认证

AK/SK(AppKey+AppSecret/AccessKey+SecretAccessKey)签名是调用API的用户认证方式之一,常见的用户认证方式还有API-TOKEN、USER-TOKEN等,下面是具体流程。

客户端:

  1. 使用AppSecret对请求内容计算得到签名(Signature)
  2. 发送请求,请求额外包含AppKey和Signature

服务端:

  1. 根据发送的AppKey查找数据库得到对应的AppSecret
  2. 使用同样的算法将请求内容和AppSecret一起计算签名(Signature)
  3. 对比用户发送的签名和服务端计算的签名,两者相同则认证通过,否则失败。