Base64编码
Base64编码是一种用64个字符(其实是65个字符,“=”是填充字符)来表示任意二进制数据的方法,编码后的数据是一个字符串。
原理
准备一个包含64个字符的数组,其中包含的字符为:A-Z、a-z、0-9、+、/。
64个字符需要6位二进制来表示,表示成数值为0~63。
对二进制数据进行处理,每3个字节一组,一共是3x8=24bit,再划为4小组,每小组正好6个bit,然后查表,获得相应的4个字符,就是编码后的字符串。
如果数据的字节数不是3的倍数,需在原数据后面添加1个或2个零值字节,使其字节数是3的倍数。然后,在编码后的字符串后面添加1个或2个等号“=”,表示所添加的零值字节数。解码的时候,会自动去掉。
特点
Base64编码是可逆的编码方式,从编码的方式即可逆推出解码的方式。
Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%。
标准的Base64编码后可能出现字符“+”和“/”,在URL中就不能直接作为参数。
可以自己定义64个字符的排列顺序,这样就可以自定义Base64编码。
Base64编码的长度永远是4的倍数。
应用
Base64适用于小段内容的编码,比如数字证书签名、Cookie的内容等。
Base64也会经常用作一个简单的“加密”来保护某些数据(标准Base64编码解码无需额外信息即完全可逆),而真正的加密通常都比较繁琐。
HTML内嵌Base64编码图片:绝大多数现代浏览器都支持一种名为 Data URLs 的特性,允许使用Base64对图片或其他文件的二进制数据进行编码,将其作为文本字符串嵌入网页中。
电子邮件系统:SMTP协议一开始是基于纯ASCII文本的,对于二进制文件(比如邮件附件中的图像、声音等)的处理并不好,所以后来新增MIME标准来编码二进制文件,使其能够通过SMTP协议传输。
消息摘要算法
消息摘要算法主要分为三类,即:消息摘要(Message Digest:MD)、安全散列(Secure Hash Algorithm:SHA)和消息认证码(Message Authentication Code:MAC),主要作用是验证数据的完整性。消息摘要算法的主要特点有:①变长输入,定长输出。②单向、不可逆。③虽然“碰撞”是肯定存在的,但是很难找到“碰撞”。
MD算法
MD算法系列最新为MD5,Message-Digest Algorithm 5(信息-摘要算法5)一种被广泛使用的散列算法,可以产生出一个128位的散列值(hash value),用于确保信息传输完整一致。下面以MD5为例进行分析:
原理
输入信息进行填充,使其位长对512求余的结果等于448。如果输入信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1和n个0。填充完后,信息的位长(Bits Length)将被扩展至N*512+448,N为一个非负整数,N可以是零。
记录信息长度,在第一步的结果后面附加一个以64位二进制表示的填充前信息长度(单位为Bit),如果二进制表示的填充前信息长度超过64位,则取低64位。经过这两步的处理,信息的位长=N512+448+64=(N+1)512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
初始化变量,初始的128位值为初试链接变量,这些参数用于第一轮的运算,以大端字节序来表示,他们分别为A=0x01234567,B=0x89ABCDEF,C=0xFEDCBA98,D=0x76543210。每一个变量给出的数值是高字节存于内存低地址,低字节存于内存高地址,即大端字节序。在程序中变量A、B、C、D的值分别为0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476。
处理分组数据,分组数为N+1(块长:512位),每个分组进行4轮变换。
① 四个非线性函数,用于4轮变换。F(X,Y,Z)=(X&Y)|((~X)&Z) G(X,Y,Z)=(X&Z)|(Y&(~Z)) H(X,Y,Z)=X^Y^ZI(X,Y,Z)=Y^(X|(~Z))
②每组的4轮变换
/* F :一个非线性函数,一个函数运算一次 Mi :表示一个 32-bits 的输入数据 Ki:表示一个 32-bits 常数,用来完成每次不同的计算。假设Mj表示消息的第j个子分组(从0到15),常数ti是4294967296*abs( sin(i) )的整数部分,i 取值从1到64,单位是弧度。(4294967296=2^(32))*/FF(a ,b ,c ,d ,Mj ,s ,ti ) 操作为 a = b + ( (a + F(b,c,d) + Mj + ti) << s) // 第一轮用,共16次GG(a ,b ,c ,d ,Mj ,s ,ti ) 操作为 a = b + ( (a + G(b,c,d) + Mj + ti) << s) // 第二轮用,共16次HH(a ,b ,c ,d ,Mj ,s ,ti) 操作为 a = b + ( (a + H(b,c,d) + Mj + ti) << s) // 第三轮用,共16次II(a ,b ,c ,d ,Mj ,s ,ti) 操作为 a = b + ( (a + I(b,c,d) + Mj + ti) << s) // 第四轮用,共16次
③ 每组完成之后,将a、b、c、d分别在原来基础上再加上A、B、C、D。即a = a + A,b = b + B,c = c + C,d = d + D,然后用下一分组数据继续运行以上算法。
④ 最后的输出是a、b、c和d的级联,由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
特点
不可逆:根据输出值,不能得到原始的明文。
压缩性:任意长度的数据,算出的MD5值长度都是固定的。
抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
应用
目前,MD5算法因其普遍、稳定、快速的特点,仍广泛应用于普通数据的错误检查领域。但是MD5演算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开金钥认证或是数位签章等用途。MD5算法主要运用在数字签名、文件完整性验证以及口令加密等方面(一致性校验)。
注意
MD5后所得到的通常是32位的编码,16位编码就是从32位MD5散列中把中间16位提取出来!其实破解16位MD5散列要比破解32位MD5散列还慢,因为他多了一个步骤,就是使用32位加密后再把中间16位提取出来, 然后再进行对比。
SHA算法
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
SHA-0:1993年发布,当时称做安全散列标准(Secure Hash Standard),发布之后很快就被NSA撤回,是SHA-1的前身。
SHA-1:1995年发布,SHA-1在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的散列函数)的后继者。但SHA-1的安全性在2000年以后已经不被大多数的加密场景所接受。2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1[1]。Microsoft、Google以及Mozilla都宣布,它们旗下的浏览器将在2017年前停止接受使用SHA-1算法签名的SSL证书。2017年2月23日,CWI Amsterdam与Google宣布了一个成功的SHA-1碰撞攻击。
SHA-2:2001年发布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1* 基本上仍然相似;因此有些人开始发展其他替代的散列算法。
SHA-3:2015年正式发布,SHA-3并不是要取代SHA-2,因为SHA-2目前并没有出现明显的弱点。由于对MD5出现成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前算法不同的,可替换的加密散列算法,也就是现在的SHA-3。
下表中的中继散列值(internal state)表示对每个数据区块压缩散列过后的中继值(internal hash sum)。
MAC算法
MAC(Message Authentication Code,消息认证码算法)结合了MD5和SHA算法的优势,并加入密钥的支持,是一种更为安全的消息摘要算法。消息认证码的算法中,通常会使用带密钥的散列函数(HMAC),或者块密码的带认证工作模式(如CBC-MAC)。信息鉴别码不能提供对信息的保密,若要同时实现保密认证,同时需要对信息进行加密。下面以HMAC为例进行分析:
原理
1.计算HMAC需要一个散列函数hash(可以是md5或者sha-1)和一个密钥key。
2.算法公式HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M)) H 代表所采用的HASH算法(如SHA-256)K 代表认证密码 Ko 代表HASH算法的密文 M 代表一个消息输入 B 代表H中所处理的块大小,这个大小是处理块大小,而不是输出hash的大小
3.运算步骤
First-Hash = H(Ko XOR Ipad || (data to auth)) Second-Hash = H(Ko XOR Opad || First-Hash) (1) 在密钥K后面添加0来创建一个字长为B的字符串。(例如,如果K的字长是20字节,B=64字节,则K后会加入44个零字节0x00) (2) 将上一步生成的B字长的字符串与ipad做异或运算。 (3) 将数据流text填充至第二步的结果字符串中。 (4) 用H作用于第三步生成的数据流。 (5) 将第一步生成的B字长字符串与opad做异或运算。 (6) 再将第四步的结果填充进第五步的结果中。 (7) 用H作用于第六步生成的数据流,输出最终结果
应用
HMAC主要应用在身份验证中,过程如下:
客户端发出登录请求(假设是浏览器的GET请求)。
服务器返回一个随机值,并在会话中记录这个随机值。
客户端将该随机值作为密钥,和用户密码进行hmac运算,然后提交给服务器。
服务器读取用户数据库中的用户密码和步骤2中发送的随机值做与客户端一样的hmac运算,然后与用户发送的结果比较,如果结果一致则验证用户合法。
作者:windtersharp
来源:https://segmentfault.com/a/1190000014797282?utm_source=channel-hottest
共同学习,写下你的评论
评论加载中...
作者其他优质文章