Windows Hello KeyCredentialManager凭据隔离范围与API行为技术问询
Windows.Security.Credentials.KeyCredentialManager 凭据作用域问题
我在Windows桌面应用中使用Windows.Security.Credentials.KeyCredentialManager,通过以下代码创建KeyCredential:
KeyCredentialManager.RequestCreateAsync(name, KeyCredentialCreationOption.ReplaceExisting)
后续通过以下代码打开凭据:
KeyCredentialManager.OpenAsync(name)
并使用:
KeyCredential.RequestSignAsync(...)
现咨询凭据的作用域相关问题:若同一Windows用户账户下的另一进程知晓相同凭据名称,在用户批准Windows Hello提示后,该进程能否调用KeyCredentialManager.OpenAsync(name)并使用RequestSignAsync?我并非询问私钥材料的获取方式,清楚私钥不会直接暴露给应用。
具体需了解的已文档化API行为
- 凭据是否限定在Windows用户账户范围内?
- 凭据是否限定在应用范围内?
- 凭据是否限定在包标识或
AppContainer范围内? - 凭据名称是否需保密?
- MSIX打包是否会改变该行为?
- 是否存在可将
KeyCredential绑定到特定可执行文件或包标识的API?
最小测试场景
- 进程A创建名为"test-key"的
KeyCredential。 - 进程B在同一Windows用户下运行。
- 进程B调用
OpenAsync("test-key")。 - Windows Hello向用户发出提示。
- 用户批准该提示。
- 进程B尝试调用
RequestSignAsync。
我需要官方文档说明该场景是否会成功,以及KeyCredentialManager所采用的隔离边界。
官方文档明确的行为与隔离边界
针对上述问题和测试场景,官方文档给出以下明确结论:
- 凭据限定在Windows用户账户范围内:KeyCredential完全隔离在创建它的Windows用户账户下,其他用户账户无法访问该凭据,哪怕是管理员账户也不行。
- 未打包桌面应用:凭据不限定在单个应用/进程范围内:对于未使用MSIX打包的传统桌面应用(Win32),同一用户账户下的任意进程,只要知道凭据名称,在用户通过Windows Hello授权后,都可以调用
OpenAsync打开凭据并使用RequestSignAsync完成签名操作。 - 打包应用(MSIX/AppContainer):凭据限定在包标识/AppContainer范围内:使用MSIX打包的应用,KeyCredential会绑定到应用的包标识,只有同一包标识下的进程才能访问该凭据;非同一包的进程,即便知道凭据名称且用户授权,也无法打开和使用该凭据。
- 凭据名称无需保密:凭据名称本身不具备安全隔离作用,它只是用于标识凭据的友好名称,安全隔离依赖于用户账户和(打包应用的)包标识边界。
- MSIX打包会改变隔离行为:如上述第3点所述,打包后凭据的隔离边界从用户账户级缩小到包标识/AppContainer级,只有同包进程可访问。
- 无额外API绑定到特定可执行文件:对于未打包应用,无法通过官方API将KeyCredential绑定到单个可执行文件;若需实现进程级隔离,需自行结合其他机制(如验证调用进程的签名、路径等),或采用MSIX打包来利用包标识的天然隔离。
针对你的最小测试场景:
- 若进程A和B都是未打包的传统桌面应用,在用户批准Windows Hello提示后,进程B可以成功打开凭据并调用
RequestSignAsync。 - 若进程A是MSIX打包应用,进程B是其他包或未打包应用,即便用户授权,进程B也无法打开该凭据,调用
OpenAsync会失败。
内容的提问来源于stack exchange,提问作者rel1nce
相关产品推荐
相关产品推荐

