XDSec—06加密解密与编码
文章目录
一、数据摘要算法(哈希算法)
首先要明确,哈希算法不是加密算法,它只是验证数据完整性的一种算法;
可将算法看作一个黑匣子,放入任意大小的文件或数据进去,出来固定长度的数据摘要;
1.1、MD5
- 简介:Message-Digest Algorithm,数据摘要算法,是一种广泛应用的密码散列函数,但已经被验证不安全
- 摘要长度:128bit字符,常见格式为32位的16进制数
- 作用:目前大多数网站的后台数据库的用户密码,仍采用的是MD5算法,因此必须明确其原理
- 破解方法:碰撞攻击结合生日攻击,但也需要强大的算力,一般会用较大容量的哈希库进行碰撞
- 在线工具:md5在线解密破解,md5解密加密 (cmd5.com)
1.2、SHA
- 名称:Secure Hash Algorithm,安全散列算法,是一个密码散列函数家族,主要有SHA1,SHA256,SHA512
- SHA1:160bit,常见为40位16进制数
- SHA256等:名称中数字即为长度
1.3、其他补充
- 加盐:可以理解为原本的哈希算法为:
Hash(P)
,是直接对原文进行哈希;加盐:Hash(Hash(P) + salt)
,是将salt和原文的哈希再哈希一次,这样可以防止对原文的暴力破解 - 带密码,带偏移,带位数,带模式,带干扰
- 自定义算法:通用性不高,但是破解难度大
二、时间戳
- 时间戳一般为unix时间戳,是以格林尼治时间1970年1月1日为开始的,读秒制的计算机时间
- 一般常用在数据库中存储与用户有关的一些时间,如上次登录时间等
- 了解时间戳转换为格式化时间即可
- 时间戳计算工具:时间戳(Unix timestamp)转换工具 - 在线工具 (tool.lu)
三、URL编码
3.1、为什么要进行URL编码?
我们在表单中填写数据,每个控件都有一个
name
属性,输入方式分为手动输入和选择输入两种,最后点击submit
提交按钮,表单域中所有的数据都会经浏览器处理发送到服务器上;服务器读取URL值进行处理。以上为表单提交的处理过程。
-
一个完整的URL格式为:<协议名称>://<主机>:<端口>/<资源路径><查询><信息片段>组成
-
其中查询参数(即表单控件的name)和查询字符串(即你输入的内容)由
key=value
这种键值对形式组成,如下https://www.xxx.com/book/card?cnFenlei=O4-33456&ssid=14696314567&d=55227
|–协议-----|--------主机-------|-----路径------|–查询参数1—|信息片段1|-参数2|–信息片段2—|···········
-
多个参数之间使用
&
符号隔开,如上的ssid和d参数;参值使用=
分割开 -
并且,url在传输时只能使用
ACSII码
表示;服务器收到这串字符流的时候,挨个读取,当读到=
(ASCII码为3D)时就知道刚刚读取的到是一个key,之后直到读取到&
(ASCII码为26)或没有内容之前,所有的字符都是key对应的value -
因此如果value中出现了
&
等特殊字符,服务器的对url的读取就会提前终止,从而导致读到的url不完整;并且ASCII码只有128位,无法存储汉字等字符,因此对这些非ASCII码字符也要进行编码;URL编码的原则就是使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去表示那些不安全的字符。
3.2、哪些字符需要编码
url只允许出现大小写英文(a-z,A-Z)、数字(0-9)、4个特殊字符(- _ . ~)以及所有保留字符;
即除了这些字符之外的都需要进行编码,如汉字;
并且,也要对查询字符串,即value中的不安全字符(会引起歧义的字符)进行编码;
- 输入内容和编码的区别,如下图,value中出现了不安全的字符(&、%、#),浏览器会对其进行编码,将其转为十六进制的ASCII码格式,并且用
%
号分隔
-
复制这串URL到记事本,可见汉字(非ASCII字符)也被进行了编码
-
对于汉字在URL中的编码通常采用UTF-8格式,下图可见UTF-8格式的中文编码与中文对应的URL编码的联系:即将UTF-8的二进制字符串(计算机中存储的都是二进制)转为十六进制,然后两两结合并且用%分隔开,即
百分号编码
-
python对”你好“的UTF-8输出中,b代表引号内为bytes类型,\x代表是十六进制
-
-
URL中的保留字符有这些
␣ ! # $ % & ' ( ) * + , / : ; = ? @ [ ]
,常用的保留字符的编码如下:空格
:可以用+
表示或者使用编码%20
+
:用来表示空格,编码为%2B
/
:分隔目录和子目录,编码为%2F
?
:分隔实际的URL和查询参数,编码为%3F
#
:表示锚点链接的书签,与服务器无关,由用户端生成,编码为%23
&
:各个查询参数的分隔符,编码为%26
=
:查询参数与查询值的分隔符,编码为%3D
URL编码的可以防止注入攻击,后面学习会进行补充;
在研究汉字在URL编码时,我将汉字通过网上的UTF-8转码工具转成了
/uXXXX
这类字符,和实际的二进制长度也对比不上,也就无法和百分号编码对应;最后查了好久,发现python有这个转码函数,终于将汉字转成了标准的二进制形式,这才和百分号编码对应上了,可为山重水复疑无路,柳暗花明又一村。
四、Base64编码
4.1、base64概述
- 名称:64即用于编码的字符共有
64
种,其中包括大小写英文、0-9数字、+
、/
- 作用:是一种将二进制数据到字符编码的方案,将二进制数据使用ASCII码中的64个字符组成的字符串表示,以便完成二进制数据在HTTP这种只支持文本的协议中传输,例如html页面中的图片
4.2、编码规则
-
编码字符:用64位可打印字符来表示表示二进制数据,还有用来补缺的缀词
=
(注意:64位字符用来表示全部的二进制数据,=不参与二进制数据的表示,只是用来补缺,因此=不算在64位编码字符内) -
编码规则:计算机中的二进制数据分为8Bit一个字节来存储,而base64则是每6Bit进行一次编码,因此在一长串base64编码中每4个字符表示3字节二进制数据(3 * 8 == 4 * 6)
-
缀词
=
的作用:由编码规则可得,当要编码的二进制数据的字节数不是3的倍数的时候,通过每6Bit进行base64编码,势必会剩下几个Bit的二进制数据,例如:4字节的二进制数据共32Bit,进行base64编码,每6Bit编为一个base64的字符,最后剩下2Bit的二进制数据位编码,就需要补4个0,最后这个4字节二进制数据的base64编码末尾就会由有两个=;末尾一个=,表示补了两个0;两个=,表示补了4四个0. -
base64编码表:
- 0-25,即000000-011001,表示A-Z
- 26-51,即011010-110011,表示a - z
- 52-61,即110100 111101,表示0 - 9
- 62,即111110,表示符号 +
- 63,即111111,表示符号 /
-
编码细节:
-
末尾无缀词
- 例如要进行编码的数据
aaa
,它的二进制表示为01100001 01100001 01100001
,共24Bit数据,现进行Base64编码; - 先将24Bit数据分为每6Bit一组,如:
011000 010110 000101 100001
,然后根据ASCII码进行编码,如011000
对应Y
,其它也依次根据base64编码表编码,最终结果为YWFh
- 例如要进行编码的数据
-
结尾一个缀词
-
例如要进行编码的数据为
aa
,它的二进制表示为01100001 01100001
,同上,分为成6Bit一组,即01000 010110 0001
,即为需补两个0,则最终结果为YWE=
-
结尾两个缀词
- 例如要编码的数据为
a
,二进制表示为01100001
,进行6Bit分组后为010000 01
,结尾需要补4个0,则最终结果为YQ==
- 例如要编码的数据为
4.3、辨别技巧
- 由大小写字母、数字、和两个符号随机组成编码序列
- 编码长度为4的倍数,包括缀词=
- 编码长度随着原数据的大小变化,即原数据越大,编码也会越长,详细长度约比原数据大33.3%
- 注意结尾的
=
缀词
-
五、加密解密
5.1、对称加密
- 解释:对称加密即对数据加密和解密使用同一套密钥,也称单密钥加密
- 优缺点:算法公开、计算量小、加密速度快效率高;但是如果密钥泄露,就会造成信息安全问题,另外,每次使用对称加密算法时,都需要生成一个新的密钥,使得收发方钥匙数量变大,密钥管理成为问题
- 常用算法
- DES(Data Encryption Standard):数据加密标准
- 3DES(Triple DES):基于DES,比前者加密更强
- AES(Advanced Encryption Standard):高级加密标准
- 其他另行补充
5.2、非对称加密
- 解释:加密解密使用不同的密钥进行,分为公钥和私钥,通信双方有各自的公钥和私钥,PKI即基于非对称加密技术
- 优缺点:加密性好,但计算量大
- 常用算法
- RSA:以三个创造者的人姓氏开头字母命名
- DSA:数字签名算法
- ECDSA:椭圆曲线签名算法
- 其他另行补充
5.3、AES加密算法
-
加密过程:加密时需要输入密码和偏移量,输出格式一般选择base64
-
解密过程:解密和加密互逆,输入密码和偏移量以及密文,即可解密
-
在线加解密工具:http://tool.chacuo.net/cryptaes
由于加密使用的算法涉及太多,之后学习密码学之后再统一做补充
对于初学只需要掌握判断加密的方式,以及深入考虑如何逆向解密即可
php解密题目对应视频时间:1h07min45s