在网上想看一下这个原理。发现写的还是比较乱,所以自己总结了一份方便回顾
SSH免密登录的原理主要基于非对称密钥加密技术,比较常用的是RSA算法。
以下是SSH免密登录的详细步骤和原理:
1. 生成密钥对
- 在客户端上生成一对密钥,包括一个私钥和一个公钥。私钥将保留在客户端,而公钥将被复制到远程服务器。
- 这一步通常使用
ssh-keygen
命令来完成,该命令会生成一对密钥(默认是RSA密钥对),并将私钥保存在~/.ssh/id_rsa
文件中,公钥保存在~/.ssh/id_rsa.pub
文件中。
2. 复制公钥到服务器
- 将客户端生成的公钥复制到远程服务器的
~/.ssh/authorized_keys
文件中。这可以通过使用ssh-copy-id
命令或手动将公钥内容添加到文件中来完成这一步是为了在后续接收到客户端的公钥时进行比对。
ssh-copy-id
命令会自动将公钥追加到远程服务器上的~/.ssh/authorized_keys
文件中,如果该文件不存在,则会先创建该文件。- 在SSH通信中,
~/.ssh/authorized_keys
文件是SSH服务器用来验证客户端公钥的地方。这个机制允许SSH服务器确认尝试连接的客户端是否持有与服务器上存储的公钥相对应的私钥,从而实现了免密登录和身份验证。这个过程是单向的,即客户端主动连接到服务器,并请求服务器执行某些操作或提供服务。服务器本身不会主动通过SSH连接去“访问”客户端。某些黑客的服务器就算有了用户的公钥,也只是可以让用户登录到该服务器,并不能反向操作用户的电脑。
3. 连接远程服务器
- 当客户端尝试连接到远程服务器时,它会向服务器发送一个连接请求,其中包括客户端的公钥(实际上,在初次连接时,客户端并不直接发送公钥,而是在后续的身份验证过程中使用)。
第一次连接主要是建立tcp连接,然后交换对应协议的版本信息。再协商会话期间将要使用的加密算法、密钥交换算法、消息认证算法。
4. 身份验证过程
服务器在通过检索authorized_keys
文件与请求连接的客户端所发送的内容中存在相同的公钥时。证明该客户端是合法的请求,但是仍需验证在客户端中有公钥对应的密钥。否则公钥是比较容易被获取的,黑客可以通过这个公钥进行合法的请求连接。所以需要验证请求连接的服务器上有对应的私钥,才能证明是对应合法且唯一的客户端。
- 挑战-响应机制:
- 远程服务器生成一个随机数(挑战)作为质询,并使用客户端的公钥(从
~/.ssh/authorized_keys
文件中读取)加密这个随机数。 - 加密后的挑战被发送给客户端。
- 客户端使用自己的私钥解密这个加密的挑战,并将解密后的结果(响应)发送回服务器。
- 服务器将解密后的挑战与原始的挑战进行比较,如果两者匹配,则身份验证成功,服务器允许客户端登录。
- 远程服务器生成一个随机数(挑战)作为质询,并使用客户端的公钥(从
5. 会话密钥协商(可选,但常见于增强安全性)
- 在一些实现中,SSH协议还会在身份验证之后进行会话密钥的协商,以确保后续的通信安全。
- 这一步通常涉及客户端和服务器之间的密钥交换协议,以生成一个共享的会话密钥,用于加密后续的通信数据。
6. 安全性考虑
- SSH免密登录的安全性依赖于私钥的保密性。如果私钥被泄露,攻击者就可以冒充客户端进行登录。
- 因此,建议定期更换私钥,并确保私钥文件的安全存储(例如,使用强密码保护私钥文件,或将其存储在安全的硬件中)。
总结
在SSH免密登录的过程中,私钥并不是直接用来“解密”公钥加密的文件或挑战。这里的“解密”过程实际上是利用了非对称加密技术的特性,其中公钥用于加密数据,而对应的私钥用于解密这些数据。这是非对称加密技术的核心原理之一。
会话密钥加密技术详细解释
会话密钥(Session Key)生成
-
初始化:客户端发起与服务器的连接请求。作为响应,服务器将其公钥
As
发送给客户端。这个公钥将被用于加密后续发送给服务器的敏感信息。 -
会话ID交换:为了确保会话的唯一性,服务器生成一个会话ID
p
并将其发送给客户端。 -
会话密钥生成:客户端生成一个随机的会话密钥
q
,该密钥将用于后续通信的加密。然后,客户端计算r = p ⊕ q
(其中⊕
表示异或操作),这样服务器就可以在接收到r
和已知p
的情况下恢复出q
。 -
加密传输
r
:客户端使用服务器的公钥As
加密r
,然后将加密后的数据发送给服务器。这样,只有服务器(拥有私钥Bs
)能够解密并恢复出r
。 -
解密与密钥恢复:服务器使用私钥
Bs
解密接收到的加密数据,得到r
。然后,服务器通过执行q = r ⊕ p
来恢复出会话密钥q
。
至此,客户端和服务器都拥有了相同的会话密钥 q
,可以使用它来对后续通信进行加密。
认证
-
随机数生成与加密:为了验证客户端是否确实拥有会话密钥
q
,服务器生成一个随机数x
,并使用客户端的公钥加密x
,生成S(x)
,然后发送给客户端。 -
解密随机数:客户端使用对应的私钥
Bc
(与Ac
配对)来解密S(x)
,从而得到随机数x
。 -
哈希计算与传输:客户端使用会话密钥
q
和随机数x
来计算哈希值n(q+x)
(注意:这里q+x
可能是指将q
和x
连接起来的字符串,因为直接对数字进行加法运算在哈希上下文中没有意义)。然后,客户端将n(q+x)
发送给服务器。 -
哈希验证:服务器也使用会话密钥
q
和随机数x
来计算哈希值m(q+x)
。然后,服务器比较m(q+x)
和从客户端接收到的n(q+x)
。 -
认证成功:如果
m(q+x)
和n(q+x)
相同,则服务器确认客户端确实拥有正确的会话密钥q
,并且认证成功。
请注意,在哈希计算中,q+x
通常应该被理解为将 q
和 x
的二进制表示连接成一个更长的字符串,然后再对这个字符串进行哈希计算。此外,虽然MD5在某些情况下仍然被使用,但由于其已知的安全弱点,建议使用更安全的哈希函数,如SHA-256。
会话密钥加密技术简略解释
双方获得会话密钥
- server在会话连接时需要发送会话ID与自己的公钥给client。
- client在接收到数据后,用自己的会话密钥与收到的会话ID进行异或,然后用收到的公钥进行加密并发送回去给server。
- server在收到数据后会利用私钥解密并且进行数学运算,然后可以得到相同的会话密钥。
由server分配会话ID,client提供会话密钥。server提供加密工具(公钥),client利用加密工具加密,server利用解密工具(私钥)解密。从而令双方获得会话密钥。这个密钥就可以用来后续通信的加密。
认证
此时server与client都具有了相同的会话密钥,但这个结果的达成只是需要client请求连接,server发送自己的公钥,结果为server获得会话密钥q。但是还需要验证client拥有私钥。
- server产生一个随机数x,
用client的公钥加密后得到S(x)然后将该数据发送给client。
- client获得加密后的数据后,需要用client自身的私钥进行解密获得x,然后再用会话密钥
q
和随机数x
来计算哈希值n(q+x)。
并直接将该值发送回给server。 - server端同样使用会话密钥
q
和随机数x
来计算哈希值m(q+x)
。然后,服务器比较m(q+x)
和从客户端接收到的n(q+x)
。 - 如果
m(q+x)
和n(q+x)
相同,则服务器确认客户端确实拥有正确的会话密钥q
,并且认证成功。验证了拥有serverauthorized_keys
文件内公钥对应的密钥的客户端有相同的会话密钥,允许通信。