常见的身份验证的流程
记录常见的三类需要身份验证的场景中进行身份验证的步骤
下载文件
从网上下载的文件,我们怎么保证这个文件在网络传输途中没有经过修改呢?或者我们怎么保证这个文件的确就是其作者发布的呢?
校验和
常见的校验和算法有 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
文件中),那么就会跳过让用户确认指纹的步骤,如果没有,则会弹出提示让用户确认。