Windows密码服务框架(CNG)介绍

1. CNG介绍

Windows应用通过调用统一的API接口来使用密码算法,该接口名称为CNG,全称为Cryptography API: Next Generation。例如,包括数字证书、IE浏览器、Edge浏览器和IIS服务器等的应用、IPSec和Kerberos等协议可通过CNG访问密码服务。微软已经实现了一些符合CNG接口的密码算法模块,Windows系统也允许第三方按照CNG接口要求实现自己的密码库。

2. CNG架构

微软的CNG框架结构如图所示,CNG主要分为密码原语(Cryptographic Primitives)和**存储(Key Storage)两部分。

  • 密码原语,主要对短期**提供计算功能,不具备**存储的功能
  • **存储,主要用于长期**,同时提供**存储功能和密码计算功能。
    Windows密码服务框架(CNG)介绍

2.1 密码原语

密码原语模块主要针对短期**提供密码计算服务,包括生成**、**计算、导入导出**等,同时支持内核层和应用层接口。密码原语运行在调用者所在的空间,不同调用者之间的**天然隔离,并且密码原语多为临时**,一旦使用完毕立即销毁。

密码原语支持对称算法、非对称签名算法、非对称加密算法、杂凑算法、随机数算法、**扩展算法等。
Windows应用和协议通过算法原语路由(router)调用密码算法实现。算法原语路由是Windows操作系统内置的组件,其二进制文件为BCrypt.dll(应用层)和Ksecdd.sys(内核层)。

使用CNG的应用程序会首先链接密码原语路由BCrypt.dll(内核层为Ksecdd.sys),密码原语路由会根据算法名称和算法提供者名称找到对应的算法实现。外部应用程序调用CNG API接口时,都会经过密码原语路由。

密码原语模块的实现形式也是dll (sys)。应用程序使用密码原语模块时,除了算法原语路由(router)会链入应用程序,密码原语模块也会以dll (sys)形式链入至应用程序空间

2.2 **存储

**存储提供**的长期储存功能,并提供相应的密码计算功能,支持用户层接口。**存储模块的调用和加载方式与密码原语模块相同。**存储路由的二进制文件为NCrypt.dll。

微软将自己实现的**存储模块放置在LSA进程中。LSA是Windows系统的安全认证子系统程序进程,它对所有需要安全认证的程序提供安全认证服务,其安全性与操作系统的安全性一致通过将**存储模块放在LSA中,使其具备**隔离功能,以此保证**存储的安全性。但微软不允许第三方实现的**存储模块放置在LSA进程中

2.3 **原语和**存储的对比

密码原语模块置于调用者空间,不同调用者之间的**天然隔离,具有较好的隔离性,并且密码原语模块多为临时**,短时间使用后或程序退出后销毁。基于这样的特性,密码原语模块更侧重于提供纯粹的密码计算功能,而对于**的安全保护,则是更多的依赖于用户主观操作及操作系统的平台安全保护,如进程隔离。

**存储模块,除需具备密码原语模块所具有的密码计算功能外,还需要提供**存储功能。由于**存储模块生成的**,往往需要在后续的环境中反复使用,因此它的泄漏可能带来严重后果。因此,对**的存储和保护尤为重要,微软将自己的**存储模块置于LSA进程,使其具备**隔离功能,以此保证**存储的安全性。

2.3.1 密码原语和**存储接口功能对比

密码原语和**存储接口功能对比如下 所示。作为CNG两个独立的模块,密码原语模块和**存储模块都提供了对密码算法的基本支持,即**生成、利用**进行密码计算以及**的备份和恢复(**的导入和导出)。
Windows密码服务框架(CNG)介绍
密码原语模块缺失了安全控制功能,这是由于密码原语模块的使用场景多为纯粹的密码计算,**多为临时**,因此密码原语模块并没有提供对**的安全控制功能,包括不对**的导出进行任何限制以及不对**的使用进行访问控制。

2.3.2 密码原语和**存储安全分析对比

密码原语和**存储安全分析对比如下所示,对于**的攻击,主要分为两种方式:一个是未授权非法使用**,另一个是窃取**。

  • 对于密码原语模块,**的整个生命周期都在创建它的进程里,不涉及任何其他的第三方,因此敌手攻击通常集中于对进程本身进行攻击。
  • 对于**存储模块,**存储在文件系统里,由操作系统提供的Windows访问控制机制保护;并且在使用时只能通过CNG的控制接口进行访问,因此敌手要获得**的控制权,必须先突破CNG和Windows访问控制机制的控制。

对非法使用**

  • 密码原语模块中,敌手只需要能够成功的篡改调用进程代码
  • **存储模块中,敌手需要突破CNG使用控制和Windows访问控制机制

对窃取**

  • 密码原语模块中,敌手只需要能够成功越权访问调用进程数据区或者篡改调用进程代码直接将**导出
  • **存储模块中,敌手需要能够访问LSA进程数据区或者突破CNG导出控制,而这几乎相当于攻破了操作系统。

Windows密码服务框架(CNG)介绍