小迪安全系列笔记---06加密解密与编码(URL编码和base64详解)

XDSec—06加密解密与编码

一、数据摘要算法(哈希算法)

首先要明确,哈希算法不是加密算法,它只是验证数据完整性的一种算法;

可将算法看作一个黑匣子,放入任意大小的文件或数据进去,出来固定长度的数据摘要;

1.1、MD5

  1. 简介:Message-Digest Algorithm,数据摘要算法,是一种广泛应用的密码散列函数,但已经被验证不安全
  2. 摘要长度:128bit字符,常见格式为32位的16进制数
  3. 作用:目前大多数网站的后台数据库的用户密码,仍采用的是MD5算法,因此必须明确其原理
  4. 破解方法:碰撞攻击结合生日攻击,但也需要强大的算力,一般会用较大容量的哈希库进行碰撞
  5. 在线工具md5在线解密破解,md5解密加密 (cmd5.com)

1.2、SHA

  1. 名称:Secure Hash Algorithm,安全散列算法,是一个密码散列函数家族,主要有SHA1,SHA256,SHA512
  2. SHA1:160bit,常见为40位16进制数
  3. SHA256等:名称中数字即为长度

1.3、其他补充

  1. 加盐:可以理解为原本的哈希算法为:Hash(P),是直接对原文进行哈希;加盐:Hash(Hash(P) + salt),是将salt和原文的哈希再哈希一次,这样可以防止对原文的暴力破解
  2. 带密码,带偏移,带位数,带模式,带干扰
  3. 自定义算法:通用性不高,但是破解难度大

二、时间戳

  1. 时间戳一般为unix时间戳,是以格林尼治时间1970年1月1日为开始的,读秒制的计算机时间
  2. 一般常用在数据库中存储与用户有关的一些时间,如上次登录时间等
  3. 了解时间戳转换为格式化时间即可
  4. 时间戳计算工具:时间戳(Unix timestamp)转换工具 - 在线工具 (tool.lu)

三、URL编码

3.1、为什么要进行URL编码?

我们在表单中填写数据,每个控件都有一个name属性,输入方式分为手动输入和选择输入两种,最后点击submit提交按钮,表单域中所有的数据都会经浏览器处理发送到服务器上;服务器读取URL值进行处理。

以上为表单提交的处理过程。

  1. 一个完整的URL格式为:<协议名称>://<主机>:<端口>/<资源路径><查询><信息片段>组成

  2. 其中查询参数(即表单控件的name)和查询字符串(即你输入的内容)由key=value这种键值对形式组成,如下

    https://www.xxx.com/book/card?cnFenlei=O4-33456&ssid=14696314567&d=55227

    |–协议-----|--------主机-------|-----路径------|–查询参数1—|信息片段1|-参数2|–信息片段2—|···········

  3. 多个参数之间使用&符号隔开,如上的ssid和d参数;参值使用=分割开

  4. 并且,url在传输时只能使用ACSII码表示;服务器收到这串字符流的时候,挨个读取,当读到=(ASCII码为3D)时就知道刚刚读取的到是一个key,之后直到读取到&(ASCII码为26)或没有内容之前,所有的字符都是key对应的value

  5. 因此如果value中出现了&等特殊字符,服务器的对url的读取就会提前终止,从而导致读到的url不完整;并且ASCII码只有128位,无法存储汉字等字符,因此对这些非ASCII码字符也要进行编码;URL编码的原则就是使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去表示那些不安全的字符。

3.2、哪些字符需要编码

url只允许出现大小写英文(a-z,A-Z)、数字(0-9)、4个特殊字符(- _ . ~)以及所有保留字符;

即除了这些字符之外的都需要进行编码,如汉字;

