附:完整笔记目录~
ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正!
4.2 编码加密
-
引子:上一篇主要对常见数据传输类型做了总结,而本篇则对数据常见的编码&加密方式进行总结。
-
概述:编码&加密除了对后端敏感数据的保护,其在前端数据传输时往往也会被应用到。
根据上一篇的学习,我们可以注意到,除二进制格式外,其余大部分传输格式中数据都是明文传输,这导致其向服务端传递的数据可以被任何人随意修改,也给了攻击者攻击的可能。
为了避免这种情况的发生,开发者往往会先对需要传递的数据进行编码&加密再传输。这样当攻击者想要修改传递的数据时,必须也依据开发者所规定的编码&加密方式先对payload进行编码加密,提高了门槛,增加了攻击难度。 -
编码&Base64
-
概念:Base64编码会将每三个字节的二进制数据转换为4个字符的ASCII文本。
-
例子
原数据:
sjjjjjjer 666
编码后数据:
c2pqampqamVyIDY2Ng==
-
特征
- 明文越长编码后文本越长
- 大小写区分,数字&字母组合
- 编码后,一般不会存在 / 和 + ,且文本末可能会存在两个=
-
-
编码&URL
-
概念:URL编码用于将URL中非ASCII字符或特殊字符转换为以 % 开头的编码,因此也称百分号编码。
-
例子
原数据:
example.com/sjjjjjjer 666.html
编码后数据:
example.com%2Fsjjjjjjer%20666.html
-
特征
URL格式再带 % ,基本均为URL编码。
-
-
加密&哈希算法
-
概念:哈希算法通过单向函数将数据转换为固定长度的字符串。常见的哈希算法如MD5、SHA等,以32位MD5为例。
-
例子
原数据1:
sjjjjjjer 666
加密后数据1:
49d8622c7fd08ed03638ee7228bf697a
原数据2:
sjjjjjjer
加密后数据2:
3c81489c7d3a09c6ad3eb60d9052d6c2
-
特征
- 固定位数,MD5加密为16或32位。
- 16进制字符串,即由 0-9 a-f 组成。
- 单向函数加密造成MD5算法不可逆,因此仅能通过密文碰撞破解。
-
-
加密&对称加密
-
概念:最传统加密方式,加解密共用同一密钥。常见的对称加密算法,如AES、DES、3DES等,由于AES更为可靠(密钥最低位数为128位),因此也是如今使用最多的对称加密方式。本篇以AES为例。
-
例子
使用AES加密时,不仅仅需要双方规定密钥,同样也需规定偏移量、加密模式、填充。由于加密模式&填充仅有固定的几种类型,因此在对称加密中除密钥外最重要的也就是偏移量了。
原数据:
sjjjjjjer 666
密钥:
1234567890abcdef
偏移量:
1234567890abcdef
加密模式&填充:
ECB&zeropadding
加密后数据(以Base64输出):
rG0zMqyClmJE9Ldmj6BWQQ==
-
特征
基本同Base64,但密文一般会出现 / 和 + 。
-
-
加密&非对称加密
-
概念:与对称加密不同,非对称加密加解密采用一对密钥,一般情况下使用公钥进行加密,私钥解密(公钥公开,私钥保密)。但这并不意味着仅能使用公钥加密,在非对称加密中私钥也可以用来加密,相应的应使用公钥解密,这也是我们常说的私钥签名,公钥验签。
常见的非对称加密算法,RSA(最著名)、ECC(基于椭圆曲线...)。本篇以RSA为例 -
例子(公私钥为平台示例)
原数据:
sjjjjjjer 666
公钥:
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDHc+PP8LuTlBL1zCX+lh9kcur gHHIXFnV/tDK789DaJuhwZvQ1lu5Zdcn+ULbNUKkB6b5tCP0sZxlpoCVKMyKHtde h/YGXwBD8sMc+XcRs0eh3/tyr4EoBu3bomzHWDGmHjH/F5GotFTrGcB6xQwAROy4 mT5SketlQ3c7tucI+QIDAQAB -----END PUBLIC KEY-----
加密后数据(以base64输出):
XJvQMLNI8355fRZ/1SE33DjtwmX4zWFezYSesV/lD6JLv6amBoaodg5lyZd+vOZos603l19j3tjb9NnnguXYd3MCuyw33Y4FtjuVeRlnuBc/ddWvHlR19LJcuZbSMy/id1twJa8CFKDOskeN87SmwzHpLD289pMtlEmop/F7Xn8=
私钥:(详见平台,实在太长了就不粘了)
解密后数据:
sjjjjjjer 666
-
特征
基本同AES,但密文长度较长。
补:在线对称&非对称加解密平台,http://tool.chacuo.net/cryptrsapubkey
-
-
加密&自定义
-
概念:开发者自定义加密算法(一般基于非对称/对称加密改良),往往被应用于加密传输数据。
-
例子(以某通登录框为例)
显然,这种密文格式并不符合我上述所提到的几种,称这种加密方式为自定义加密。那当我们遇到这种加密方式该怎么办呢?
由于所有加密操作均在发包前也就是前端实现,那我们能不能通过调试找到前端开发者自定义的加密算法代码呢,若能成功找到,是不是就可以利用开发者的加密代码加密我们的payload,从而绕过自定义加密进行测试呢。这也是我们所常说的JS逆向。
-
-
总结&再扩展
由上文的介绍,我们对不同的编码&加密方式有了基本的认知,那当遇到了编码加密的情况时该如何解决呢?由于编码&加密往往存在两种应用场景,因此分别对这两种场景进行讨论。数据类型/应用场景 后端敏感数据 前端数据加密传递 编码(Base64) 反编码 payload Base64编码 哈希加密(MD5) 在线平台/脚本碰撞解密 payload MD5加密 对称加密(AES) 找密钥&偏移量,逆向解密 前端找密钥&偏移量加密payload 非对称加密(RSA) 找私钥,同上 前端找公钥加密payload 自定义加密 后端找解密算法??? 前端找加密算法,利用开发者自己的算法加密
(注:上述加密类型也可用该方法,依据实际情况选择)