加密学的发展和应用
计算机加密学的发展历程可以大致分为以下几个阶段:
-
古典密码学时期(古代至20世纪初): 在古代,人们就已经开始使用简单的加密技术来保护通信内容,例如凯撒密码、维吉尼亚密码等。到了近代,出现了更加复杂的替换密码和转位密码,但这些方法都容易受到破译攻击。
-
机械加密机时代(20世纪初至20世纪中叶): 随着机械技术的发展,出现了一系列机械加密机,例如恩尼格玛机等。这些机械设备通过复杂的机制实现了更强大的加密算法,提高了加密的安全性。
-
密码学理论的发展(20世纪中叶至20世纪末): 在20世纪中叶至末期,密码学理论开始迅速发展。克劳德·香农提出了信息论的基本原理,提供了对加密系统安全性的量化分析方法。此外,出现了一系列基于数学原理的新加密算法,例如对称加密算法(如DES、AES)、公钥加密算法(如RSA)、哈希函数等。
-
公钥密码学的诞生(20世纪末至21世纪初): 在20世纪末期,公钥密码学成为密码学领域的重要突破。公钥密码学通过使用一对密钥(公钥和私钥)来实现安全通信,解决了密钥管理的难题,使得加密通信更加方便和安全。RSA算法和Diffie-Hellman密钥交换协议是公钥密码学的代表性算法。
-
量子密码学的探索(21世纪): 随着量子计算技术的发展,传统的加密算法面临着新的挑战。量子密码学作为一种新兴的研究领域,旨在利用量子力学的原理设计更加安全的加密算法,抵御量子计算攻击。量子密钥分发、量子随机数生成等技术成为了量子密码学的研究重点。
本文只针对目前使用和接触到的加密算法进行介绍
三大加密算法:对称加密算法,非对称加密算法,哈希函数‘
对称加密算法
对称加密使用相同的密钥对数据进行加密和解密,这种加密当密码泄露时无异于裸奔;
防篡改的应用还有数字签名、消息认证码(MAC)等,但是原理其实都是一样,详细的之后再说。
典例就是计网中数据链路层和传输层的应用;
数据链路层中差错检测的循环冗余码其实就是简单的一种验证数据是否改变;
但实际的防篡改要比这个复杂得多;
非对称加密算法
有两个相关的密钥,被称为公钥和私钥。虽然可以无限制地分发公钥,但与其配对的私钥必须保密。通常公钥用于加密,私钥用于解密。
在这种使用场景下,
-
公钥(Public Key):公钥是一个用于加密信息的密钥,它可以公开给任何人使用。公钥可以将信息加密,但不能用来解密已加密的信息。任何人都可以使用公钥对信息进行加密,但只有持有与之配对的私钥的人才能解密这些加密后的信息。
-
私钥(Private Key):私钥是与公钥配对的另一个密钥,是保密的,并且只有私钥的持有者才能访问。私钥用于解密由对应的公钥加密的信息。此外,私钥还用于数字签名,确保信息的真实性和完整性。
但是!!!公钥私钥的用处远不止于此;
图:支付宝沙箱示例;
扩展:
公私钥作用对换;私钥进行加密,公钥进行解密
场景:验证私钥的拥有者就是这条信息的发布者,即数字签名;
虽然公钥和私钥都可以用于加密和解密,但是实际上公钥加密、私钥解密还是私钥加密、公钥解密这实际上并不是一个问题。因为公钥是被公开的,使用私钥进行加密,公钥进行解密,在传输的过程中谁都可以获取到这个信息并对其使用公钥进行解密,所以这不是加密和解密的场景,因为这个过程注定无法保密,这个过程是用于验证发送者的身份的,因为在网络上的信息是可以被获取和篡改的,如果私钥只有一人拥有,使用私钥进行加密,获取到这个加密后的数据之后,拿着公钥进行解密,如果能够解开,说明了发送者的身份就是私钥的拥有者,而这种身份的证明和不可抵赖性则是这个使用中最为重要的关注点,而传输的内容则不是关注的内容。 所以私钥加密、公钥解密这种情况更多的则是这样一种表述:私钥的拥有者使用私钥进行签名,而公钥的拥有者使用公钥对此签名进行验证,从而确认发送者的身份。其实从数据的流向也很清楚,从私钥的拥有者流向众多公钥的拥有者,主要是向拥有者进行身份的证明,安全性相关的数据的传输使用这种方式注定是得不到保障的。
哈希函数
这种算法不使用密钥,但根据明文计算固定长度的值,从而无法恢复明文的内容。哈希函数通常被计算机系统用来加密密码。一种常用的哈希算法是256-SHA。
为什么专门使用哈希来加密密码呢?
哈希函数具有以下五大特征:
-
固定输出长度:无论输入的数据长度是多少,哈希函数都会生成固定长度的输出。这意味着不同长度的输入数据经过哈希函数处理后都会得到相同长度的哈希值。
-
确定性:对于相同的输入数据,哈希函数始终产生相同的哈希值。这意味着哈希函数的输出是可预测的,相同的输入总是得到相同的输出。
-
快速计算:哈希函数的计算速度通常很快,即使是对于大量的数据也能在短时间内生成哈希值。
-
雪崩效应:即使输入数据的微小变化也会导致输出哈希值的巨大变化。这意味着只要输入数据发生了一点点改变,输出的哈希值就会完全不同。
-
不可逆性:哈希函数是单向的,即无法通过哈希值来反推出原始的输入数据。这意味着从哈希值无法恢复出原始数据,因此哈希函数通常用于数据加密和摘要生成等安全领域。
应用:
1.由于其确定性,在存储密码时通常将密码和自己设置的字段相加后再生成哈希,防止黑客暴力破解;
又由于不可逆行,即使是内部员工也不可能知道用户真实密码是什么,因为密码在传入后台后会直接进行加密再和数据库中数据比较;
2.说到哈希不得不再提一下token的生成了,我们都知道token有三部分组成,第一部分是token的加密算法和令牌类型
第二部分说明存储的数据,包含确定用户唯一性的信息,权限等
第三部分通过用户额外设置的(私密签名+第一部分+第二部分)通过第一部分指定的加密算法(通常都使用哈希算法)------->token的第三部分
需要注意的是:前两部分是明文传输的,所以第二部分不要存太隐私的消息,后端收到后直接拿出第一部分和第二部分再用自己设置的隐私签名哈希加密生成第三部分和传入的第三部分进行比较,相同则说明就是该用户了; (这也是哈希加密),由于生成哈希不可逆,黑客无法在改变用户信息下仍然保证哈希值能对应;
又引出了一个新的概念!!!签名;
什么意思呢,token认证其实就是使用密钥(不分公私钥,对称加密)对数据进行哈希加密,这个加密后的数据是哈希函数,可以确保数据的可靠性;
而数字签名在这个步骤上,将密钥分为公私钥,并且是在对数据进行哈希处理基础上再进行私钥加密,多了两步,可以说是集万千技术于一身;
还不懂就先看定义:
数字签名
数字签名是一种用于确保数据完整性、身份验证和不可否认性的技术。
数据上应用加密哈希函数并使用发送者的私钥来生成唯一的数字签名。接收者可以使用发送者的公钥验证数字签名,从而确认数据的来源和完整性。
数字签名的过程包括以下步骤:
-
发送者使用哈希函数对要发送的数据进行哈希处理,生成消息摘要(也称为哈希值)。
-
发送者使用自己的私钥对消息摘要进行加密,生成数字签名。
-
发送者将数字签名和原始数据一起发送给接收者。
-
接收者使用发送者的公钥解密数字签名,得到消息摘要。
-
接收者使用相同的哈希函数对接收到的原始数据进行哈希处理,得到一个新的消息摘要。
-
接收者将步骤4和步骤5得到的消息摘要进行比较,如果相同,则确认数据的完整性和来源。(验签)
数字签名可以用于确保数据在传输过程中不被篡改,同时也可以用于身份验证和不可否认性,即发送者无法否认自己发送的数据。
说人话:数字签名就是在发送消息数据的同时又发送了一份由该信息生成的签名,签名和数据成1比1关系,且无法修改,对方可以根据签名来判断数据是否被修改;
数字证书
一种用于进行身份认证和数据加密的数字证明。数字证书是由权威的证书颁发机构(CA,Certificate Authority)签发的电子文档,用于证明特定实体(如个人、组织或服务器)的身份和公钥的合法性。
数字证书通常包含以下信息:
-
持有者信息: 证书持有者的身份信息,如姓名、电子邮件地址、组织等。
-
公钥: 证书持有者的公钥,用于加密数据或验证数字签名。
-
证书颁发机构信息: 签发证书的证书颁发机构的信息,包括名称、数字签名(根据证书中所有字段生成)等。
-
有效期限: 证书的有效期限,包括起始日期和终止日期。
数字证书采用非对称加密算法来实现数据的加密和签名功能。在使用数字证书进行安全通信时,通常会进行以下操作:
-
身份认证: 服务端可以通过客户端提供的数字证书来验证客户端的身份,确保通信双方的真实性和合法性。
-
数据加密: 数字证书中包含了公钥,可以被用来加密通信数据,保护数据在传输过程中的机密性。
-
数字签名: 数字证书中包含了证书颁发机构签发的数字签名,可以被用来对通信数据进行数字签名,确保数据的完整性和真实性。
图:支付宝沙箱证书模式示例
多出的支付宝根证书用于验证支付宝的其他证书的真实性。根证书是由支付宝颁发的顶级证书,用于签发其他支付宝证书的证书。
相对于公私钥模式,证书模式又多了哪些功能呢?
数字证书由权威机构颁发,包含了公钥以及相关的身份信息,并经过权威机构的数字签名认证。用户可以通过验证数字证书的签名来确保证书的真实性和完整性,从而建立起对通信对方的信任。
相对于证书模式,公私钥模式仅提供了加密和解密功能,但并没有提供身份验证的功能,而证书多了各种双方信息以及官方生成的签名,因此在需要身份验证和信任建立的场景下,证书模式更为适用。(安全感拉满了有没有);
加密实战:支付宝全流程
支付的过程中可以大概分为6个步骤。
-
用户选择自己的商品提交订单。
-
商家服务器将商品信息和所需要的金额发给支付宝,生成支付宝订单。
-
支付宝订单返回成功之后生成一个支付页面,方便手机支付或者网页支付。
-
手机调起支付宝app进行支付。
-
输入支付密码发送给支付宝服务器。
-
支付宝服务器转账成功,告知商家服务器某个订单的金额转账成功。
最重要的是第2和6步
在步骤2中,为了验证订单是否为商家发起,引入了数字签名,它可以验证一条消息或者文档的真实性。在支付宝支付的接口中,有一个sign
参数用来填写签名。这个签名作用是为了防止信息伪造 。通过这种方式可以有效的防止消息在传递过程中被篡改。签名实现原理在上文中;
我们看上边支付宝示例图:应用私钥是我方的,在第二步中使用的是我方的私钥加密发送给支付宝,支付宝使用我方的公钥解密以及验签,第6步支付宝使用支付宝私钥加密,我方使用支付宝公钥解密以及验签;
此外,我们在使用非对称加密传输过程中,并没有对真实数据进行加密操作,而只是使用签名保证了其非篡改性,为了保证数据不会被黑客看到,还可以多加一层对称加密来保证数据传输中不会泄露,更加安全,可以使用AES对称加密之后再进行数据传输,或者使用https协议传输(ssl/tsl);
AES 密钥是对接口请求和响应内容进行加密,密文无法被第三方识别,从而防止接口传输数据泄露。
RSA 密钥是对接口请求和响应内容进行签名,开发者和支付宝开放平台分别加签验签,以确认接口传输的内容没有被篡改。不论接口内容是明文还是密文,RSA 均可正常签名。
开发者可对请求参数先做 AES 对称加密,然后对密文进行 RSA 签名。
对于https中的s(ssl/tsl),以后再聊吧,其实就是很多种加密算法,原理没有什么太大差别;
《我的第一本算法书》链接: 我的第一本算法书.pdf - Google 云端硬盘