随着 iOS/iPadOS 16.3 的推出,我们现在也可以使用安全密钥对自己的 Apple ID 用上额外的安全保护了。不过对于大多数的人来说,可能对于安全密钥的了解程度最多停留在银行发的 U 盾上。

来源

而我在去年撰写了通行密钥的上手体验以后,就展开了对 FIDO 和对应的 WebAuthn 这两个开源认证服务背后其他技术细节的研究,所以借此机会我也想和大家介绍一下什么是安全密钥以及它和我们之前所介绍的通行密钥、银行 U 盾有什么不同。

什么是安全密钥

知名的安全密钥品牌 YubiKey 旗下的产品

大多数安全密钥从外形来看,长得就像日常的使用 U 盘,所有的认证信息会直接保存在安全密钥上。

和 U 盘不一样的是,安全密钥只能写入认证信息,任何人或程序都不能从安全密钥中读取数据。基于只写不读这样的特性,安全密钥常常会被用于加密、替代密码或是进行多因素认证

一个安全密钥可以同时承载不同的加密协议,比如:通行密钥采用的协议 FIDO、常用于加密邮件和文件的 PGP 协议、一次性加密 OTP 协议、通用两步认证 U2F 协议1以及 PIV 智能卡等等。

YubiKey 产品所支持的加密类型

除了这些比较通用的加密协议,我们日常生活中见到的安全密钥大部分都是和私有加密协议,比如软件的加密狗、银行给的 U 盾、财务税控盘、动态口令卡或是动态密码器等。当然,受限于文章篇幅,我也不打算对这类产品详细展开,大家只要类似的产品其实也是安全密钥就好。

我们为什么还需要安全密钥

验证码,或者更严谨地说是两步认证2可以在别人即使知道密码的情况下依然阻止他们访问你的账户。

两步验证 两道大门

关联阅读:《给你的网络账户安全来次升级,两步验证全面指南》

大家可能觉得既然有了短信验证码,或是应用内二维码,或是有了基于时间的一次性密码3,似乎就没必要用安全密钥了。但这个想法实际上并不对,不然银行也没必要给每一个打开网银的用户配上一个 U 盾了。

短信 SMS 作为目前广泛用于双重认证,甚至在不少服务中是登录时的唯一凭证。但作为 1986 年就定义的协议,时至今日 SMS 早就已经落伍了,关于 SMS 通信通道不安全的研究已经有很多了,利用 GSM 劫持和短信嗅探进行电信诈骗的案例也比比皆是。所以它虽然方便,但从安全的角度来看短信确实不适合作为首要(甚至是唯一的)双重认证的手段。

不少网站和服务都会采用基于时间的一次性密码 TOTP,TOTP 确实要比短信来得安全得多。首先,与传统的静态密码相比,TOTP 动态生成的一次性密码更加安全,因为它只在特定的时间段内有效,并且生成过程基于共享的密钥和相同的时间,而共享的密钥只会在初次设置时进行交换。

What is a Time-based One-time Password (TOTP)? | Twilio
TOTP 实现原理

其次,实现 TOTP 技术因为不需要专门的硬件,所以实现成本很低,用户使用时只需要安装一个支持 TOTP 的软件即可,无论是智能手机、可穿戴设备或是电脑上都有对应的软件可以选择。最后,TOTP 对于网站和服务来说也非常便于接入到身份验证系统中,因此 TOTP 支持得非常广泛。

但 TOTP 也有自己的局限,TOTP 最大的问题就是不能抵御中间人攻击4,在 MitM 攻击中,攻击者会在通信的两端之间插入自己的设备,以拦截、篡改和窃取数据。如果用户正在遭受 MitM 攻击,攻击者不仅会伪造一个有用户名和密码的登陆框,还会伪造一个看起来像身份验证令牌的页面,要求用户输入他们的令牌信息。然后,攻击者可以使用这些信息欺骗真正的身份验证服务器,并成功访问用户的帐户。

