web api接口加密常见方式

web api接口加密常见方式

Posted by Hzy on April 8, 2020

今天先了解常见的api加密方式。

1.什么是aes加密?

1.1:简介:

aes是一种常见的对称加密算法。对称加密是可逆的,双方通过秘钥进行加解密,因此秘钥的不被泄漏很关键。

1.2:秘钥长度:

aes加密有三种秘钥长度,128,192,256,aes256安全性最高,aes128性能最高。

1.3:加密原理过程:
  • 1.首先把明文拆成一个一个独立的明文块,长度为128bit。
  • 2.对长度不足128bit的明文块进行填充。填充的方式有好几种:
    • 1.不填充,但明文需要是16字节的倍数
    • 2.对于少于16个字节的明文块,补足相应的数量的字节。
    • 3.接下来就是对明文进行加密的过程,aes提供了5种工作模式。

      这里就简单的介绍一下有哪些模式:

      • 3.1.1:ECB模式(默认)电码本模式
      • 3.1.2:CBC模式 密码分组链接模式
      • 3.1.3:CTR模式 计数器模式
      • 3.1.4:CFB模式 密码反馈模式
      • 3.1.5:OFB模式 输出反馈模式

2.什么是RSA加密?

2.1 简介

RSA加密是一种非对称加密,由三位数学家 Rivest、Shamir 和 Adleman的名字开头命名,RSA算法基于一个很简单的事实,将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却很苦难。因此我们可以将乘积公开作为加密秘钥的一部分。

2.2 RSA秘钥对的生成过程
  • 1.任意选择两个大的素数,p和q,计算出n=p*q,n的位数越长,越难破解。
  • 2.计算n的欧拉数,其实就是计算在小于n的数中,与其互相为质数的个数φ(n),记为m。
  • 3.接下来我们需要随机选择加密秘钥指数e,e需要满足1<e<m,没有就是在m和1的之间,同时e需要与m互质。
  • 4.接下来就是求解对应的解密函数d,通过扩展欧几里得算法可以获得一个唯一整数解d。具体的算法有时间在去补补,现在就当做是一个黑盒子把。
  • 5.销毁p和q,生成的(n,d)就是私钥,(n,e)就是公钥,妥善保管好私钥,可以将公钥发送给需要的人。
2.3.模拟加解密生成密文

截取自文章一文搞懂 RSA 算法


比如甲向乙发送汉字“中”,就要使用乙的公钥加密汉字 “中”, 以 utf-8 方式编码为 [e4 b8 ad],转为 10 进制为 [228,184,173]。要想使用公钥(n,e) = (4757 , 101)加密,要求被加密的数字必须小于 n,被加密的数字必须是整数,字符串可以取 ascii 值或unicode值,因此将“中”字折为三个字节 [228,184,173],分别对三个字节加密。 假设 a 为明文,b 为密文,则按下列公式计算出 b

a^e % n = b 计算 [228,184,173]的密文:

  • 228^101 % 4757 = 4296
  • 184^101 % 4757 = 2458
  • 173^101 % 4757 = 3263

即 [228,184,173]加密后得到密文 [4296,2458,3263] ,如果没有私钥 d ,神仙也无法从 [4296,2458,3263]中恢复 [228,184,173]。

解密生成明文。

乙收到密文 [4296,2458,3263],并用自己的私钥(n,d) = (4757 ,1601) 解密。解密公式如下: 假设 a 为明文,b 为密文,则按下列公式计算出 a

a^d % n = b

密文 [4296,2458,3263]的明文如下:

  • 4296^1601% 4757 = 228
  • 2458^1601% 4757 = 184
  • 3263^1601% 4757 = 173

即密文 [4296,2458,3263] 解密后得到 [228,184,173] 将[228,184,173] 再按 utf-8 解码为汉字 “中”,至此解密完毕。

2.4. RSA加密需要了解解决的一些问题。
  1. 将模幂运算转化为模乘运算,因为模幂运算运算对计算机效率太低了。我们可以通过(a*b)%n=(a%n * b%n)%n特性来解决。
  2. 转化为模乘运算后还可以进一步提高费时的取模运算,这里可以尝试了解下蒙哥马利算法
  3. RSA算法,需要两个很大的素数,那如何才能获得两个很大的素数呢?通常是随机生成一个大数作为疑似素数,再来校验这个素数是否为的素数,这里可以了解下米勒-拉宾算法。

3. md5摘要算法

3.1 简介

MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。

3.2 特点
  1. 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
  2. 容易计算:从原数据计算出MD5值很容易。
  3. 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
  4. 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
3.3 简单说下算法原理
  1. 对长度进行填充,使其满足对512的余数结果等于448,最终长度会扩展成N*512+448。填充的方式是一个1和n个0。
  2. 装入标准的幻数中去,每一组512位。
    • A = 0x67452301UL
    • B = 0xEFCDAB89UL
    • C = 0x98BADCFEUL
    • D = 0x10325476UL

3.将每一组再划分为16个32位的子分组,在对子分组使用线性函数进行四轮循环运算,最终可以获得4个32位分组的128散列值。

3.4 常用的场景
  1. 对数据进行一致性的验证。
  2. 进行数字签名,防止篡改。
  3. 系统密码登录认证,可以在不知道明文的情况,判断用户登录的合法性。

4. 常见的api加密方式

4.1 md5效验值形式

设置一个sign参数,这个参数是一个MD5值,其原文是其他请求参数和盐的组合,同时可以在加入一个时间戳参数。

1
2
3
4
5
int id = 10000; // 假设请求的参数为 id ,假设为 10000
int tm = System.currentTimeMillis() / 1000;
String sign = md5(id + tm + "salt"); // md5 是实现取 md5 值(32 字节的 Hex 文本)的函数,salt 是加密盐,建议修改长一点。
String api = "https://www.xxx.com/api?id=" + id + "&tm=" + tm + "&sign=" + sign;
// 请求 API
4.2 加密字符串的形式

用对称或者非对称加密算法对参数进行加密,加密后的参数作为验证参数。服务器接收到请求后,判断验证参数的合法性。

4.3 非对称加密+对称加密,参考Oauth2
  1. 服务器端生成公钥和私钥,私钥自己保留,公钥发送给需要的客户端。
  2. 客户端生成aes 秘钥,然后用公钥加密此秘钥。
  3. 服务端接受到后,用私钥进行解密,获得aes key 。
  4. 至此,非对称加密就结束了,至此客户端,服务器都获得了aeskey,接下来就换成用aes key对称加密数据。
  5. 客户端 用aes 加密数据,发送到服务端。
  6. 服务端通过aes解密数据,获得参数,进行判断验证。

重复6,7形式。

参考文章: