加密与认证技术

时间 : 14-09-16 评论 : 0 点击 : 1,498 次

摘要认证

摘要认证用于网络传输密码
摘要认证的箴言是“绝不通过网络发送密码”,用户登录时,把明文密码发送给服务器,如果中途被人截获,用户密码就泄漏了! 用不可逆的密码摘要替换明文密码,不可逆意味着摘要无法还原回明文,即使中途被人截获,也不会泄漏密码。MD5就可以完成计算摘要这一光荣使命。如果语言本身没有MD5函数,github上通常都可以找到该语言对应的开源MD5代码。
摘要认证用于存储密码
不应该存储明文密码,CSDN如果注意到这一点,就不会被拖库泄漏500万用户密码了。存储密码摘要,即使被拖库,也不会泄漏用户密码,还能防止内部人员偷窥用户密码。

加盐加密(Salting password)

重放攻击
网上上传输密码摘要时,截获密码摘要的人虽然不知道密码,但没所谓啊,把摘要发送给服务器,就通过身份认证了,跟截获密码有一样的效果,只是稍微麻烦一点罢了。
彩虹表反向查找
彩虹表就是一个庞大的、针对各种可能的字母组合预先计算好的哈希值的集合,不一定是针对MD5算法的,各种算法的都有,有了它可以根据哈希值反查明文密码。
什么是加盐
在摘要的基础上增加一点佐料(一串字符),称为加盐加密。可以加固定盐(固定字符串)、可以加随机盐(随机字符串),可以用任意自定义算法混合明文(or摘要)和盐,通过加盐,可以增加密码传输和存储的安全性。
网络传输密码时加盐
在网络传输密码摘要时,客户端和服务器协商一个随机数作为盐加密摘要,该随机数只一次性有效,那么基于该随机数加盐后的摘要,也是一次性有效,即使摘要被截获,也无法实施重放攻击。
存储密码时加盐
存储密码时,明文密码简单加一个固定盐,也能够增加彩虹表破译的难度,已存在的彩虹表都是针对各种可能的字母自合预先计算好的哈希值集合,明文加盐后的密码因为加了一串字符串,通常不在彩虹表内。如果黑客知道你加固定盐的方式和固定盐的值,可以基于现有的彩虹表,针对你的加盐方式重新生成一份彩虹表来破译你的密码,一个强大的彩虹表通常都100G以上,重建彩虹表增加了破译成本。 加随机盐存储密码。举例:
step1:对密码明文p1生成摘要e1,生成一个16位随机字符串salt,将salt和e1用自定义算法混合到一起,得到saltE1,对saltE1计算摘要得到e2
step3:将e2和salt自定义算法混合到一起得到一个48位的字符串e3(要求e3可以逆向分解为e2和salt),e3是最终存储到数据库的加密密码。 验证密码时,首先从e3分离出e2、salt,对密码进行step1得到e22,校验e2和e22是否相等

对称加密

单向摘要是不可逆的,密文无法还原为明文,加密通常要求可逆,即密文可以还原为明文。
用于加密的密钥和解密的密钥相同时,称为对称密钥加密。流行的对称密钥加密算法包括:DES(密钥长度64位、有效密钥长度56位)、Triple-DES(3DES,用三条56位的密钥进行三次DES加密)、RC2、RC4。对称加密时,可以用DH秘钥交换得到私钥。

不对称加密

用于加密和解密的密钥不同时,称为不对称加密,也叫公开密钥加密。公开加密技术中用于公钥进行加密,所有人都可以得到公钥,用私有密钥进行解密,只有服务器才知道私钥。常见的不对称加密算法有RSA、DSA。RSA算法基于这样一个数论知识:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法原理的推导需要用到一堆数论公式,感兴趣参考:RSA算法原理
摘要算法是不可逆的,因此用户注册时,无法用摘要算法对密码进行加密,可以用RSA算法加密密码,服务器用私钥解密密码。

混合加密

不对称加密算法和对称加密算法一起使用,称为混合加密。 由于不对称加密算法速度慢于对称加密算法,对大量明文进行加密时,通常是客户端随机产生密钥,使用对称加密算法对明文进行加密,用不对称加密算法对对称加密算法的密钥进行加密。

数字签名

签名是加了密的校验和,是一种确保数据完整性和来源的方法。 数字签名产生的过程:
1、节点A对变长报文计算定长摘要
2、节点A对摘要应用不对称加密中的解码函数,用私钥对摘要进行加密。由于节点A才知道私钥,所以可以证明是节点A生成了这条报文。
3、将报文和加密后的摘要一起发送给节点B
4、节点B接收到报文和摘要之后,取出摘要,应用公钥和加密函数对摘要进行解码,对比报文计算得到的摘要和加密后的摘要是否一致。 注:RSA加密算法中,加密函数和解密函数可以交换顺序使用,以任意顺序应用这两个函数,作用都会得到抵消。

数字证书

维基百科的定义:数字证书,又称为数码证书、数字证书、数字凭证、电子凭证或数字证书,是一种用于电脑的身分识别机制。数字证书不是数字身份证,而是身份认证机构盖在数字身份证上的一个章或印(或者说加在数字身份证上的一个签名),这一行为表示身份认证机构已认定这个持证人。
服务器数字证书通常包括:web站点的名称和主机名、web站点的公开密钥、签名颁发机构的名称、来自签名颁发机构的签名、证书过期时间。
浏览器收到数字证书时,首先对签名颁发机构(CA)进行检查,如果浏览器已经安装了这个签名颁发机构的证书(浏览器会预先安装很多知名颁发机构的证书,用户也可以手工安装),那么就可以获取到签名颁发机构的公钥,拿着CA的公钥对收到的数字证书验证签名,确认是由该CA颁发并且数字证书没有被修改。数字证书被信任之后,就可以取出数字证书中包含的网站公钥,对要发送给网站的数据进行加密。
如果没有安装CA的证书,那么浏览器无法验证收到的数字证书是否可信,会提示用户。如果用户信任该数字证书,仍然可以取出数字证书中的公钥,与网站进行加密通信。

HTTPS

HTTPS用二进制协议SSL or TLS(后面统称为SSL)对HTTP报文进行加密,SSL工作在应用层(HTTP)和传输层(TCP)之间,服务器默认的HTPPS协议端口是443。 客户端与服务器443端口建立连接之后,首先需要与服务器进行SSL握手,获取服务器数字证书和交换加密秘钥,握手过程参考:SSL握手过程白话SSL协议的握手过程
握手完成之后,就可以进行加密通信了。 因为HTTPS对报文包括报文的头部进行了加密,代理无法读出报文头部,因此不知道该将报文发送给谁。通过HTTPS隧道协议来解决这个问题,客户端首先以明文方式告知代理要连接的服务器主机和端口(通过connect方法,示例:CONNECT www.abc.com:443 HTTP/1.1),代理与服务器建立连接之后,给客户端返回200,客户端接下来给代理发送加密后的二进制数据,代理通过和服务器建立好的连接把客户端的二进制数据发送给服务器。

安全

加密与认证技术:等您坐沙发呢!

发表评论