一、安全基础
互联网上进行信息传输的问题和解决方案:
问题 | 描述 | 解决 | 要求 |
---|---|---|---|
窃听 | 传输过程中被第三方窃听 | 加密 | 保密性 |
欺骗 | 信息发送方和接收方对骗对方 | 消息认证码或数字签名 | |
伪造 | 传输过程中被第三方篡改 | 消息认证码或数字签名 | 完整性 |
否认 | 发送方否认发出的信息 | 数字签名 | 合法性 |
二、加密概况
加密技术通常分为两大类:”对称式”和”非对称式”。
对称性加密算法
对称式加密就是加密和解密使用同一个密钥。信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行加解密了。对称加密算法用来对敏感数据等信息进行加密。
- 优点:对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。
- 缺点:1、密钥传输问题(密钥还需要非对称加密后传输)2、密钥管理问题(每个用户都需要单独生成一个密钥)
- 使用场景:本地数据加密、https通信、网络传输等
非对称加密算法
1976年由美国Whitfield Diffie和Martin Hellman提出“迪菲-赫尔曼密钥交换”。使得人们认识到,加密和解密可以使用不同的规则,来避免直接传递密钥。
公钥私钥:
加密和解密所使用的不是同一个密钥,通常有两个密钥,称为”公钥”和”私钥”,两个必须配对使用。
使用私钥加密的内容,只能通过公钥来解密。使用公钥加密的内容,只能通过私钥来解密。
公钥,可以对外给任何人的加密和解密密码,公开的,可以任何人访问
私钥,私钥是一定要严格保护的,通过私钥可以生成公钥,但是从公钥可以认为是永远无法推导出私钥的。
优点:非对称加密与对称加密相比其安全性更好
缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
使用场景:https会话前期、CA数字证书、信息加密、登录认证等
信息加密流程:
B需要接收消息,则B生成一对密钥,然后B将公钥公开。A如果想给B发送消息,需要先获取B的公钥进行消息加密后,发送给B,B再用自己的私钥进行消息解密。
身份认证流程:
身份认证和加密不同,主要用户鉴别用户的真伪。这里我们只要能够鉴别一个用户的私钥是正确的,就可以鉴别这个用户的真伪。因此A如果想在B站做身份认证,则A在B站生成一对密钥后,A将私钥保存好,B站将公钥保存好。A做验证时,通过私钥进行加密后传给B站,B站如果能用A用户对应的公钥进行解密,则完成了A的身份认证。
散列算法
散列算法,又称哈希函数,是一种单向加密算法。在信息安全技术中,经常需要验证消息的完整性,散列(Hash)函数提供了这一服务,它对不同长度的输入消息,产生固定长度的输出。这个固定长度的输出称为原输入消息的”散列”或”消息摘要”(Message digest)。散列算法不算加密算法,因为其结果是不可逆的,既然是不可逆的,那么当然不是用来加密的,而是签名。
- 优点:不可逆、易计算、特征化
- 缺点:可能存在散列冲突
- 使用场景:文件或字符串一致性校验、数字签名、鉴权协议
三、对称性加密
对称性加密算法有:DES、3DES、AES
用途:对称加密算法用来对敏感数据等信息进行加密
DES(Data Encryption Standard)
由IBM设计,数据加密标准,速度较快,适用于加密大量数据的场合。
3DES(Triple DES)
是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。相对DES更安全,但效率不高。
AES(Advanced Encryption Standard)
- 高级加密标准,是下一代的加密算法标准,速度快,安全级别高;
- AES是一个使用128为分组块的分组加密算法,分组块和128、192或256位的密钥一起作为输入,对4×4的字节数组上进行操作。
- AES是种十分高效的算法,尤其在8位架构中,这源于它面向字节的设计。AES适用于8位的小型单片机或者普通的32位微处理器,并且适合用专门的硬件实现,硬件实现能够使其吞吐量(每秒可以到达的加密/解密bit数)达到十亿量级。同样,其也适用于RFID系统。
关键术语:
- 分组密码体制,即AES加密会首先把明文切成一段一段的,而且每段数据的长度要求必须是128位16个字节,如果最后一段不够16个字节了,就需要用Padding来填满。
- Padding,就是用来把不满16个字节的分组数据填满16个字节用的,它有三种模式PKCS5、PKCS7和NOPADDING。PKCS5是指分组数据缺少几个字节,就在数据的末尾填充几个字节的几。PKCS7是指分组数据缺少几个字节,就在数据的末尾填充几个字节的0。NoPadding是指不需要填充,必须保证数据有16字节。
- 密钥,AES要求密钥的长度可以是128位16个字节、192位或者256位。
- 初始向量IV,作用是使加密更加安全可靠,我们使用AES加密时需要主动提供初始向量,而且只需要提供一个初始向量就够了,后面每段数据的加密向量都是前面一段的密文。初始向量IV的长度规定为128位16个字节,初始向量的来源为随机生成。
- 四种加密模式,共有四种加密模式,分别是ECB(电子密码本模式)、CBC(密码分组链接模式)、CFB、OFB,我们一般使用的是CBC模式
四、非对称性加密
非对称性加密算法有:RSA、DSA、ECC
RSA
由麻省理工学院的Ron Rivest、Adi Shamir、Leonard Adleman提出,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的。
对于RSA的原理理解,需要的数学知识包含互质、欧拉函数、欧拉定理、模反元素。参见“数学基础”章节。
RSA密钥生成步骤:
1、求N
使用伪随机数生成器生成p和q,p和q都是质数,N=p * q
2、求φ(N)(欧拉函数)
φ(N) = φ(p * q) = φ(p)φ(q)=(p-1)(q-1)
3、求E
要求1<E<φ(N),且E和φ(N)互质。实际应用中,常常选择65537。
4、求E对于φ(N)的模反元素D
要求1<D<φ(N),且E * D mod φ(N)=1
5、公钥和私钥
将N和E放入公钥,将N和D放入私钥。
6、可靠性验证
回顾我们一共生成了六个数字:p、q、N、φ(N)、E、D,这六个数字之中,公钥用到了两个(N和E),其余四个数字都是不公开的。其中最关键的是D,因为N和D组成了私钥,一旦D泄漏,就等于私钥泄漏。那么,有无可能在已知N和E的情况下,推导出D?
- E * D mod φ(N)=1。只有知道E和φ(N),才能算出D
- φ(N)=(p-1)(q-1)。只有知道p和q,才能算出φ(N)
- N=pq。只有将N因数分解,才能算出p和q
结论:如果n可以被因数分解,d就可以算出,也就意味着私钥被破解。但是如果N很大,即以现有计算能力,还无法被因数分解。正是基于这个数学上的难题,因此可以公开密钥算法。
目前针对RSA流行的攻击一般都是基于大数因式分解。目前编号为RSA-768的数被成功分解,威胁到现通行的1024-bit密钥的安全性,普遍认为用户应尽快升级到2048-bit或以上。
此外量子计算的秀尔算法能使穷举的效率大大的提高。一个拥有N量子比特的量子计算机,每次可进行2^N次运算,理论上讲,密钥为1024位长的RSA算法,用一台512量子比特位的量子计算机在1秒内即可破解。
DSA(Digital Signature Algorithm)
数字签名算法,是一种标准的 DSS(数字签名标准),严格来说不算加密算法。
ECC(Elliptic Curves Cryptography)
椭圆曲线密码编码学。
ECC和RSA相比,具有多方面的绝对优势,主要有:
- 抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。
- 计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。
- 存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。
- 带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。
五、散列算法
散列算法(签名算法)有:MD5、SHA1、HMAC
用途:主要用于验证,防止信息被修。具体用途如:文件校验、数字签名、鉴权协议
MD5
MD5是一种不可逆的加密算法,目前是最牢靠的加密算法之一,尚没有能够逆运算的程序被开发出来,它对应任何字符串都可以加密成一段唯一的固定长度的代码。
SHA1
安全哈希算法,SSL行业选择SHA作为数字签名的散列算法。是由NISTNSA设计为同DSA一起使用的,它对长度小于264的输入,产成长度为160bit的散列值(40个16进制数),因此抗穷举(brute-force)性更好。SHA-1设计时基于和MD4相同原理,并且模仿了该算法。SHA-1是由美国标准技术局(NIST)颁布的国家标准,是一种应用最为广泛的Hash函数算法,也是目前最先进的加密技术,被政府部门和私营业主用来处理敏感的信息。而SHA-1基于MD5,MD5又基于MD4。
SHA2
SHA2中最受欢迎的是SHA256,可以生成长度为256bit的散列值。经常用来签发SSL证书。
HMAC
是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。也就是说HMAC是需要一个密钥的。所以,HMAC_SHA1也是需要一个密钥的,而SHA1不需要。
六、其他常用算法
Base64
其实不是安全领域下的加密解密算法,只能算是一个编码算法,通常用于把二进制数据编码为可写的字符形式的数据,对数据内容进行编码来适合传输(可以对img图像编码用于传输)。这是一种可逆的编码方式。编码后的数据是一个字符串,其中包含的字符为:A-Z、a-z、0-9、+、/,共64个字符(26 + 26 + 10 + 1 + 1 = 64,其实是65个字符,“=”是填充字符。Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3 * 8 = 4 * 6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。原文的字节最后不够3个的地方用0来补足,转换时Base64编码用=号来代替。这就是为什么有些Base64编码会以一个或两个等号结束的原因,中间是不可能出现等号的,但等号最多只有两个。其实不用”=”也不耽误解码,之所以用”=”,可能是考虑到多段编码后的Base64字符串拼起来也不会引起混淆。)
Base64编码是从二进制到字符的过程,像一些中文字符用不同的编码转为二进制时,产生的二进制是不一样的,所以最终产生的Base64字符也不一样。例如”上网”对应utf-8格式的Base64编码是”5LiK572R”, 对应GB2312格式的Base64编码是”yc/N+A==”。
标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充’=’号,并将标准Base64中的“+”和“/”分别改成了“-”和“”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。
此外还有一些变种,它们将“+/”改为“ -”或“._ ”(用作编程语言中的标识符名称)或“. -”(用于XML中的Nmtoken)甚至“ _: ”(用于XML中的Name)。
GeoHash
Geohash算法就是将经纬度编码,能够把二维的空间经纬度数据编码成一维的字符串,给地理地址位置分区的一种算法。Redis目前也支持goehash算法。
七、小结
1、加密算法是可逆的,用来对敏感数据进行保护。散列算法(签名算法、哈希算法)是不可逆的,主要用于身份验证。
2、对称加密算法使用同一个密匙加密和解密,速度快,适合给大量数据加密。对称加密客户端和服务端使用同一个密匙,存在被抓包破解的风险。
3、非对称加密算法使用公钥加密,私钥解密,私钥签名,公钥验签。安全性比对称加密高,但速度较慢。非对称加密使用两个密匙,服务端和客户端密匙不一样,私钥放在服务端,黑客一般是拿不到的,安全性高。
4、Base64不是安全领域下的加解密算法,只是一个编码算法,通常用于把二进制数据编码为可写的字符形式的数据,特别适合在http,mime协议下的网络快速传输数据。UTF-8和GBK中文的Base64编码结果是不同的。采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到,但这种方式很初级,很简单。Base64可以对图片文件进行编码传输。
5、https协议广泛用于万维网上安全敏感的通讯,例如交易支付方面。它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
6、大量数据加密建议采用对称加密算法,提高加解密速度;小量的机密数据,可以采用非对称加密算法。在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
7、MD5标准密钥长度128位(128位是指二进制位。二进制太长,所以一般都改写成16进制,每一位16进制数可以代替4位二进制数,所以128位二进制数写成16进制就变成了128/4=32位。16位加密就是从32位MD5散列中把中间16位提取出来);sha1标准密钥长度160位(比MD5摘要长32位),Base64转换后的字符串理论上将要比原来的长1/3。