一日一技 | 用 LaunchBar 等启动器快速输入双重认证密码
如果我们仅仅使用密码保护网络账户的安全,风险往往很高。一旦密码泄漏,则账户危矣。为了避免此类风险,如今很多网站都提供了不同的双重验证 (2-Factor Authentication) 的方案。例如在新设备上登入 Apple 账号,会在其它注册了此账号的 Apple 设备上弹出登录信息,确认之后会显示一个六位数字的临时密码,我们需要把这个临时密码填入新设备中,即可验证成功。
还有一些其它的双重验证方案,例如发送验证码短信、验证码邮件。除此之外,还有一种非常常见的方案,即在验证了用户名和密码后,系统提示用户输入一个随时间变化的一次性密码(通常也是一组六位数字)进行额外验证,如 Google、GitHub、Amazon、PayPal、Outlook 等网站都提供了这种双重验证方案:
为此我们需要在手机上安装一个身份验证器,如 Microsoft Authenticator、Google Authenticator 等,来生成这个一次性密码:
虽然保证了安全性,但操作上难免略显繁琐,每次在电脑上登录账号时,还需要解锁手机查看临时密码。本文以 LaunchBar 为例,介绍一种可以直接在电脑上生成并查看此密码的安全的方法,这个方法也可以直接套用在 Raycast、Alfred 等其它启动器或自动化工具中。
如果你还没使用过双重验证,本节以国区亚马逊为例,简述开启双重验证的流程。其它支持此类双重验证的网站的操作与此类似。
在登录了国区亚马逊之后,进入 我的帐户 → 登录与安全 → 两步验证设置 页面,点击 开始。
在出现的 注册两步验证器 页面,选择 认证器应用程序。第一步提示需要在手机上安装一个验证器并打开,这里亚马逊推荐了 AWS Virtual MFA、Google Authenticator、Microsoft Authenticator 三款。
然后用验证器程序扫描出现的二维码,就可以把一个亚马逊自动生成的共享密钥添加到验证器中。之后就可以在验证器中看到新增了一行六位数字密码,且每 30 秒更新一次。
将对应出现的六位数字密码输入到第三步的密码框中,点击确认,就完成了注册验证器。
如果选用的验证器不支持扫描二维码,则可以点击二维码下方的 无法扫描二维码,将出现的密钥手动输入到验证器中以完成注册。此密钥即是二维码中所保存的信息,我们此时不妨先把它复制粘贴到一个文本文件中,用于之后使用。
为什么使用不同的验证器都可以生成这个一次性密码呢?要解释这个问题,我们先要了解一下在使用此类双重验证登录账号时到底发生了什么。
以上节的国区亚马逊为例,你输入用户名和密码,并用手机端的验证器通过 TOTP 算法生成了临时密码,将它提交给服务器。服务器随即也运行 TOTP 算法得到临时密码与你输入的内容进行核实,如二者一致,则登录成功。
这里提到的 TOTP 算法,全称是「Time-based One-Time Password」,即「基于时间的一次性密码算法」。它是一种根据预先共享的密钥与当前时间计算一次性密码的算法,此处用到的密钥即是上一节中通过扫描二维码或手动输入保存在验证器中的密钥。这个算法要求手机与服务器上的时间大致同步,因此默认是每 30 秒更新一次。
TOTP 算法是一项互联网标准算法,也就是说,其实各种验证器中集成的都是相同的算法,因此,只要在不同验证器中以及服务器中保存的密钥相同,在同一时间间隔 (30 秒) 中算出的密码也就是相同的。
因此,这种算法的本质是,为了避免用户自己设定的密码泄漏,由服务器自动生成了一个足够长足够复杂的第二密码给用户,而用户在双重验证时不需要输入直接输入这个复杂的第二密码,而是输入这个密码与当前时间相结合计算得出的一个短密码进行验证。同时,也不可能从得到的短密码与当前时间反推出真实密码,以保障此密码的安全。
因此,服务器生成的密钥是整个双重验证的安全性的关键所在。如果此密钥一但被除用户和服务器以外的第三方得到,则双重验证就失去了意义。这也就是为什么在很多网站中一旦开启双重验证并绑定了验证器之后,通常无法再在账户设置中看到这组共享密钥。这也是为什么很多用户对可以在云端同步双重验证账号信息的验证器存在质疑,因为在云端同步密钥需要另外把密钥存放在第三方的服务器上,大大增加了密钥被窃的风险。
其实过去在生活中还有另一个 TOTP 密码的应用实例,即下图所示的网上银行口令令牌。其中也储存着网银服务器生成的密钥,结合它与当前时间通过 TOTP 算法计算出六位数字显示在上面的显示屏上。但常见的口令令牌的更新间隔是一分钟,这可能是由于口令令牌上的本地时间与服务器上的时间更容易产生较大的偏差,因此需要放宽更新间隔以容错,毕竟口令令牌不能像智能手机一样实时在线校正本地时间。
了解了上述原理,我们不难想到,如果我们在电脑上有一个实现 TOTP 算法的软件,就可以直接在电脑上生成双重验证密码了,如果能把这个软件与启动器相结合,就可以直接在我们常用的启动器中查看此密码。恰好有一个命令行工具可以优雅地实现这个功能:oathtool
。它是工具包 OATH Toolkit 中的一个命令行工具组件,此工具包提供了用于构建一次性密码验证系统的各式组件。
要使用它,首先需要我们在终端(Terminal)中通过 Homebrew 来安装这个工具包,输入下列命令并回车以完成安装:
brew install oath-toolkit
完成安装之后,我们可以在终端中尝试通过用以下命令使用它:
oathtool --totp --base32 "你的密钥"
将命令中「你的密钥」四个字替换成上面生成的密钥,就可以得到六位数字,而这六位数字与手机上的验证器生成的数字一致。
上述实验成功后,我们就可以借助 oathtool
制作一个 LaunchBar 动作,其核心功能通过一个简单的 Shell 脚本实现。
1. 通过 LaunchBar 启动 Action Editor;
2. 通过快捷键 ⌘N
新建一个动作,起个便于记忆的名字,如「2FA | Amazon.cn」,意为「国区亚马逊的双重验证码」:
3. 点击窗口右侧上方的 Scripts 标签页,脚本类型选择 Shell Script,并仅勾选 Returns result 一项:
4. 点击脚本类型 Shell Script 右边的 Edit 按钮,对脚本进行如下编辑:如下图所示,脚本中的前四行是注释 (以及 Shebang 信息) ,不用修改,我们将后面的默认内容删除,并粘贴入如下内容,同样,需要将「你的密钥」替换成之前保存的密钥:
oathtool_path=/usr/local/bin/oathtool
echo `$oathtool_path --totp --base32 "你的密钥"`
添加的两行中的第一行,将 oathtool
的绝对路径用变量 oathtool_path
表示,这是因为 LaunchBar 脚本中需要尽量使用第三方命令行工具的绝对路径,以防 LaunchBar 找不到该命令行工具的位置。在第二行中,将之前使用的 oathtool
命令的结果通过命令 echo
输出出来。在 LaunchBar 中,echo
输出的命令会直接显示到 LaunchBar 界面上。
这样,这个动作就初步制作完成了。你可以尝试在 LaunchBar 中调用这个动作,并把得到的结果与手机上的验证器的结果相比较,当然,它们一定是一致的。
然而此时制作的动作还有一个很大的问题,就是我们直接把密钥明文写在了脚本中,这会导致密钥泄漏的风险。例如如果你会把常用的 LaunchBar 动作在 GitHub 分享的话,无意中上传了包含明文密钥的文件可谓是极不明智。为了避免这种风险,我们需要把常用的密钥放置到特定文件夹中进行统一管理。
例如,我在 家目录 (即与 桌面、文档 等文件夹平级的位置) 中建立了一个名为「Keys」的文件夹,把密钥全都放在这里。在这种情况下,我们可以把上面的密钥保存在这个文件夹中的一个文本文档中,对其命名为「amazon.cn.txt」。在这种情况下,我们制作的 LaunchBar 动作的脚本需要做一个小的调整,把上面提到的两行脚本内容修改为以下的三行内容:
oathtool_path=/usr/local/bin/oathtool
key=`cat ~/Keys/amazon.cn.txt`
echo `$oathtool_path --totp --base32 "$key"`
其中,在粘入的第二行我们可以看到,我们通过 cat
命令读取了文件 ~/Keys/amazon.cn.txt
中的内容,即我们的密钥内容,并用变量 key
代替。再在第三步中通过 oathtool
命令计算出当前时间下的六位密钥。
这样,我们就可以安全地分享我们的动作而不用担心在分享动作的时候把密钥泄漏了。
可能你会觉得,把密钥以明文的方式保持在本地,也不是一个安全的方式。如果这个文件被别人拷贝走了,仍然有泄漏的风险。那么在这一节中,再介绍一个对在密钥进行加密的方式,以保证这个文件只有在你的电脑上可用,在别人的电脑上无法使用或破解。
这里需要借助一个操作简便的加密脚本 sshenc
。这个脚本提供了一个借助 SSH
的公钥和私钥进行 非对称加密 的方法。所谓的非对称加密,简单来说,是指加密和解密使用不同的密钥文件,一把作为公开的公钥,可以发送给给你发送信息的人,他用公钥来对信息进行加密,另一把作为私钥,由你在本地保存好,对信息进行解密。如果没有私钥的话,加密的信息就无从破解。在本文的使用中,我们用你电脑中的公钥进对前文中的双重验证密钥进行加密,由于用于解密的私钥只存放在你当前的电脑上,所以只有当前这台电脑可对加密内容进行解密。要实现这个过程,我们需要两项准备工作,一是生成 SSH
公钥和私钥,二是下载加密脚本 sshenc
。
SSH
公钥和私钥这组公钥和私钥,我们通过 SSH
工具来自动生成。SSH
是一种加密的网络传输协议,最常见的用途是远程登录系统,人们通常利用 SSH
来传输命令行界面和远程执行命令。这里我们只用它来生成在公钥和私钥。
当然我们需要首先来检查一下你的电脑上是不是已经存在 SSH
的公钥和私钥。这两个文件保存在 ~/.ssh/
目录中。我们可以直接在终端中输入 ls ~/.ssh
来列出此目录中的内容,其中 id_rsa.pub
和 id_rsa
分别就是公钥和私钥文件。
如果没有看到这两个文件,则表明你的电脑上还没有生成过这组密钥。此时你只需要在终端中接着输入 ssh-keygen
并回车来生成它们。在生成过程中会遇到几个问题,在每个问题后面直接回车即可以选择默认选项。运行结果如下:
此时再运行之前的 ls ~/.ssh
命令就可以看到生成的公钥和私钥了。
sshenc
接着我们需要下载 sshenc
脚本并放置在合适的位置,我把它放在了家目录下的 Scripts
文件夹中,即 ~/Scripts
中。只需运行以下四行命令即可:
mkdir ~/Scripts
cd ~/Scripts
curl -O https://sshenc.sh/sshenc.sh
chmod +x sshenc.sh
这四行命令的作用分别是:
~/Scirpts
,之后这个文件就下载在 Scripts 文件夹中可供使用了。使用方法在其 官网 上有详细说明。我们用到的是如下两条:
加密:
sshenc.sh -p ~/.ssh/id_rsa.pub < 待加密文件.txt > 生成的加密文件.txt
解密:
sshenc.sh -s ~/.ssh/id_rsa < 加密文件.txt
通过上面的加密命令,我们可以把亚马逊提供的密钥 ~/Keys/amazon.cn.txt
进行加密并保存在另一个文件中,我们把这个文件也放在目录 ~/Keys/
中,命名为 amazon.cn.encrypted.txt
,命令如下:
~/Scripts/sshenc.sh -p ~/.ssh/id_rsa.pub < ~/Keys/amazon.cn.txt > amazon.cn.encrypted.txt
加密之后,我们可以在 Keys
目录中查看新生成的 amazon.cn.encrypted.txt
文件,这个文件只能通过你电脑上的 SSH
私钥进行解密,也就是说,离开了你的电脑,则其被加密的信息是无法还原的。而此时我们已不再需要明文的文件 amazon.cn.txt
了,可以把它直接删除。
现在我们需要在制作的 LaunchBar 动作的脚本中对加密的密钥文件进行解密,只需把之前写好三行内容修改为以下五行:
oathtool=/usr/local/bin/oathtool
sshenc=~/Scripts/sshenc.sh
encrypted_secret_key=~/Keys/amazon.cn.encrypted.txt
key=`$sshenc -s ~/.ssh/id_rsa < $encrypted_secret_key`
echo `$oathtool --totp --base32 "$key"`
其中第二行定义了加密脚本 sshenc
的位置,第三行定义了加过密的亚马逊密钥的位置,第四行使用解密语言对加密密钥进行解密,再在第五行中求得双重验证码并显示出来。
至此,我们就制作完成了一个比较安全的生成双重验证码的 LaunchBar 动作。要为其它账号也生成双重验证码,只需要修改脚本中的第三行,将它改成相应的加密密钥文件的路径即可。
这个 LaunchBar 的脚本当然也可以用运到其它的启动器等自动化工具中,下图是一个 Raycast 的例子:
在这个动作中,使用了相同的脚本,只需参考其模板脚本在脚本开头进行参数配置即可,具体的配置方法可参照 这篇文章。
本文介绍了常见的双重验证的使用方法和其背后的原理,同时其中也分享了在电脑端生成此类验证码的方法。并通过这个方法制作了一个 LaunchBar 动作,同时,用相同的脚本也可以给不同的自动化工具制作相应的动作。最后介绍了一个对明文文件进行加密的方法。希望大家能从中得到一些小的收获。
> 下载少数派 客户端、关注 少数派公众号,发现更多实用小技巧 ⚙️
> 特惠、好用的硬件产品,尽在 少数派 sspai 官方店铺 🛒
© 本文著作权归作者所有,并授权少数派独家使用,未经少数派许可,不得转载使用。
LaunchBar 是 macOS 下最优秀最强大的启动器之一。美观而简约的界面集成了上千种功能,能够使 Mac 的日常操作变得更加流畅便捷、随心所欲。然而在中文世界却极少有深入详尽的相关教程。本专栏为了填补这一空缺,致力于分享各种易学实用的 LaunchBar 使用技巧。