1. 介绍
数字签名、信息加密 是前后端开发都经常需要使用到的技术,应用场景包括了用户登入、交易、信息通讯、oauth 等等,不同的应用场景也会需要使用到不同的签名加密算法,或者需要搭配不一样的 签名加密算法来达到业务目标。这里简单的给大家介绍几种常见的加密算法
2.正文
2.1 数字签名
数字签名,简单来说就是通过提供 可鉴别 的 数字信息 验证 自身身份 的一种方式。一套 数字签名 通常定义两种 互补 的运算,一个用于 签名,另一个用于 验证。分别由 发送者 持有能够 代表自己身份 的 私钥 (私钥不可泄露),由 接受者 持有与私钥对应的 公钥 ,能够在 接受 到来自发送者信息时用于 验证 其身份。
注意:签名 最根本的用途是要能够唯一 证明发送方的身份,防止 中间人攻击、CSRF 跨域身份伪造。基于这一点在诸如 设备认证、用户认证、第三方认证等认证体系中都会使用到 签名算法 (彼此的实现方式可能会有差异)。
示例:
客户端:
1.将敏感信息进行对称或非对称加密得到加密过得数据报文;
2.将数据报文再进行一下HASH算法加密得到32位的HSAH值;
3.将32位HASH值进行RSA算法加密得到签名;
4.将签名和数据报文打包组合发送给服务端;
服务端:
1.将接收到的签名用私钥解密得到32位的HASH值;
2.将接收到的数据报文按照客户端相同的操作进行HASH算法,得到32位HASH值;
3.判断两个HASH是否相同,如相同则表示数据报文是安全的;
4.将数据报文解密得到需要的原始数据;
2.2 对称加密和非对称加密
加密算法分 对称加密 和 非对称加密,其中对称加密算法的加密与解密 密钥相同,非对称加密算法的加密密钥与解密 密钥不同,此外,还有一类 不需要密钥 的 散列算法。
2.2.1 对称加密
对称加密算法 是应用较早的加密算法,又称为 共享密钥加密算法。在 对称加密算法 中,使用的密钥只有一个,发送 和 接收 双方都使用这个密钥对数据进行 加密 和 解密。这就要求加密和解密方事先都必须知道加密的密钥。
数据加密过程:在对称加密算法中,数据发送方 将 明文 (原始数据) 和 加密密钥 一起经过特殊 加密处理,生成复杂的 加密密文 进行发送。
数据解密过程:数据接收方 收到密文后,若想读取原数据,则需要使用 加密使用的密钥 及相同算法的 逆算法 对加密的密文进行解密,才能使其恢复成 可读明文。
2.2.2 非对称加密
非对称加密算法,又称为 公开密钥加密算法。它需要两个密钥,一个称为 公开密钥 (public key),即 公钥,另一个称为 私有密钥(private key),即 私钥。
因为 加密 和 解密 使用的是两个不同的密钥,所以这种算法称为 非对称加密算法。
如果使用 公钥 对数据 进行加密,只有用对应的 私钥 才能 进行解密。
如果使用 私钥 对数据 进行加密,只有用对应的 公钥 才能 进行解密。
例子:甲方生成 一对密钥 并将其中的一把作为 公钥 向其它人公开,得到该公钥的 乙方 使用该密钥对机密信息 进行加密 后再发送给甲方,甲方再使用自己保存的另一把 专用密钥(私钥),对 加密 后的信息 进行解密。
2.3 常见的加密算法
2.3.1 对称性加密算法:AES、DES、3DES
AES、DES、3DES 都是 对称 的 块加密算法,加解密 的过程是 可逆的。
DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。
3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;AES是一个使用128位分组块的分组加密算法,分组块和128、192或256位的密钥一起作为输入,对4×4的字节数组上进行操作。AES是种十分高效的算法,尤其在8位架构中,这源于它面向字节的设计。AES 适用于8位的小型单片机或者普通的32位微处理器,并且适合用专门的硬件实现,硬件实现能够使其吞吐量(每秒可以到达的加密/解密bit数)达到十亿量级。同样,其也适用于RFID系统。
AES 本身就是为了取代 DES 的,AES 具有更好的 安全性、效率 和 灵活性。
2.3.2 非对称性算法:RSA、DSA、ECC
RSA:是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的。RSA算法基于一个十分简单的数论事实:将两个大质数(素数)相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。比如:取两个简单的质数:89、97,得到两者乘积很简单8633;但是要想对8633进行因式分解,其工作量成几何增加。
DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准),严格来说不算加密算法。
ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。ECC和RSA相比,具有多方面的绝对优势,主要有:抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。
RSA 算法出现的早,现在 SSL 证书普遍使用的是 RSA 算法,由于上述的 RSA 算法存在的缺点,现在使用 ECC 作为公钥算法的数字证书也开始多了起来。
一个例子:
随着安全等级的增加,当前加密法的密钥长度也会成指数增加,而 ECC 密钥长度却只是成线性增加。例如,128 位安全加密需要 3,072 位 RSA 密钥,却只需要一 个 256 位 ECC 密钥。增加到 256 位安全加密需要一个 15,360 位 RSA 密钥,却只需要一个 512 位 ECC 密钥。
2.3.3 散列算法(签名算法):MD5、SHA1、HMAC
MD5:Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。对输入信息生成唯一的128位散列值(32个字符),即 32个16进制的数字。(简单防篡改,安全性较低,优点:快速)。算法是公开的,对相同的数据加密,得到的结果是一样的;对不同的数据加密,得到的结果是定长的;MD5对不同的数据进行加密,得到的结果都是 32 个字符长度的字符串信息摘要,信息"指纹",是用来做数据识别的,不能逆推反算(重要)。
SHA1:是由NISTNSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1设计时基于和MD4相同原理,并且模仿了该算法。SHA-1是由美国标准技术局(NIST)颁布的国家标准,是一种应用最为广泛的Hash函数算法,也是目前最先进的加密技术,被政府部门和私营业主用来处理敏感的信息。而SHA-1基于MD5,MD5又基于MD4。
HMAC:是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。也就是说HMAC是需要一个密钥的。所以,HMAC_SHA1也是需要一个密钥的,而SHA1不需要。
随着暴力破解网站的出现,现在的MD5已不再是绝对安全,因此可以对MD5稍作改进,以增加解密的难度。MD5公认被破解不代表其可逆,而是一段字符串加密后的密文,可以通过强大运算计算出字符串加密后的密文对应的原始字符串,但也不是绝对的被破解。MD5解密网站
几种提升加密安全方案:
- 传统方法是加盐(Salt):在明文的固定位置插入位数足够多、足够复杂的随机串,然后再进行MD5。
NSString *salt = @"fdsfjf)*&*JRhuhew7HUH^&udn&&86&*";
NSString *str = @"123456";
str = [str stringByAppendingString:salt];
str = [str md5String];
缺点:盐是固定不变的,一旦泄露后果不堪设想;使用加盐通过MD5解密之后,很容易发现规律从而破解。
- 在此基础上升级:
a. 先加密+后乱序:先对明文进行MD5,然后对加密得到的MD5串的字符进行乱序.
b. 乱序+加盐+多次MD5加密等.
c. 使用消息认证机制HMAC:给定一个"秘钥",对明文进行加密,并且做"两次散列"!-> 得到的结果,还是 32 个字符,相对安全
再次提高安全性:添加时间戳
第一步:客户端将HMAC得到的数据拼接当前服务器时间,再用MD5加密。
即(HMAC+201910201633).md5String
,将加密后的数据post到服务器。
第二步:服务器开始验证:根据账号在数据库中读取HMAC,将当前服务器时间拼接后,再用MD5加密,得到32位字符与客户端提交的32位字符进行比较。这里会有两种情况,1.服务器拼接的时间与客户端拼接的时间一致,得到相同的密文,则通过验证;2.服务器拼接的时间与客户端拼接的时间不一致,得到的密文不相同。这是服务器就拼接上一个时间,即:客服端密文是:(HMAC+201910201633).md5String
,服务器第一次拼接时间密文是:(HMAC+201910201634).md5String
。两者不一致,服务器第二次拼接上一个时间段密文:(HMAC+201910201633).md5String
,一致则通过。
进行这样的操作就是让客户端发出的请求的时间有效性只维持1分钟,如果还觉得不安全可以再拼接时间的时候添加秒,进一步缩短时间的有效性,以提高安全性。
2.3.4 其他常用算法:Base64、HTTPS、钥匙串加密(iOS)
-
Base64: Base64可以成为密码学的基石。它可以将任意的二进制数据进行Base64编码,并且所有的数据都能被编码为并只用65个字符(A~Z a~z 0~9 + / =)就能表示的文本文件。
注意:对文件进行base64编码后文件数据的变化:编码后的数据~=编码前数据的4/3,会大1/3左右。
Base64编码原理:
(1) 将所有字符转化为ASCII码
(2) 将ASCII码转化为8位二进制
(3) 将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位
(4) 统一在6位二进制前补两个0凑足8位
(5) 将补0后的二进制转为十进制
(6) 从Base64编码表获取十进制对应的Base64编码Base64处理过程:
(1) 转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。
(2) 数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。
(3) 不断进行,直到全部输入数据转换完成。
(4) 如果最后剩下两个输入数据,在编码结果后加1个“=”;
(5) 如果最后剩下一个输入数据,编码结果后加2个“=”;
(6) 如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。 HTTPS:(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间),提供了身份验证与加密通讯方法,现在它被广泛用于互联网上安全敏感的通讯,例如交易支付方面。它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
HTTPS和HTTP区别:
(1).https协议需要到ca申请证书,一般免费证书很少,需要交费。
(2).http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
(3).http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
(4).http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
- 钥匙串(Keychain):是苹果公司Mac OS中的密码管理系统。它在Mac OS 8.6中和iOS7之后被导入,并且包括在了所有后续的各版本中。一个钥匙串可以包含多种类型的数据:密码(包括网站,FTP服务器,SSH帐户,网络共享,无线网络,群组软件,加密磁盘镜像等),私钥,电子证书和加密笔记等。钥匙串加密:保存在钥匙串的内容相当于系统对其做了保护,在设备锁定时进行了加密处理。
3.总结
- 加密算法是可逆的,用来对敏感数据进行保护。散列算法(签名算法、哈希算法)是不可逆的,主要用于身份验证。
- 对称加密算法使用同一个密匙加密和解密,速度快,适合给大量数据加密。对称加密客户端和服务端使用同一个密匙,存在被抓包破解的风险。
- 非对称加密算法使用公钥加密,私钥解密,私钥签名,公钥验签。安全性比对称加密高,但速度较慢。非对称加密使用两个密匙,服务端和客户端密匙不一样,私钥放在服务端,黑客一般是拿不到的,安全性高。
- Base64不是安全领域下的加解密算法,只是一个编码算法,通常用于把二进制数据编码为可写的字符形式的数据,特别适合在http,mime协议下的网络快速传输数据。UTF-8和GBK中文的Base64编码结果是不同的。采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到,但这种方式很初级,很简单。Base64可以对图片文件进行编码传输。
- https协议广泛用于万维网上安全敏感的通讯,例如交易支付方面。它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
- 大量数据加密建议采用对称加密算法,提高加解密速度;小量的机密数据,可以采用非对称加密算法。在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
- MD5标准密钥长度128位(128位是指二进制位。二进制太长,所以一般都改写成16进制,每一位16进制数可以代替4位二进制数,所以128位二进制数写成16进制就变成了128/4=32位。16位加密就是从32位MD5散列中把中间16位提取出来);sha1标准密钥长度160位(比MD5摘要长32位),Base64转换后的字符串理论上将要比原来的长1/3。