Windows Hello 是 Windows 提供的一套身份验证机制。
用户可以通过以下方式登录:
- PIN
- 指纹
- 人脸识别
它看起来只是“刷脸登录”或“输入 PIN”,但底层并不是把 PIN、指纹或人脸发送给服务器。
Windows Hello 的核心是:
使用 PIN、指纹或人脸,在本机授权使用一把私钥,再由服务器通过公钥验证用户身份。
一、Windows Hello 解决了什么问题?
传统密码存在很多风险:
- 密码可能被钓鱼网站骗走
- 用户可能在多个网站使用相同密码
- 服务器密码数据库可能泄露
- 攻击者获得密码后,可以在其他设备登录
Windows Hello 不依赖服务器保存用户的秘密密码。
它使用一对密钥:
1私钥:保存在用户设备中
2公钥:保存在服务器中
私钥通常受到 TPM 安全芯片保护,不会上传到服务器。
二、Windows Hello 注册流程
第一次设置 Windows Hello 时,用户通常需要先通过密码或 MFA 证明自己的身份。
然后,设备会生成一对密钥:
- 私钥保留在当前设备
- 公钥登记到服务器
1sequenceDiagram
2 participant U as 用户
3 participant W as Windows Hello
4 participant T as TPM
5 participant S as 身份服务器
6
7 U->>S: 使用密码或 MFA 验证身份
8 S->>W: 允许注册 Windows Hello
9 U->>W: 设置 PIN、指纹或人脸
10 W->>T: 请求生成密钥对
11 T-->>W: 返回公钥,私钥保留在 TPM
12 W->>S: 发送公钥和凭据 ID
13 S->>S: 将公钥绑定到用户账户
14 S-->>U: 注册完成
注册完成后,服务器大致会保存这样的关系:
1用户账户
2└── 凭据 ID
3 └── 公钥
服务器不会保存:
- Windows Hello PIN
- 指纹
- 人脸数据
- 私钥
三、“公钥登记到服务器”是什么意思?
公钥登记,就是服务器记录:
这个用户的这个登录凭据,对应这把公钥。
例如:
1{
2 "user_id": "10086",
3 "credential_id": "windows-device-01",
4 "public_key": "PUBLIC_KEY_DATA"
5}
以后登录时,设备会使用对应的私钥生成签名。
服务器则找到这把已经登记的公钥,用它验证签名。
公钥不需要保密。即使公钥被别人看到,也不能用来生成签名,更不能反推出私钥。
四、Windows Hello 登录流程
登录时,服务器不会询问用户的 PIN。
服务器会生成一个随机挑战值,要求设备证明自己确实持有私钥。
1sequenceDiagram
2 participant U as 用户
3 participant W as Windows Hello
4 participant T as TPM
5 participant S as 身份服务器
6
7 U->>S: 发起登录
8 S->>W: 发送随机挑战 Challenge
9 W->>U: 请求 PIN、指纹或人脸验证
10 U->>W: 完成本地验证
11 W->>T: 请求使用私钥
12 T->>T: 使用私钥签名 Challenge
13 T-->>W: 返回数字签名
14 W->>S: 返回凭据 ID 和数字签名
15 S->>S: 找到对应公钥并验证签名
16 S-->>U: 验证成功,允许登录
可以把整个过程简化成:
1服务器生成随机挑战
2 ↓
3设备使用私钥签名
4 ↓
5服务器使用公钥验证
6 ↓
7验证成功
8 ↓
9登录完成
PIN、指纹和人脸的作用,只是授权当前设备使用私钥。
它们不会被发送给服务器。
五、为什么不直接使用同一个对称密钥?
理论上,可以让设备和服务器共同保存一个相同的秘密密钥:
1设备保存:K
2服务器保存:K
登录时:
1服务器发送 Challenge
2 ↓
3设备计算 HMAC(K, Challenge)
4 ↓
5服务器也计算一次
6 ↓
7两个结果相同则登录成功
这种方式确实可以验证身份。
但它有一个重要问题:
服务器也拥有能够冒充用户的秘密密钥。
如果服务器数据库或密钥管理系统泄露,攻击者获得密钥 K 后,就可以生成正确的验证结果,冒充用户登录。
对称密钥的关系是:
1设备:可以生成验证结果
2服务器:也可以生成验证结果
Windows Hello 使用非对称密钥:
1设备:持有私钥,可以生成签名
2服务器:持有公钥,只能验证签名
即使服务器中的公钥数据库泄露,攻击者也不能生成有效签名。
六、为什么 Windows Hello 更安全?
Windows Hello 的关键优势有三个。
1. 私钥不离开设备
私钥通常在 TPM 内生成和使用,不需要上传给服务器。
2. 服务器不能冒充用户
服务器只有公钥,只能验证签名,不能生成签名。
3. PIN 只能用于当前设备
Windows Hello PIN 不是一个可以在任何地方使用的账户密码。
即使攻击者知道 PIN,通常还需要:
- 拿到对应设备
- 访问设备中的 TPM
- 绕过设备的锁定和防暴力破解机制
所以,PIN 本身虽然可能只有几位数字,但它和设备中的私钥组合在一起,安全性与普通短密码完全不同。
七、总结
Windows Hello 并不是把人脸、指纹或 PIN 发送给服务器验证。
它的真实流程是:
1PIN、指纹或人脸
2 ↓
3本地授权使用私钥
4 ↓
5私钥对随机挑战进行签名
6 ↓
7服务器使用公钥验证签名
8 ↓
9登录成功
注册阶段,设备生成私钥和公钥:
1私钥留在设备
2公钥登记到服务器
登录阶段:
1私钥负责证明身份
2公钥负责验证身份
这套设计的核心价值是:
服务器可以验证用户,却不需要保存能够冒充用户的秘密。