文章

常见的身份验证的流程

记录常见的三类需要身份验证的场景中进行身份验证的步骤

常见的身份验证的流程

下载文件

从网上下载的文件,我们怎么保证这个文件在网络传输途中没有经过修改呢?或者我们怎么保证这个文件的确就是其作者发布的呢?

校验和

常见的校验和算法有 MD5,SHA1,SHA256,SHA512 等。

有些软件官网会提供软件安装包的校验和,把文件下载下来之后一对比就可以了。

Windows 可以在终端运行

1
certutil -hashfile <filename> sha256

如果要使用不同的算法,修改 sha256 即可。

PGP 签名文件

顾名思义了,就是软件作者生成一对公私密钥,然后用私钥对文件进行签名,生成一个签名文件,并公示出来。我们用户下载到同样由作者公示出来的公钥后,验证一下即可。

在 Windows 上使用 Gpg4win,首先生成一对自己的密钥。从官网上下载到公钥文件后,导入到 Kleopatra 中,这一过程需要我们对这个公钥进行认证。在官网上找到作者公示的公钥的指纹(即公钥文件的 MD5 哈希值,比公钥本身短,更方便对比),与 Kleopatra 上显示的指纹进行对比,如果一致,则可以认为这个公钥是作者的公钥,于是用自己的私钥认证。

认证完成后,使用 Kleopatra 的验证功能,验证前面下载的签名文件(与下载的软件安装包文件在同一目录),如果有效且可信,则可认为该文件的确是作者发布的,且没有被修改。

远程登录

远程登录是另一个常见的需要身份认证的情况。以 SSH 为例。

密码认证

当我们输入 ssh user@192.168.11.5 之后,本地主机先向地址为 192.168.11.5 的远程主机发送一个连接请求,远程主机收到后,会把它自己的公钥发过来,此时本地主机界面上会显示不认识这个公钥文件,并且展示出该公钥文件的指纹,让我们核对,此时我们应该通过其他途径获取到该远程主机的公钥指纹,并进行对比,如果一致,则可以认为该公钥的确是该远程主机发送的,没有受到中间人攻击。

确认后可以输入 yes 保存该公钥和该远程主机地址,这样下一次就不用再重复确认了。

在我们输入登录密码之后,本地主机会用刚才从远程主机收到的公钥文件加密这个密码,然后发送给远程主机,远程主机收到后用自己的私钥解开,并对比密码是否正确,如果正确,成功建立连接。

密钥认证

我们在本地主机中先建立一对自己的公私密钥对,并通过一定的方式把自己的公钥添加到远程主机的 ~/.ssh/authorized_keys 文件中(比如先通过密码登录的方式等)。

当我们输入 ssh user@192.168.11.5 之后,本地主机先向地址为 192.168.11.5 的远程主机发送一个连接请求,远程主机收到后,会返回一段随机的字符串,本地主机用自己的私钥加密这段字符串,并发送给远程主机,远程主机用 ~/.ssh/authorized_keys 文件中记录的该用户的公钥解密,并与原字符串对比,如果一致,成功建立连接。

当然,如果是第一次连接这个远程主机,最开始也会有让用户自行认证公钥指纹的提示。

实际上,不管是密码认证还是密钥认证,每一次连接远程主机时,远程主机都会把自己的公钥文件发过来,如果本地主机发现自己之前有记录过这个公钥文件(在 ~/.ssh/known_hosts 文件中),那么就会跳过让用户确认指纹的步骤,如果没有,则会弹出提示让用户确认。

本文由作者按照 CC BY 4.0 进行授权