加密技术分为对称加密和非对称加密
对称加密
加密和解密的钥匙是同一把,发送方和接受方都是一样的。这样的加密安全性怎样保证?在Linux系统中都有哪些应用使用的对称加密呢?
在 Linux 系统里,有不少服务会运用对称加密来保障数据的安全。下面为你介绍一些常见服务:
OpenVPN
OpenVPN 是一个广泛使用的虚拟专用网络(VPN)实现,它使用对称加密算法(如 AES)来加密通过 VPN 隧道传输的数据。在建立 VPN 连接时,会通过密钥交换协议生成对称加密密钥,后续的数据传输就使用该密钥进行加密和解密,确保数据在公共网络上传输时的机密性和完整性。
SSH(安全外壳协议)
SSH 在数据传输过程中使用对称加密。在建立 SSH 连接时,客户端和服务器首先通过非对称加密算法(如 RSA)交换会话密钥,之后的通信则使用这个对称会话密钥对数据进行加密,这样既能保证密钥交换的安全性,又能利用对称加密的高效性来加密大量数据。
Samba
Samba 是一个让 Linux 系统能够和 Windows 系统共享文件和打印机的服务。它在数据传输时可以使用对称加密,来防止数据在网络传输时被窃取或篡改。通过配置,Samba 可以使用如 AES 之类的对称加密算法,从而保护共享文件和资源的安全。
NFS(网络文件系统)
NFS 允许不同的计算机通过网络共享文件系统。较新的 NFS 版本支持数据加密,在客户端和服务器之间传输数据时可以使用对称加密算法,如 DES 或 AES,以保护文件数据在传输过程中的安全性。
这些服务在使用对称加密时,往往会先借助非对称加密来安全地交换对称密钥,之后再使用对称加密算法对大量数据进行快速加密和解密,这样就能兼顾安全性和性能。
总结:
为了兼顾安全性和性能,应用往往是先通过非对称加密交换密钥完成认证, 然后使用对称加密完成数据传输。
非对称加密
生成一对公私钥,私钥自己保管,公钥可以给其他人。公私钥对是成对存在的,一个用于加密,一个用于解密。通常都是通过公钥加密,私钥解密。
一张图很容易理解:
Linux系统下ssh服务所存储的密钥对:
xxx.pub 公开的
xxx 私有的
一般通过加密算法命名,如下图是使用RAS加密算法进程公钥加密的。常用的算法还25519等等
密码登录认证流程
1、client客户机向server发送登录请求,server服务器将自己的公钥发送给client(客户机)。
2、client使用这个公钥,将公钥进行加密,然后再发送给server。
3、server用私钥解密登录密码,验证合法性。
4、server返回验证结果为client。
存在的问题:中间人攻击,所以如果一个攻击者中途拦截了client的登录请求,发送自己的公钥给client,client端就会用攻击者的公钥进行数据加密,攻击者接收到信息之后,用自己的私钥就可以进行解密了,这就窃取了client的登录信息了。
互信登录过程
1、client端生成秘钥对,将公钥追加在server端的~/.ssh/authorized_keys
2、客户端发送登陆请求,server收到请求之后,生成随机字符串发送给client
3、client用自己的私钥对字符串进行加密,发送给server。
4、server收到加密字符串之后用公钥解密,比较解密出的字符串和之前生成的字符串事发后一致。
5、返回结果给client(一致就允许登录,不一致就不允许)。
疑问: 为啥know_hosts和authorized_keys都保留的是客户端的公钥,这两个有啥差异?
实际上,~/.ssh/authorized_keys
和 /etc/ssh/ssh_known_hosts
保留的公钥分别来自不同对象,二者有着不同的用途,以下为你详细介绍:
存储内容
-
authorized_keys:存于服务端用户的
~/.ssh
目录下,记录的是被允许登录该用户账户的客户端公钥。也就是说,只要客户端持有与authorized_keys
里公钥相匹配的私钥,就能以相应的用户身份登录服务器。 -
know_hosts:通常在客户端的
~/.ssh
目录下(不同系统位置可能有差异),存储的是客户端访问过的服务器的公钥。客户端借助这些公钥来验证服务器的身份,从而防止中间人攻击。
作用机制
-
authorized_keys:主要用于服务器端的身份验证。当客户端尝试登录服务器时,服务器会要求客户端使用私钥对一段数据进行签名,接着服务器利用
authorized_keys
中的公钥来验证签名。若验证通过,就表明客户端拥有对应的私钥,进而允许其登录。 -
know_hosts:主要用于客户端对服务器身份的验证。在客户端首次连接服务器时,服务器会把自己的公钥发送给客户端。客户端会将该公钥存于
know_hosts
文件里。之后再次连接同一服务器时,客户端会检查服务器发送的公钥是否和know_hosts
中存储的一致。若一致,就表明是同一服务器,可继续建立连接;若不一致,客户端会发出警告,防止连接到被篡改的服务器。