除了不能抵御 MitM,使用 TOTP 的步骤我也觉得有点麻烦。首先就是输入麻烦,如果用密码管理工具快速填充密码的话,往往还需要单独打开一个 TOTP 的软件手动输入那一串验证码;如果把 TOTP 同样保存到那个密码管理工具,不免有把「鸡蛋都放一个篮子里」的嫌疑。

这时候随着银行卡一起给我的银行 U 盾给了我新的灵感,在大额转账的时候只需要点一下 U 盾上的按钮就可以完成身份验证,可以说是非常方便。而和 U 盾类似的安全密钥自然就成为了我替代传统 TOTP 的方式。

安全密钥有哪些特点

用安全密钥存储和生成一次性密码的方法也被称为 U2F(通用第二因素),基于安全密钥「软件只能写入密钥但不能读取密钥」的特性, U2F 也能有效地抵御 MItM 攻击。

和通行密钥其实有点像

当我们使用安全密钥进行认证的时候,网页会首先发送一个「挑战(challenge)」给安全密钥,安全密钥会根据内部存储的私钥(可以理解成信箱的钥匙),解开这个「挑战(challenge)」并把对应的结果返回给服务器。无论是谁都看不到放在安全密钥的私钥,而服务器上只有正确的公钥加密的信息才可以被私钥解锁,因为投递人只有知道那个信箱是你才能把信寄给你。

关联阅读: 不用密码但不能代替密码:通行密钥如何让登录这件事更简单?

除了更安全,安全密钥自然也有着使用方便的特点,在电脑平台上直接插入到 USB 接口中就可以让其他程序调用,身份验证时也只需要额外进行一次触摸即可。至于在移动上,除了插入接口进行认证,也可以在支持 NFC 的设备上扫描 NFC 进行验证。整个流程非常简单,就和使用银行 U 盾一样。

折腾一下微软Microsoft 无密码解决方案Windows 10 11 安全密钥FIDO2 U2F Edge二次验证-青州小熊
触摸一下就好

前面我们也提到过,安全密钥还支持存储多种不同的加密类型,如果网站或者服务不支持 U2F 的话,不少安全密钥,比如 Yubikey 旗下的产品也支持存储支持更为广泛的 TOTP,填写时也只需要简单触摸一下安全密钥就可以自动填充。另外一些加密类型也可以在特定的场景下发挥作用,比如 PIV 智能卡可以用于替代门禁卡,OpenPGP 则是加密文件、邮件的常用方式。

直接挂在钥匙串上,来源

安全密钥小巧的体型也能算是它的一个优点,携带会非常方便;不过这其实也是一个缺点,小巧的体型也意味着容易遗失。如果设备丢失,不仅需要需要重新配置身份验证过程,还有可能被身份认证挡在门外。所以如果要使用安全密钥除了 FIDO2 以外的加密类型的话,我的建议是多准备一个安全密钥进行备份;而 FIDO2 作为实现通信密钥的基石,可以使用身边的手机和其他支持的软件额外进行设置。

借助 FIDO2 让手边的设备成为另一个安全密钥

安全密钥虽然有着众多的加密类型,但也不是万能的,如果网站只愿意使用 SMS 或者私有认证方式进行两步认证的方式的话,安全密钥自然也帮不上忙;安全密钥的使用成本也不低,毕竟一次就要买 2 个,如果丢失的话也需要再次入手,对于大部分人来说确实不那么值得。

不过,目前来看安全密钥也算是解决了我此前使用软件 TOTP 时的种种不满,顺便还让一部分账户变得更为安全了。

如何使用安全密钥

如果你手边已经有安全密钥了(最好有多个),那么接下来就来说说使用方面了。安全密钥目前支持 Windows、macOS、iOS、Android 以及主要 Linux 发行版在内的众多系统,也支持在 Chrome、Edge、Firefox 以及 Safari 等主流浏览器中在线使用。

不过考虑到不同的密钥支持不同种类的加密类型,所以我也就根据我自己常用的几个场景向大家介绍如何使用安全密钥。

安全密钥本身就支持通信密钥采用的 FIDO2 协议,所以支持使用通信密钥进行登录或者两步认证的网站也都是可以录入安全密钥的。

