ssh的相关实现有unix/linux下的openssh以及windows下的putty。
登录方式之一:口令方式
通常所说的账号密码的形式
1)client发送请求
2)server将自己的公钥发给client(client会记录相关server的公钥,存放地点是自己的~/.ssh/known_hosts文件中)
3)client将自己的密码使用server的公钥加密后发给server
4)server用自己的私钥解密client的密码,从而实现对client登录的管理。
这种方式会受到“中间人攻击”,中间人可以在骗取client的密码后再去欺骗式登录server。
登录方式二:密钥方式
1)client将自己的公钥放到server上(~/.ssh/authorized_keys文件),从而获得授权。
2)client发含有自己公钥的请求
3)server判断client的公钥是否属于授权client。属于的话,server会接着测试client的公私钥对:用client的公钥加密message给client,client用私钥解密message后返回server。
这样通过测试client的公私玥对来实现对client登录的管理。
第二种方式规避了“中间人攻击”,也就是说中间人不可能同时欺骗client和server,因为中间人无法获取到client的私钥。但是中间人可以骗到client,原因和第一种方式是一样的:client无法判断收到的server的公钥的真假。
我们在登录ssh server时,第一次都会弹出一个"Are you sure you want to continue connecting (yes/no)?",其实这就是将真假的判断的重任甩给用户自己了。