背景
- 消息编码:Base64, URLEncode
- 消息摘要:MD类、SHA类、MAC
- 对称密码:DES、3DES、AES
- 非对称密码:RSA、DH密钥交换
- 数字签名:RSASignature、DSASignature
常见的Base64和URLEncode
-
URLEncode
如果URL中含有非ASCII字符的话, 浏览器会对URL进行URL_ENCODE, 然后发送给服务器. URL_ENCODE的过程就是把URL作为字符按照某种编码方式(GBK, UTF-8等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字符串 “%xy” 表示,其中xy为该字节的两位十六进制表示形式。
URLencode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8,不同的用户就有不同的浏览器设置,也就造成不同的编码方式,
所以很多网站的做法都是先把url里面的中文或特殊字符用javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URLencode,好处就是网站可以统一get方法提交数据的编码方式。 完成了URLencode网页的charset是告诉浏览器用什么编码对网页进行解释。 -
URLEncode请求流程
---->原URL GET时浏览器根据HTTP头的Content-Type的charset,POST根
据(meta http-equiv=“Content-Type” content=“text/html; charset=utf-8”/)对URL进行编码或者利用JavaScript(如果JavaScript编码了则浏览器一看都是ASCII字符就不再编码)使用GBK或者UTF-8等编码对URL进行编码
---->全为ASCII字符
---->以iso-8859-1编码方式转换为二进制
---->随请求头一起发送出去(GET没有请求实体, POST有)
---->服务器接收到经过iso-8859-1编码后的URL
---->服务器用iso-8859-1编码进行解码
---->网页一般都有meta头的charset选项, 服务器根据此进行再次解码(POST表单提交过去的时候也会根据此编码进行编码)
---->得到正确的值 -
Base64编码
Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人类直接识别的形式,常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。
Base64编码表
ASCII编码对应表
Base64转码原则
@1、Base64的二进制位数必须是3的倍数 - 不够则补
@2、将每个ASCILL字符转为8位的二进制数
@3、划分每6位二进制数转为1个Base编码转换为一个小组,4个Base编码为一个大组
@4、注意点就是必须划分为一个大组,小组存在划分二进制数但不够6个则低位补0,小组连划分二进制数都没有则Base编码使用 =或者.去替代
文本:A
ASCILL:01000001
划分Base编码:010000 010000 缺省 缺省
根据对照表进行转换:Q Q = =
文本:AB
ASCILL:01000001 01000010
划分Base编码:010000 010100 001000 缺省
根据对照表进行转换:Q U I =
文本:ABC
ASCILL:01000001 01000010 01000011
划分Base编码:010000 010100 001001 000011 缺省
根据对照表进行转换:Q U J D
摘要算法(MD5\SHA-256\HMAC)
MD5、SHA256、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法。所谓的解密实为暴力破解。
MD5和SHA-256可以实现对任意长度对象加密,这就决定了传入参数类型为byte数组,如果为int或者其他类型,就不能满足上述要求,任何对象都可以被转成byte数组,为了保持通用性而这样设计。
MD5和SHA-256都不能防止碰撞,只是SHA-256碰撞几率小于MD5,这也是MD5被逐渐抛弃的原因,除非被加密的数据并没有那么大的价值才会用MD5加密。
-
MD5
MD5原理是以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个(128位二进制/23位16进制)散列值。
优势:
–计算速度快,加密速度快,不需要密钥。
–可以检查文件的完整性,防止被篡改,一旦文件被更改,MD5值会改变。
缺陷:
–作为散列算法,经过证实,仍然会存在两种不同数据会发生碰撞。
–MD5的安全性。将用户的密码直接MD5后存储在数据库中是不安全的。需要加盐值操作,如下两点:
(1)因为用户习惯用容易记住的密码,比如手机号、生日,不法分子容易获取这类密码,这也就是要加盐的原因。
(2)直接MD5存入数据库,如果数据库被盗,通过MD5反查会查到密码,需要随机盐值的配合。
–从技术的角度来说,MD5真的安全,因为MD5是不可逆的,没办法解密,除了撞库这样的方式。关于撞库简单来说就是通过建立大型数据库,将常用的各种句子密码等加密成为密文,并存储在数据库中;然后拿着密文到数据库网站查询,就有可能查到密码。 -
SHA-256
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了, 但是SHA仍然是公认的安全加密算法,较之MD5更为安全。
对于任意长度的消息,SHA256都会产生一个256bit长的哈希值,称作消息摘要。这个摘要相当于是个长度为32个字节的数组,通常用一个长度为64的十六进制字符串来表示。
几种Hash算法的对比如下
哈希算法的流程主要包括四个部分:
@1、常量初始化
@2、信息预处理
@3、逻辑运算公式
@4、计算得到信息摘要
常量初始化
主要包括两个部分,分别是8个哈希初值H(0)—H(7),64个哈希常量K(1)—K(64)。其中哈希初值是对自然数中前8个质数(2,3,5,7,11,13,17,19)的平方根的小数部分取前32bit而来。
如:√2的小数部分约 0.414213562373095048
0.414213562373095048 = 0x6a09e667(十六进制,取前32位)
其中哈希常量64个常量,对自然数中前64个质数(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97…)的立方根的小数部分取前32bit而来
信息预处理
逻辑运算
计算得到信息摘要
SHA256的本质就是通过该算法,把输入数据变成一个亲妈都不认识的输出,其中M(i)就是信息预处理得到的结果,
当i=0时,H0(0)…H0(7)即为哈希初值。
定义a…g八个中间变量,后面会用到的;
这个就是计算的核心步骤了,主要是**W(j)**的构建,在程序中,这一步骤也是很容易实现的。
其中各个部分的计算是怎么来的呢?请参考3.3的逻辑运算公式。
需要注意的是:每得到一组新的a…g都要经过64轮的计算
最后就是不断重复这一过程,直至计算出最后的信息摘要。
其中N的大小,和M(i)中,i的大小相关,即“分块”分的越多,N越大。
MD5加密的循环步骤比Sha256少,且要处理的缓存小,导致运行速度比MD5 hash快。
MD5加密对于强行攻击,产生任何一个报文的强度更弱。
-
HMAC算法
MAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。
总归一句话:
HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。 -
hmac应用
HMAC主要应用在身份验证中,固定二进制位数 - 使用服务端产生的Key进行两次加盐(Key)处理
HMAC(K,M)=H((K’⊕opad)∣H((K’⊕ipad)∣M))
(1) 客户端发出登录请求(假设是浏览器的GET请求)
(2) 服务器返回一个随机值,并在会话中记录这个随机值
(3) 客户端将该随机值作为密钥,用户密码进行hmac运算,然后提交给服务器
(4) 服务器读取用户数据库中的用户密码和步骤2中发送的随机值做与客户端一样的hmac运算,然后与用户发送的结果比较,如果结果一致则验证用户合法。
在这个过程中,可能遭到安全攻击的是服务器发送的随机值和用户发送的hmac结果,而对于截获了这两个值的黑客而言这两个值是没有意义的,绝无获取用户密码的可能性,随机值的引入使hmac只在当前会话中有效,大大增强了安全性和实用性。大多数的语言都实现了hmac算法,比如java的MessageDigest类,在web验证中使用hmac也是可行的,用js进行md5运算的速度也是比较快的。
结束
本期探讨了几个重要的也是基础的加密算法,后一篇重点讲解AES、RSA算法,晚安,再见!!!!