密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。
密码学的起源可追溯到2000年前。而当今的密码学是以数学为基础的。
密码学溯源
密码学的历史大致可以追溯到两千年前,相传古罗马名将凯撒大帝为了防止敌方截获情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应表。这样,如果不知道密码本,即使截获一段信息也看不懂。
从凯撒大帝时代到上世纪70年代这段很长的时间里,密码学的发展非常的缓慢,因为设计者基本上靠经验。没有运用数学原理。
重要节点:
RSA 加密算法
RSA
上世纪 70 年代产生的一种加密算法。其加密方式比较特殊,需要两个密钥:公开密钥简称公钥( publickey )和私有密钥简称私钥( privatekey )。公钥加密,私钥解密;私钥加密,公钥解密。这个加密算法就是伟大的 RSA .
这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长 RSA 密钥是 768 个二进制位。也就是说,长度超过 768 位的密钥,还无法破解(至少没人公开宣布)。因此可以认为, 1024 位的 RSA 密钥基本安全, 2048 位的密钥极其安全。
( 当然 RSA 的缺陷也很容易想到 : 效率相对较低 , 字节长度限制等 . 因此实际应用中我们往往会结合对称性加密一起使用 , 关键内容使用 RSA )
RSA 数学原理
本小节内容了解即可
1. 离散对数问题
问: 三的多少次方模 17 等于 12 ?
2. 欧拉函数 φ
欧拉函数 :
给定任意正整数 n , 在小于等于 n 的正整数中 , 能与 n 构成互质关系的正整数个数. 复制代码
计算这个值的方式叫做欧拉函数,使用: φ(n) 表示
φ(8) 有 1,3,5,7 即是 φ(8) = 4
φ(7) 有 1,2,3,4,5,6 即是 φ(8) = 6
那么 φ(56) 是多少 ?
先别急着一个个去数 , 我们来看下 欧拉函数的特点 .
因此 :
如果 N 是两个质数 P1 和 P2 的乘积则 φ(N) = φ(P1) * φ(P2) = (P1-1)*(P2-1)
那么显然 φ(56) = φ(7) * φ(8) = 4 * 6 = 24
而 φ(63) = φ(7) * φ(9) = (7-1) * (9-1) = 48
3. 欧拉定理
如果两个正整数 m 和 n 互质,那么 m 的 φ(n) 次方减去 1 ,可以被 n 整除。
小提示: 关于定理 , 不需要我们去证明它 , 只用记住就好.
3.1 费马小定理
费马小定理 就是在欧拉定理的基础上 , 而当 n 为质数时 (φ(n)结果就是n-1 .)
那么 :
如果两个正整数 m 和 n 互质 , 且 n 是质数 ,那么 m 的 n-1 次方减去 1 ,可以被 n 整除。
4. 公式转换
如果两个正整数 e 和 x 互质,那么一定可以找到整数 d ,使得 ed-1 被 x 整除。那么 d 就是 e 对于 x 的 模反元素 .
那么换算成公式 就是:
注意比较第五步和第三步中红框部分. 也就是说当 x 等于 Φ(n) 时 :
( 其中 d 是 e 相对于 φ(n) 的模反元素 , 因为 x = Φ(n) 嘛)
注意 : 公式推导第一步时 我们欧拉定理的前提是 m 和 n 互质 , 但是由于模反元素的关系 , 其实只要满足 m < n 上述结果依然成立.
重头戏来了 , 用实际场景来看下迪菲赫尔曼密钥交换过程
原理:
结合我们刚刚第五步之后得出的
因此:
( 其中 d 是 e 相对于 φ(n) 的模反元素 , 因为 x = Φ(n) , 那么同样 , e 和 φ(n) 是互质关系 )
大家可以自己去实验一下 . 例如: m = 3 , n = 15 , φ(n) = 8 , e = 3 , d = 11 .
到了这里 , 我们就得到了RSA算法的原理 . 那么我们对应起来介绍一下
RSA算法的原理
( 除了公钥用到了 n 和 e 其余的 4 个数字是不公开的。 )
HASH 算法
HASH 介绍
Hash ,一般翻译做 “ 散列 ”,也有直接音译为“ 哈希 ”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数
HASH 特点
HASH 主要用途
HASH 安全性探讨
由于相同数据 hash 得到的结果是一样的 . 那么市面上大量万亿级 hash 结果记录数据库的存在 , 这个不可逆的算法 也另类的变成了可解密的存在.
因此 , 我们使用时经常有以下几种操作 :
HMAC 加密方案
HMAC 使用一个密钥加密 , 并且做了两次散列 . 在实际开发中 , 密钥往往来自于服务器下发给客户端 并且可能是根据账户绑定的 . 并需要结合实际业务需求来设定注册与登录逻辑 (新设备授权等方式来决定服务器是否可以下发密钥给客户端)
看到这可能大家也跟我一样 都有个疑问 .
疑问
我不管你是如何 嵌套 加盐 HMAC 等什么方式去对密码做处理. 既然你登录是一个账号一个加密后的密码. 我抓包工具抓到就可以直接调用接口实现登录.
是啊 , 那不就 GG 了?
这就牵扯到接口安全的问题 , 其处理方法有很多种, 例如所有请求用 HTTPS , 并且使用对称性加密和非对称性加密结合等等方式对数据进行加密.
当然再安全的加密算法也有被破解的风险. 因此以下这种方式 , 大家可以理解参考一下 , 它能比较有效的解决抓包问题 :
解答
思考:
为什么以上方式可以有效防护到接口被抓包的情况 ?
HASH 题外话
可能有小伙伴碰到过上传云盘的文件被和谐的情况 , 并且改了名字或者后缀名重新传还是不行. 其实这就是 HASH 的一种运用场景 . 要 理解 HASH 是对二进制数据进行散列 . 那么改名字和后缀名其文件二进制是不会变化的 .
但是压缩是可以的 .
也就是说压缩是会改变内存大小 , 其内部二进制散列之后的结果也会变化 . 同样 base64也是会改变二进制数据的.