关联阅读:《无密码、更安全的未来,你该如何登录?通行密钥上手体验》

除了 FIDO2,U2F 则是另一个使用更为广泛的加密类型,不过正如前面所说的那样只能用于两步认证,如果你之前在添加通信密钥的时候见到了下面这样的画面,那就意味着这个服务和网站采用的是 U2F 加密类型。比如 1Password 目前就只能接受传统的安全密钥,又比如 Apple 在 16.3 中推出的 Apple ID 安全密钥机制也是如此。大家可以参阅 Yubikey 官网的相关信息以进一步确认兼容性。

不过目前 1Password 已经确认会在未来支持通信密钥登录

不少安全密钥也支持存储 TOTP 的相关数据,虽然安全密钥本身并没有电池,内部也没有时钟,但安全密钥可以通过本身存储 TOTP,并借助手机、电脑供电和提供的时间传出不同服务的验证码。这种方式相比于直接存储在软件本地更为安全,且在不通过网络的前提下依然也能在多个设备之间同步;但这种方法也存在着一些弊端,比如:安全密钥可以保存的 TOTP 数量比较少等。

比如 Yubikey 就需要借助 Yubico Authenticator 完成 TOTP 的读取

除了用于网页服务的认证,安全密钥被广泛应用于其他的身份认证场景中,在我日常使用中最常见的场景还是 SSH 身份验证。SSH 身份认证有多种加密类型可以使用,目前来看最简单的方法还是 U2F 加密。具体实行的步骤也很简单,在安装了 OpenSSH 的电脑上执行如下步骤:

# 生成密钥对,加密方法采用的是更为现代的 ed25519-sk 算法,保存在当前目录下,并设置注释

ssh-keygen -t ed25519-sk -f ./sshkey -C sshkey


# 将对应的公钥传输到服务器上

ssh-copy-id -i ./sshkey.pub root@10.0.20.1


# 登陆到服务器时,需要连接安全密钥,并调用对应的私钥

ssh -i ./sshkey root@10.0.20.1

同理,也可以为 Github 等在线 Git 工具设置 SSH 密钥,并在使用时通过安全密钥验证。

我为什么选择了 Yubikey

市面上的硬件密钥有很多不同的品牌,但是在我收集了一些使用感受以后,我最后还是购买了 YubiKey。在我看来 YubiKey 有着以下的优点:

  • 支持的协议广泛:我能想到的加密协议,YubiKey 基本都支持
  • 兼容性好:只要服务提供的是受支持的加密协议,YubiKey 基本都能绑定成功
  • 耐用性好:Yubikey 官方宣传的是能承受一定程度的挤压和磨损,且具备一定的防水能力
  • 简单易用:即使不经过官方初始化,也可以直接使用;初始化流程简单。
  • 生态丰富:本身固件开源,有不少第三方插件。

Yubikey 也提供了不同的类型的硬件密钥,我购买的就是支持 NFC 的 USB-C 型硬件密钥 Yubikey 5C NFC,可以在我手边的所有设备上使用。我手边的设备都有一个 USB-C 口,而在 iPhone 上则可以通过 NFC 扫描读取。

如果你还想在不支持 NFC 读取的 Lighting 接口的 iPhone、iPad 上使用的话,Yubikey 5Ci 可能是一个不错的选择。如果非要在只有 A 口的设备上使用的话, YubiKey 5 NFC 是一个不错的选择。而想要小巧的体积,YubiKey 5 nano 和 5C nano 不容错过。但无论是哪种都可以挂在钥匙串上,只要记得带钥匙就不会忘。

另外就是不要忘记准备第二个硬件密钥,两个安全密钥之间可以品牌、型号完全不一样,只要他们支持相同的协议即可。

以上就是本文的全部内容了,希望这篇文章可以在未来帮助到你。

> 下载 少数派 2.0 客户端、关注 少数派公众号,解锁全新阅读体验 📰

> 实用、好用的 正版软件,少数派为你呈现 🚀