我们谈论密码安全性时,我们在谈论什么?
密码的历史与安全性挑战
我们谈论密码安全性时,我们在谈论什么?
- 密码本身是什么
在通常意义上,我们定义密码时,依靠了几个维度的抽象:信息角度:密码本质上是一种信息混淆与干扰的手段。功能角度:密码能够将信息的获取限制在特定的范围内。信任角度:密码是信任关系的一种具体体现。
- 密码经历了什么样的演变
原始的密码:小范围的传播,方式充满了随机性和偶然性;部落的口头暗语、特殊约定的手势和图案古代密码:随着文明的发展,出现了更系统的密码形式,如古埃及的象形文字和古希腊的凯撒密码,利用字母替换或特定符号来保护信息。中世纪密码:在这一时期,密码用于军事和政治,发展出复杂的替换和转置密码,如维吉尼亚密码,增强了信息的安全性。近现代密码:第一次和第二次世界大战中,密码学迅速发展,像恩尼格码机的使用标志着机器化密码的新时代,强调了密码破解的重要性。信息时代:数字化时代引入公钥加密技术,如RSA算法(基于大数分解),使得安全通信成为可能,同时也促进了SSL/TLS协议的普及。未来趋势:如今,随着无密码技术的发展,如Passkey等,密码正逐步向生物识别和其他新型认证方式转变,继续适应不断变化的安全需求。
- 什么是脆弱的密码
密码的强度可以通过一些信息论的概念来衡量:熵(Entropy):熵是信息的不确定性度量,熵值越低,表示信息的可预测性越高。常见的字符串(如“123456”)具有较低的熵,因此在公共环境中关联度高,属于较弱密码。条件熵(Conditional Entropy):条件熵描述在给定某一信息的情况下,另一个信息的不确定性。如果某个字符串在特定上下文中频繁出现,其条件熵较低,意味着它更容易被猜测。信息增益(Information Gain):信息增益衡量使用特定信息所带来的不确定性减少量。如果某个字符串在公共信息中出现频率高,则其信息增益低,表明它无法有效降低猜测的可能性。频率分析:通过统计特定字符串在公共数据中的出现频率,频率越高的字符串被认为越脆弱,因为它们在密码猜测中的成功概率增加。这些指标共同衡量了一个信息在公共信息域中的孤立程度。孤立程度越高,意味着这个密码的强度越高,从而更有效地保护信息安全。
- 密码安全性和用户体验的矛盾
在密码管理中,安全性与用户体验之间常常存在矛盾,主要体现在以下几个方面:复杂性与易用性:强密码通常要求包含多种字符(大小写字母、数字、特殊符号),这使得密码变得复杂且难以记忆。用户往往倾向于使用简单、易记的密码,从而降低安全性。频繁更换密码的负担:安全最佳实践建议定期更换密码,但频繁更换会给用户带来额外的负担,许多人可能会选择重复使用旧密码,增加被攻击的风险。多因素认证的挑战:虽然多因素认证(MFA)大幅提升了安全性,但其实现过程可能繁琐,影响用户的登录体验。用户在需要快速访问时,可能会对多步骤验证感到不耐烦。密码管理工具的使用:虽然密码管理工具可以帮助用户生成和存储强密码,提升安全性,但这也可能导致用户对工具的依赖。如果用户忘记主密码或工具出现问题,可能会面临数据丢失的风险。安全提示的模糊性:我们很难衡量什么样的信息是不安全的,也就无法精确的给出密码安全性的提示
从历史来看,是什么导致安全性遭到破坏?
- 密码的脆弱性
LinkedIn 数据泄露 2012 LinkedIn hack(2012年):超过1.17亿用户的密码被泄露,其中大量密码为弱密码,导致黑客通过重复密码访问了其他平台的账户。Yahoo! 数据泄露 Yahoo! data breaches(2013年):由于密码重复使用,黑客在Yahoo!泄露的数据中获取了用户密码,并用于访问其他服务,如金融账户和社交媒体。
- 协议缺陷
POODLE 攻击 POODLE(2014年):利用SSL 3.0中的缺陷,允许攻击者解密通过该协议传输的数据。Heartbleed漏洞 Heartbleed(2014年):OpenSSL中的漏洞,攻击者可以通过该漏洞获取敏感数据,如加密密钥和密码。
- 软件漏洞和开发错误
EternalBlue 漏洞 EternalBlue(2017年):Windows系统中的漏洞被WannaCry ransomware attack勒索软件利用,导致全球大规模网络攻击。Apache Struts 漏洞 2017 Equifax data breach(2017年):导致Equifax数据泄露,1.43亿人的敏感信息被窃取。
- 用户行为与社会工程攻击
Twitter 黑客事件 2020 Twitter bitcoin scam(2020年):通过社会工程攻击Twitter员工,攻击者控制了多个高知名度账户(如比尔·盖茨、埃隆·马斯克)。
- 密钥管理与加密缺陷
SHA-1 弱化 SHA-1(2017年):谷歌成功证明了SHA-1的碰撞漏洞,促使行业逐步淘汰这一加密算法。Sony PlayStation 3 破解 PlayStation 3 Jailbreak(2010年):由于不安全的密钥管理,黑客能够破解PlayStation 3的安全系统并运行未经授权的软件。
- 硬件漏洞与物理攻击
Spectre 和 Meltdown Spectre (security vulnerability) Meltdown (security vulnerability)((2018年):影响全球几乎所有现代处理器的漏洞,允许攻击者绕过硬件隔离获取敏感数据。Stuxnet Stuxnet(2010年):该蠕虫通过物理介质(如U盘)传播,最终成功破坏了伊朗核设施的离心机。
- 供应链攻击
SolarWinds供应链攻击 2020 United States federal government data breach(2020年):黑客在SolarWinds的更新中植入恶意代码,影响了包括美国政府在内的大量企业和机构。
MFA:抵抗密码失效的层层加码
多重要素验证(英语:Multi-factor authentication,缩写为 MFA),又译多因子认证、多因素验证、多因素认证,是一种电脑访问控制的方法,用户要通过两种以上的认证机制之后,才能得到授权,使用电脑资源([1])([2])。例如,用户要输入PIN码,插入银行卡,最后再经指纹比对,通过这三种认证方式,才能获得授权。这种认证方式可以提高安全性。(From Wikipedia)
简单来说,MFA是在简单的用户+密码验证的安全性要求不能达到要求的情形下,引入其他安全因素进行身份的验证的手段。其本质是将信任风险分摊到更多的安全实体中,从而降低整体的安全风险。MFA实际上是一个非常宽泛的抽象概念,我们大体上可以从引入的外部因素类型来将其区分为这样几类:
- 知识因素(Something You Know)
- 孤立知识:例如一个额外的记忆密码、某些高危权限的recovery code
- 拥有因素(Something You Have)
- 手机令牌:OATH、手机验证码
- 硬件令牌:某些银行的U盾、专业的RSA Secure ID设备
- 智能卡:用户通过插入或刷卡的方式进行身份验证。
- 安全密钥:例如FIDO U2F或WebAuthn设备。
- 固有因素(Something You Are)
- 生物特征:指纹、人脸、虹膜、声纹等
- 地理位置因素(Somewhere You Are)
- 某些强位置校验的措施,例如不在某区域无法访问某些资源
- 行为因素(Something You Do)
- 用户行为分析:通过分析用户的操作习惯(如打字速度、鼠标移动方式)来验证身份,例如在用户眼里臭名昭著的reCaptcha
- 社交验证
- 好友验证:某些社交平台在异常登录时要求好友进行确认,属于社交验证。
排除某些硬性的限制性因素之外,在这些常见的外部因素中,OATH对于用户体验的侵入性是最微弱的,因为其可以不局限在某些特殊的物理设备上,允许我们通过多种可用的设备来进行验证,因而也是Web SSO中除去短信、邮箱验证码中最常见的一种。
OATH:HOTP&TOTP
如今,我们常用的TOTP(如Google Authenticator)应用,都是基于TOTP实现的密钥生成;TOTP算法是HOTP的改进,二者共同构成了OATH(Open Authentication)标准的算法基础,二者的核心思想是一致的:
- 双方共同声明的哈希算法H
- 预先分发的任意长度的密钥K
- 运算长度,记为d(决定最终数值长度)
- HMAC计算计数器C
HOTP
$$\text{HOTP\ 运算值} = \text{HOTP}(K, C)\mod 10^d$$计算计数器截留值:$$\text{HOTP}(K, C) = \text{truncate}(\text{HMACH}(K, C))$$截取首先是位于最小的四位MAC数值当中,截得之后用于作为回调数值,记为i:$$ \text{truncate}(\text{MAC}) = \text{extract31}(\text{MAC}, \text{MAC}[(19 \times 8) + 4:(19 \times 8) + 7] \times 8) $$引索数值i用于从MAC当中选中31位数,起始点为i + 1:$$\text{extract31}(\text{MAC}, i) = \text{MAC}[i + 1 : i + (4 \times 8) - 1]$$验证的过程中是一个对称过程,验证双方通过上述参数进行计算得出当前的HOTP/TOTP截留值,双方比对值是否一致(通常为服务端比对客户端的传入结果)
TOTP
相较于HOTP,TOTP将双方自主维护的计数器C替换为自$$T_0$$开始的时间戳;从而取得了一个客观的计数器变量,不需要考虑同步机制:$$TC = \min\left(\frac{\text{unixtime}(\text{当前时间}) - \text{unixtime}(T_0)}{TS}\right)$$相较之下,HOTP的意义是提供一个【安全验证的动态密码生成机制】,将Counter生成的工作交由更上层的协议去实现;TOTP则是一个标准的基于时间的动态密码协议,可以认为TOTP = HOTP over timestamp。OATH实际上将密码的风险分散到了两个维度上的多个环节,强化了每一环节的信息孤立性,从而提高了安全性:
- 密码的安全性:
- 种子密钥的安全性
- 每次生成的动态密钥的安全性
- 协议提供的安全性:
- 动态密码的有效性存在时间或外部因子的维度窗口,攻击者需要受到更多的限制
PassKey:走向无密码化(Passwordless)的未来
W3C WebAuthn
Web 身份验证( WebAuthn ) 是万维网联盟(W3C) 发布的Web 标准。 WebAuthn是FIDO联盟指导下的FIDO2项目的核心组件。 ([ 4 ])该项目的目标是标准化一个接口,用于使用公钥加密技术对基于 Web 的应用程序和服务进行用户身份验证。 WebAuthn 凭证(本身就是 FIDO 凭证)有时称为密钥。 (From wikipedia)
典型的WebAuthn验证过程:
Registration

- 用户输入可能的用户ID,发起注册流程,前端携带此信息传递到服务端
- 按照约定,服务端随机生成一个挑战(Challenge)信息,并返回给前端
- 浏览器通过WebAuthn API请求验证器(现代浏览器集成的认证器or外部认证器),浏览器通过可信信道确认认证器的安全性(通常的策略是使用RSA来签名一个Challenge信息,触发浏览器集成部分的认证器和外部客户端对签名信息的解密,用户手动确认两侧的数据一致性)
- 认证器生成新的键值对、私钥,对Challenge信息签名,返回签名、公钥给浏览器
- 浏览器向前端返回上述信息,前端将信息透传到服务端
- 服务端使用公钥解密签名,校验Challenge和解密结果的一致性,保存公钥和认证信息,返回注册结果
Authentication

- 前端向服务端发起登录请求,携带用户相关的元数据
- 服务器向浏览器发起挑战,缓存挑战数据
- 浏览器对认证器建立可信信道,发送挑战、依赖方信息和客户端信息,请求对挑战签名
- 认证器请求交互式确认,用户选取对应的私钥信息,并使用私钥对挑战进行签名(断言),返回给浏览器
- 浏览器透传签名信息,返回到前端并传递到服务端
- 服务端使用注册时存储的公钥验签,返回鉴权结果
常见的现代浏览器/浏览器内核已经完整的支持了WebAuthn的API并内建有认证器的集成,在不需要任何第三方验证器的情况下,就可以完成上述注册、验证的流程;常见的操作系统也已经内建了对WebAuthn的ABI级别支持:
Authenticators
WebAuthn定义了一个合法的验证器的标准API限制,满足规范的任意程序均可被视作一个有效的验证器
按验证器附加模式分类
- 平台身份验证器:属于某个物理设备的一部分的验证器,例如手机上的指纹、人脸、虹膜识别
- 漫游身份验证器:允许通过跨平台协议传输进行跨平台附加,通过漫游凭证来在允许在多端使用
按凭证存储方式分类
- 专用安全硬件的持久化存储:不使用软件实现,通过OS提供的API来直接操作安全嵌入式设备的可信环境,典型硬件:TPM
- 通过加密包装私钥:使用例如KDF迭代的方法来提高私钥本身的破解难度,在软件层面保护秘钥
按校验的因素分类
- Something you have
物理的凭证,例如物理秘钥、一台特定的电脑、手机
- Something you know
字面意思的秘钥,可能是一串密码
- Something you are
个人独立的特征,例如指纹、虹膜等生物信息
体验WebAuthn&PassKey

生物识别:
密钥管理器:
秘钥管理的策略取舍
一个密码变体走遍天下
出于对个人记忆的友好性,大多数用户倾向于采用相同的基础密码,并在此基础上进行简单修改,比如在后面添加数字或符号,以满足不同网站的安全要求。虽然这种方法在短期内提高了记忆的便利性,但实际上却降低了整体安全性。因为一旦某个变体被泄露,攻击者便能轻易推测出用户在其他平台的密码。
独立设置完全无关的密码
另一种策略是为每个平台生成随机的独立密码,并使用密码管理器进行统一管理。这种做法有效提高了抵御单点泄露的能力。然而,随机密码对记忆的要求极高。如果密码散乱保存在电脑文件或是物理便签上,就会造成安全保障的不完整,同时在紧急情况下难以迅速访问,反而增加了潜在的风险。
因此,借助密码管理器等工具来平衡易用性与安全性显得尤为重要。
现代浏览器的尝试
现代浏览器(尤其是基于Chromium的浏览器)曾尝试推广集成的密码生成器和管理器,允许将生成的密码托管在浏览器服务商处,以便于多端同步。然而,这种处理在特定情形下并不完善:
- 自动填充的依赖性:密钥的自动填充高度依赖页面元素的识别。如果某些页面的元素未被正确识别为登录页面,浏览器就无法判断是否应该填充保存的密码。在这种情况下,浏览器集成的密码管理器通常比较简陋,针对特定域名检索密码也显得非常麻烦。
- 服务依赖性:浏览器集成的管理器依赖于浏览器提供商(如微软、谷歌)的服务来进行多端同步。这意味着,所有密码都需要在能使用对应浏览器的平台上找到,增加了用户的使用门槛。
使用第三方密钥管理器
业界已经有大量的第三方密钥管理器的成熟方案,例如:
- LastPass
- 优点:易于使用,支持多平台同步,提供强大的密码生成和自动填充功能。
- 缺点:免费版功能有限,安全性受到过一些质疑。
- 1Password
- 优点:用户界面友好,支持多种身份验证方式(包括生物识别),具有良好的安全性和隐私保护。
- 缺点:需付费订阅,价格相对较高。
- Bitwarden
- 优点:开源,免费版功能强大,支持多平台,安全性高。
- 缺点:用户界面相对简单,可能不如某些其他工具直观。
但此类专用的密钥管理器APP,要么只支持使用导出文件进行多端同步的机制,要么需要支付相应的费用;同时,使用这些服务商最危险的问题是,一旦服务商的托管服务被攻破或存在数据获取的漏洞,这样实际上并不安全
自托管:把风险和责任都握在自己手里
我们仍然可以利用社区的力量,自行部署开源的秘钥托管和同步服务;开源的托管服务可能会更容易被发现漏洞,但另一个角度而言,其整体的安全性也得到了更多的检验。如果需要尝试自托管服务,笔者推荐使用BitWarden的开源服务端部署,因为其有成熟的浏览器插件、各端APP:
同时还有社区自举的Rust分支Vaultwarden,完全适配上游API的情况下,提供了更灵活的部署手段和更高的性能可供使用:(或许是另一个RIIR的受益者受害者)
Summary
密码的历史演变反映了人类在信息保护上的不断努力,但随着技术的进步,密码安全也面临着日益复杂的挑战。从早期的口头暗语到现代的生物识别,密码机制的演变始终围绕着保护信息的核心目标。然而,用户行为、协议缺陷及社会工程攻击等因素依旧在威胁着密码的安全性。
面对日益复杂的网络环境,多因素认证(MFA)和无密码化技术(如WebAuthn和PassKey)的发展为密码安全提供了新的解决方案。这些方法不仅提高了安全性,也在一定程度上改善了用户体验。尽管第三方密码管理器提供了便捷的管理方式,自托管解决方案则让用户更能掌握自己的数据安全。
未来,随着技术的进一步发展,密码的角色可能会逐渐淡化,取而代之的是更为安全和便捷的认证方式。无论如何,保持对密码安全性的关注,以及在使用各种技术时的谨慎,都是我们不可或缺的责任。

