# 前言

Yubikey 也用了有几年了,刚好昨天买了个 Canokey,今天就到了,真好有空就顺便浅谈一下硬件密钥这类产品。

# 正文

# 为什么使用双因素验证

互联网发展至今,我们最常见的身份验证手段就是用户名 + 密码。大多数用户会对多个账户使用相同的密码,这么做最直接的问题就是当其中一个账户被入侵,其它账户就会面临相同的风险,并且有很多服务商是明文存储我们的密码的,密码泄露导致的其它经济风险会大大提升。从生物的本能上,人本身不擅长记忆复杂的长密码,所以密码管理器和硬件密钥应运而生。

这里会扯到一个东西 —— 2FA,也就是双因素验证。目前国内最常见的 2FA 就是手机验证码,这本应该是个可选项,但是在国内它几乎成了必选项。这就导致一些问题,比如:手机没带登录不了、手机丢了账号被盗...

那除了短信验证码还有没有其它 2FA 的方式,有的而且很多,只是国内不按套路出牌。比如 OTP/TOTP/HOTP、FIDO U2F。刚刚说的短信验证码也是 OTP 的一种,但是这种 SMS OTP 的形式它方便但是不安全,与之同理还有邮件验证。

  • HOTP:HMAC-based One-Time Password,基于 HMAC 算法加密的一次性密码,基于事件因素,是 IETF 公开的算法规范。
  • TOTP:Time-based One-Time Password,基于时间戳算法的一次性密码,基于时间因素,是 HOTP 的改良版。每个验证码的有效时间通常为 30 秒。

现在流行的是 TOTP,常见的使用方式就是安装一个身份验证器 APP,比如谷歌身份验证器、微软身份验证器、1Password 等。TOTP 确实比短信验证来的安全,也不需要专门的硬件,成本低,但是也有局限性,最大的问题就是不能抵御中间人攻击。

# 密码管理器

既然人记不住太多的复杂密码,那这件事就交给软件去做。让密码管理器保存你不同网站的账号密码,这时候密码想怎么复杂就怎么复杂了,然后可以选择在密码管理器中保存不同网站的 2FA。至于密码管理器本身的安全系数应该提到最高,建议使用硬件密钥作为密码管理器的 2FA。常见的密码管理器产品有:1Password、Bitwarden、LassPass 等等。其中 Bitwarden 有开源的实现方式,可以自己私有化部署,具体可以看我的这篇文章:Raspberry Pi4b 私有部署 Bitwarden,可以按照文章的部署方法部署到公网服务器上,也可以通过内网穿透的形式使用。

# 硬件密钥

外观上看,硬件密钥跟我们日常使用 U 盘差不多。但是硬件密钥只能写入认证信息,不能读取数据,特性就是只写不读。基于只写不读的特性,硬件密钥可以有效地抵御中间人攻击,这也就是所谓的 U2F。一般安全密钥支持多种不同的加密协议,比如:FIDO、OTP/HOTP/TOTP、U2F、PGP 等。使用上硬件密钥需要更多的成本,具体看选择哪一款。并且硬件密钥一般需要 2 个或者更多,因为需要有备份防止丢失。

下图是两款硬件密钥产品,上面的是 Yubico 推出的 Yubikey 5NFC,下面的是由清华大学一些师生开发的 Canokey。从外观上说 Yubikey 的做工更好,但是贵啊,现在淘宝的价格已经去到了 500 多了(前几年大概是 300 多,去年 cloudflare 开了一波 yubikey 的车,海淘回来大概 100 + 一个,幸亏我去年多搞了几个,现在小黄鱼上都涨价了,成理财产品了),而 Canokey 只需要 169,功能上的体验和 Yubikey 差不了太多,反正就是 Yubikey 廉价好用的替代。