非对称加密的应用

Posted nodejs全栈开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非对称加密的应用相关的知识,希望对你有一定的参考价值。

题图 from bing by clm


估计有人看到这篇文章标题的时候会有很多的疑惑,非对称加密是干什么的,"非对称"大致很好理解,意思和对称相反,加密也能理解,但是非对称加密是个什么玩意儿。这东西有什么应用呢?


在开始聊非对称加密之前,咱们先来聊聊对称加密,什么是对称加密呢?


首先我们要清楚,网络中有些数据进行传输的时候,是需要加密的,比方说https,https中就用到了对称加密。


在http协议中,我们将用户发送给服务器端的真实信息叫做明文,明文传输很不安全,所以我们要将明文进行加密,打个比方,我们将明文锁在一个箱子里面,用户有这个箱子的钥匙,这个箱子加上明文就叫做密文,我们把密文发送到服务器,服务器也有一把钥匙,这把钥匙和用户的钥匙是一样的,所以能打开箱子进行解密,这个过程就叫对称加密。


因为客户的钥匙和服务端的钥匙是一样的,所以叫做对称加密。


非对称加密的应用

图A


这里的对称加密有一个缺点,只要持有钥匙就能开锁,并不能确定对方的身份,只要有人持有了钥匙就能解密。


下面就该非对称加密出场了,非对称加密和对称加密不同,非对称加密有两把钥匙,一把叫做公钥,一把叫做私钥。


两个密钥是不同的,也可以称作“不对称”,公钥可以公开给任何人使用,而私钥必须严格保密(理论上不能被第三方知道,除非你的计算机被入侵)。这是非对称加密的一个非常重要的一个特性。


还有一个重要的特性,公钥和私钥有个特别的“单向”性,虽然都可以用来加密解密,但公钥加密后只能用私钥解密,私钥加密后只能用公钥解密,具体如何实现的,这里不做讨论。


通常情况下,⽹站保管私钥,将公钥分发给客户,客户登录⽹站只要⽤公钥加密就⾏了,密⽂只能由私钥持有者才 能解密。⽽hacker因为没有私钥,所以就⽆法破解密⽂。如图:


非对称加密的应用

图B.

非对称加密在数据传输过程中并不能完全保证数据的完整性,比方说有中间人截取了公钥,发布一把假的公钥,非对称加密就形同虚设了。


但是我们这里讨论的是非对称加密的另外一个特性,非对称加密主要的功能是身份的认证,这里我们以github的公钥配置和ssh的免密登录两个案例为大家来演示非对称加密如何实现身份的认证。


文章读到这里请大家思考一个问题,大家仔细观察上面的图B,私钥解密完数据后,能判断出数据是哪个客户端发送过来的吗?


答案肯定是不能,我们在仔细回忆一下公私钥加密的特性,公钥加密私钥解密,私钥加密公钥解密,私钥唯一保存,公钥所有客户端都有保存。


仔细观察上面的图B,是公钥加密,私钥来解密,私钥并不知道消息是谁发送的,但是反过来呢?私钥加密公钥解密,我们将上面的图发过来画,如图:


非对称加密的应用


我们用私钥加密,私钥是唯一的,持有公钥的客户端,如果接收到与其匹配的私钥加密的信息,就可以解密,如果解密完成,就能判断是谁发送的信息了,因为私钥唯一(就像人的身份证号码是的,知道你的身份证号码就能确定你是谁),这样就完成了身份验证。


回过头来,在看一下我们通常配置github账号的公钥的时候,我们先在本地用ssh-keygen命令生成公私钥,id_rsa.pub和id_rsa, 前者是公钥,后者是私钥,我们将公钥填入我们github账号的配置里面,如图:


非对称加密的应用


这样,我们再向远程仓库推送或者拉取代码就不需要在输入密码和账号了。


我们思考一下推送代码的流程,github云端保存我们的公钥,我们每次发起命令(git pull git push 等等),本地计算机用私钥加密,云端的公钥解密,github云端仓库解密完成说明公私钥匹配,完成身份验证,所以可以免去输入账号密码的麻烦。


另外一个应用就是用ssh命令登录远程的linux服务器,我们如果不用公私钥配对的方式验证身份,那么我们每次登录远超过linux服务器,都需要输入账号和密码验证,如果你频繁操作这是很麻烦的,或者如果要执行一些诸如scp的命令等等是很不友好的,所以我们可以使用公私钥配对的方式,ssh支持公私钥配对。


首先还是我们本地生成公私钥,当然如果你本地计算机已经生成公私钥就不需要重复生成了,我们将公钥配置到远程目标服务器,如何配置呢,通常是将公钥的内容填写到目标服务器的一个文件中,这个文件的位置在目标服务的 ~/.ssh/authorized_keys中。


配置如图,登录远程服务器,进入.ssh目录,将本地计算机的公钥添加到目标服务器的 ~/.ssh/authorized_keys中。


非对称加密的应用


添加完成后,我们用cat 命令看一下authorized_keys文件的内容:



可以看到这里配置了1把公钥,所以有拥有和这个公钥匹配的私钥的客户端可以用ssh免密登录这个服务器。


将客户端公钥添加到目标服务器除了手动添加外,我们还可以使用scp_copy_id命令,完整命令如下:


ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 10056 root@192.168.20.11"


shh-copy-id命令是专门操作公钥的一名命令,-是指定客户端的公钥位置,一般都在用户目录的.ssh文件夹中。


-p命令指定登录目标服务器的端口,默认ssh端口是22,如果是非22那么就需要添加-p指定端口了。


后面就是用户名和目标服务器的ip了,用户名和目标服务器中间需要@作为间隔。


以上便是非对称加密的一些应用,如果你有其他建议或者问题欢迎留言讨论。


以上是关于非对称加密的应用的主要内容,如果未能解决你的问题,请参考以下文章

对称加密与非对称加密各自的应用场景

非对称加密的应用

密码技术--非对称加密算法及Go语言应用

密码学中的对称加密和非对称加密

非对称加密和对称加密

区块链科普:非对称加密椭圆曲线加密算法