SSH密码登录:防止中间人窜改公钥?消灭网络小三的办法!

zblog2年前技术蜜糖35

ssh 密码登陆密码登录认证原理: client客户机向server发送登录请求,server服务器将自己的公钥发送给client(客户机)。 client使用这个公钥,将公钥进行加密,然后再发送给server。 server用私钥解密登录密码,验证合法性。 server返回验证结果为client。 这个流程中存有的一个问题,怎么保证收到的公钥就是目标server的公钥? 密码登录时需要注意:中间人攻击,所以如果一个攻击者中途拦截了client的登录请求,发送自己的公钥给client,client端就会用攻击者的公钥进行数据加密,攻击者接收到信息之后,用自己的私钥就可以进行解密了,这就窃取了client的登录信息了。 为了解决这个问题,client端第一次登录的时候,会进行一个登录公钥确认。 接下来讲:怎么防止中间人窜改 公钥


在SSH的密码登录认证过程中,确实存在中间人攻击的风险,即攻击者可能冒充服务器向客户端发送伪造的公钥。为了防止这种攻击,SSH提供了一些机制来验证服务器的公钥。

登录公钥确认通常指的是SSH客户端如何确认接收到的公钥确实是来自目标服务器的公钥。以下是该过程的详细描述:

  1. 首次连接时的公钥指纹确认

    • 当客户端首次尝试连接到服务器时,服务器会将其公钥发送给客户端。

    • 客户端会显示这个公钥的指纹(通常是一个哈希值,如SHA-256指纹)。

    • 客户端的用户(或管理员)需要通过某种方式(如先前从服务器管理员那里获得的指纹)来验证这个指纹是否正确。

    • 如果指纹正确,用户可以选择接受这个公钥,并将其存储在客户端的known_hosts文件中。这个文件通常位于用户的家目录下(例如,在Linux上是~/.ssh/known_hosts)。

    • 在未来的连接中,客户端会使用known_hosts文件中的公钥来验证服务器的身份。

  2. 后续连接的公钥验证

    • 当客户端再次尝试连接到服务器时,它会从known_hosts文件中获取之前存储的公钥。

    • 服务器会再次发送其公钥给客户端。

    • 客户端会将服务器发送的公钥与known_hosts文件中的公钥进行比较。

    • 如果两个公钥匹配,则连接被认为是安全的,并且可以进行下一步的身份验证。

    • 如果公钥不匹配,客户端会发出警告,并询问用户是否要继续连接。这通常是一个强烈的信号,表明可能存在中间人攻击。

  3. 防止中间人攻击的额外措施

    • 使用SSH密钥对(而不是密码)进行身份验证,可以提供更强的安全性,因为私钥在本地客户端上,不会被明文传输。

    • 使用SSH密钥代理(如ssh-agent)可以进一步保护私钥的安全性。

    • 在可能的情况下,使用SSH连接时,始终检查服务器的公钥指纹是否与预期的匹配。

    • 使用SSH的严格主机密钥检查功能(StrictHostKeyChecking)可以确保在公钥不匹配时自动拒绝连接。

    • 考虑使用SSH证书或SSH密钥认证代理(如ssh-cert-authority)来集中管理服务器的公钥,以提高安全性和可管理性。


相关文章

java中 DBCP、C3P0、 BonecP、 Druid

在Java中,DBCP、C3P0、BoneCP和Druid都是流行的数据库连接池(Database Connection Pooling)实现。数据库连接池是管理数据库连接的缓存池,用于复用数据库连接...

ai提示词prompt 001长尾关键词 json

ai提示词prompt 001长尾关键词 json

你是一个专业的用户行为分析专家,根据给定的关键词,分析出2个用户可能需要进一步了解的相关长尾关键词,'并返回json格式示例:{"keyword1": "关键词1...

windows10开机不自动启动iis的设置方法

windows10开机不自动启动iis的设置方法按Win 和R,打开运行窗口。输入services.msc确定打开服务窗口。找到World Wide Web Publishing Service禁用并...

response.text msg = response.text.encode("gbk", errors="replace").decode("gbk") 编码 python

response.textmsg = response.text.encode("gbk", errors="replace")....