并且,也要对查询字符串,即value中的不安全字符(会引起歧义的字符)进行编码;

  1. 输入内容和编码的区别,如下图,value中出现了不安全的字符(&、%、#),浏览器会对其进行编码,将其转为十六进制的ASCII码格式,并且用%号分隔

在这里插入图片描述

  1. 复制这串URL到记事本,可见汉字(非ASCII字符)也被进行了编码

    在这里插入图片描述

    • 对于汉字在URL中的编码通常采用UTF-8格式,下图可见UTF-8格式的中文编码与中文对应的URL编码的联系:即将UTF-8的二进制字符串(计算机中存储的都是二进制)转为十六进制,然后两两结合并且用%分隔开,即百分号编码

      在这里插入图片描述

    • python对”你好“的UTF-8输出中,b代表引号内为bytes类型,\x代表是十六进制

  2. URL中的保留字符有这些␣ ! # $ % & ' ( ) * + , / : ; = ? @ [ ],常用的保留字符的编码如下:

    1. 空格:可以用+表示或者使用编码%20
    2. +:用来表示空格,编码为%2B
    3. /:分隔目录和子目录,编码为%2F
    4. ?:分隔实际的URL和查询参数,编码为%3F
    5. #:表示锚点链接的书签,与服务器无关,由用户端生成,编码为%23
    6. &:各个查询参数的分隔符,编码为%26
    7. =:查询参数与查询值的分隔符,编码为%3D

    URL编码的可以防止注入攻击,后面学习会进行补充;

    在研究汉字在URL编码时,我将汉字通过网上的UTF-8转码工具转成了/uXXXX这类字符,和实际的二进制长度也对比不上,也就无法和百分号编码对应;最后查了好久,发现python有这个转码函数,终于将汉字转成了标准的二进制形式,这才和百分号编码对应上了,可为山重水复疑无路,柳暗花明又一村。

四、Base64编码

4.1、base64概述

  1. 名称:64即用于编码的字符共有64种,其中包括大小写英文、0-9数字、+/
  2. 作用:是一种将二进制数据到字符编码的方案,将二进制数据使用ASCII码中的64个字符组成的字符串表示,以便完成二进制数据在HTTP这种只支持文本的协议中传输,例如html页面中的图片

4.2、编码规则

  1. 编码字符:用64位可打印字符来表示表示二进制数据,还有用来补缺的缀词=(注意:64位字符用来表示全部的二进制数据,=不参与二进制数据的表示,只是用来补缺,因此=不算在64位编码字符内)

  2. 编码规则:计算机中的二进制数据分为8Bit一个字节来存储,而base64则是每6Bit进行一次编码,因此在一长串base64编码中每4个字符表示3字节二进制数据(3 * 8 == 4 * 6)

  3. 缀词=的作用:由编码规则可得,当要编码的二进制数据的字节数不是3的倍数的时候,通过每6Bit进行base64编码,势必会剩下几个Bit的二进制数据,例如:4字节的二进制数据共32Bit,进行base64编码,每6Bit编为一个base64的字符,最后剩下2Bit的二进制数据位编码,就需要补4个0,最后这个4字节二进制数据的base64编码末尾就会由有两个=;末尾一个=,表示补了两个0;两个=,表示补了4四个0.

  4. base64编码表

    1. 0-25,即000000-011001,表示A-Z
    2. 26-51,即011010-110011,表示a - z
    3. 52-61,即110100 111101,表示0 - 9
    4. 62,即111110,表示符号 +
    5. 63,即111111,表示符号 /
  5. 编码细节

    1. 末尾无缀词

      1. 例如要进行编码的数据aaa,它的二进制表示为01100001 01100001 01100001,共24Bit数据,现进行Base64编码;
      2. 先将24Bit数据分为每6Bit一组,如:011000 010110 000101 100001,然后根据ASCII码进行编码,如011000对应Y,其它也依次根据base64编码表编码,最终结果为YWFh
    2. 结尾一个缀词

    3. 例如要进行编码的数据为aa,它的二进制表示为01100001 01100001,同上,分为成6Bit一组,即01000 010110 0001,即为需补两个0,则最终结果为YWE=

    4. 结尾两个缀词

      1. 例如要编码的数据为a,二进制表示为01100001,进行6Bit分组后为010000 01,结尾需要补4个0,则最终结果为YQ==

    4.3、辨别技巧

    1. 由大小写字母、数字、和两个符号随机组成编码序列
    2. 编码长度为4的倍数,包括缀词=
    3. 编码长度随着原数据的大小变化,即原数据越大,编码也会越长,详细长度约比原数据大33.3%
    4. 注意结尾的=缀词

五、加密解密

5.1、对称加密

  1. 解释:对称加密即对数据加密和解密使用同一套密钥,也称单密钥加密
  2. 优缺点:算法公开、计算量小、加密速度快效率高;但是如果密钥泄露,就会造成信息安全问题,另外,每次使用对称加密算法时,都需要生成一个新的密钥,使得收发方钥匙数量变大,密钥管理成为问题
  3. 常用算法
    1. DES(Data Encryption Standard):数据加密标准
    2. 3DES(Triple DES):基于DES,比前者加密更强
    3. AES(Advanced Encryption Standard):高级加密标准
  4. 其他另行补充

5.2、非对称加密

  1. 解释:加密解密使用不同的密钥进行,分为公钥和私钥,通信双方有各自的公钥和私钥,PKI即基于非对称加密技术
  2. 优缺点:加密性好,但计算量大
  3. 常用算法
    1. RSA:以三个创造者的人姓氏开头字母命名
    2. DSA:数字签名算法
    3. ECDSA:椭圆曲线签名算法
  4. 其他另行补充

5.3、AES加密算法

在这里插入图片描述

  1. 加密过程:加密时需要输入密码和偏移量,输出格式一般选择base64

  2. 解密过程:解密和加密互逆,输入密码和偏移量以及密文,即可解密

  3. 在线加解密工具http://tool.chacuo.net/cryptaes

    由于加密使用的算法涉及太多,之后学习密码学之后再统一做补充

    对于初学只需要掌握判断加密的方式,以及深入考虑如何逆向解密即可

    php解密题目对应视频时间:1h07min45s

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值