serverhostkey缓存阶段
需要:
-
服务端host密钥对
流程:
-
服务端发送public server host key 公钥
-
客户端提示警告(如果客户端没有缓存过接受的public server host key)是否继续,情况如下:
-
如果是未访问的服务,说明第一次建立通信
-
如果是访问过的服务可能是中间人攻击
-
会话建立阶段
需要:
-
临时密钥生成算法,可由参数 HostKeyAlgorithms 指定,用于两端生成临时密钥对
-
共享安全密钥生成算法,可由参数PublickeyAcceptedKeyTypes指定,用于两端生成相同的session key
-
客户端临时密钥对
-
服务端临时密钥对
流程:
-
客户端发送ssh会话请求(协商加密算法等)
-
服务端发送public server key给客户端(响应加密算法)
-
客户端向服务端发送public client key给服务端,此时密钥情况:
-
客户端:public client key、private client key、public server key
-
服务端:public server key、private server key、public client key
-
客户端和服务端具备了生成同一个key(也就是对称加密密钥)的能力
-
-
生成对称加密密钥session key(也叫共享安全密钥)进行加密通信
完整性会话建立阶段
需要:
-
服务端host密钥对
-
客户端缓存public server host key公钥
流程:
-
服务端生成exchange hash,并用host 私钥加密
-
客户端host公钥解密,自己再以相同的方式生成exchange hash,与发过来的对比
注:
-
此过程客户端校验服务端信息
-
客户端校验服务端的信息就是,服务端生成exchange hash所利用到的信息
身份验证阶段
密码登录
需要:
-
服务端密钥对
流程:
-
客户端发送ssh登录请求
-
服务端发送公钥
-
客户端接受公钥并加密密码,发送
-
服务端接受到密文,用私钥解密获得密码,进行验证
密钥登陆
需要:
-
客户端有登录密钥对
-
服务端有登录密钥对的公钥
-
暂且称登录密钥对为login key与之前的临时密钥对和session key(共享安全密钥)做区分
流程:
-
客户端发送ssh登录请求
-
服务端生成随机数A并用login key公钥加密成密文A
-
客户端公钥解密得到随机数A,生成摘要digest = sessionkey + 随机数A(使用md5加密)
-
服务端以相同的方式生成摘要与客户端发过来的摘要做对比
ssh安全性理论研究
中间人攻击以及ssh防御措施
条件:
-
hostkey缓存阶段,服务端在没有发送public host key到客户端之前均可攻击,一旦客户端接收到了public host key,攻击条件丧失,原因如下:
-
在接下来的完整性会话建立阶段,中间人没有private host key,因此无法对生成的exchange hash进行加密
-
ssh防御措施:
-
hostkey缓存阶段的提示
暴力破解密钥登陆
条件:
-
获取某一用户的login公钥
爆破:
-
网上下载密钥对,进行login公钥对比,查看哪个密钥对匹配
-
读取密钥对的私钥,进行登录