一种DPAPI加密数据的解密方法和系统.pdf

上传人:e2 文档编号:1566120 上传时间:2018-06-25 格式:PDF 页数:20 大小:956.10KB
返回 下载 相关 举报
摘要
申请专利号:

CN201310020303.5

申请日:

2013.01.21

公开号:

CN103116730A

公开日:

2013.05.22

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 21/62申请日:20130121|||公开

IPC分类号:

G06F21/62(2013.01)I; H04L9/06

主分类号:

G06F21/62

申请人:

厦门市美亚柏科信息股份有限公司

发明人:

陈江勇; 钱镜洁; 林艺滨

地址:

361008 福建省厦门市软件园二期观日路12号美亚柏科大厦

优先权:

专利代理机构:

北京恒都律师事务所 11395

代理人:

邸建凯

PDF下载: PDF下载
内容摘要

本发明提供了一种DPAPI加密数据的解密方法和系统,方法包括:对数据源所在设备进行加载;在数据源中识别出Windows系统所在系统分区并读取其内文件;获取需要解密的文件和所有用户的主密钥文件;在需要解密的文件中获取所有DPAPI加密块;解析所有DPAPI加密块获取包括加密密钥唯一标识的第一解密关键信息;根据加密密钥唯一标识获取每个DPAPI加密块的主密钥文件;解析所述主密钥文件获取第二解密关键信息,第二解密关键信息包括第二干扰值、第二基于口令的密钥派生函数迭代次数;根据本次登录密码、系统熵参数和第一、第二解密关键信息对DPAPI加密块进行解密;通过本发明的方法和系统,可实现对数据源的只读操作且不受操作系统的限制而满足跨平台的要求。

权利要求书

权利要求书一种DPAPI加密数据的解密方法,其特征在于,包括如下步骤:
对数据源所在设备进行加载;
在数据源中识别出Windows系统所在的系统分区,读取所述系统分区内的文件;
获取系统分区内需要解密的文件和所有用户的主密钥文件;
在所述需要解密的文件中获取所有DPAPI加密块;
对所有DPAPI加密块进行解析,以获取所有DPAPI加密块各自的第一解密关键信息,其中,所述第一解密关键信息包括加密密钥唯一标识、第一加密算法标识、第一安全散列算法标识和加密散列输出数据;
根据所述加密密钥唯一标识获取每个DPAPI加密块的主密钥文件;
对所述每个DPAPI加密块的主密钥文件进行解析,以获取第二解密关键信息,其中,所述第二解密关键信息包括第二干扰值、第二基于口令的密钥派生函数迭代次数、第二安全散列算法标识、第二加密算法标识和主密钥文件密文;
根据本次登录密码、系统熵参数和所述第一、第二解密关键信息对DPAPI加密块进行解密。
如权利要求1所述的方法,其特征在于,在所述对数据源所在设备进行加载之前还包括:判断所述数据源的类型。
如权利要求2所述的方法,其特征在于,所述数据源的类型包括存储介质、系统分区和单个文件。
如权利要求1所述的方法,其特征在于,所述获取系统分区内所有用户的主密钥文件的步骤具体包括:
获取系统分区的Documents目录或Users目录;
读取所述Documents目录或Users目录中的所有用户名目录,以获取所有用户名目录中的主密钥文件。
如权利要求1所述的方法,其特征在于,所述在需要解密的文件中获取所有DPAPI加密块的步骤,具体为:
判断需要解密的文件中是否包括DPAPI加密块的头部数据信息;
若包括,则根据所述头部数据信息获取DPAPI加密块。
如权利要求1所述的方法,其特征在于,对所述DPAPI加密块进行解密的步骤,具体包括:
计算本次登录密码的安全散列值;
根据所述安全散列值和第二解密关键信息对所述主密钥文件密文进行解密,以获取主密钥明文;
计算所述主密钥明文的加密散列值,并将所述主密钥明文的加密散列值与所述第一加密散列输出数据进行比较,若两个值相等,则对所述主密钥密文解密成功,获取主密钥;
根据所述主密钥和第一解密关键信息对DPAPI加密块进行解密,以获取DPAPI加密块的明文。
如权利要求6所述的方法,其特征在于,
在获取系统分区内所有用户的主密钥文件的步骤之后,还包括:
获取与主密钥文件相对应的历史凭据文件;
对所述历史凭据文件进行解析,以获取第三解密关键信息,其中所述第三解密关键信息包括第三安全散列算法标识、第三基于口令的密钥派生函数迭代次数、第三加密算法标识、第三干扰值和历史凭据文件密文;
    所述方法还包括如下步骤:
若对DPAPI加密块解密失败,则根据第三解密信息和第N次登录密码的安全散列值获取第N‑1次登录密码的安全散列值;
根据所述第N‑1次登录密码的安全散列值和第一解密关键信息对所述DPAPI加密块进行解密,若解密成功,则获取DPAPI加密块的明文;若解密失败,则重复上述步骤;
其中,第N次的初始值为本次,第N‑1次为第N次的的上一次。
一种DPAPI加密数据的解密系统,其特征在于,包括:
加载单元,用于对数据源所在设备进行加载;
识别与读取单元,用于在数据源中识别出Windows系统所在的系统分区,读取所述系统分区内的文件;
第一文件获取单元,用于获取系统分区内需要解密的文件和所有用户的主密钥文件;
加密块获取单元,用于在所述需要解密的文件中获取所有DPAPI加密块;
第一解密关键信息获取单元,用于对所有DPAPI加密块进行解析,以获取所有DPAPI加密块各自的第一解密关键信息,其中,所述第一解密关键信息包括加密密钥唯一标识、第一加密算法标识、第一安全散列算法标识和加密散列输出数据;
主密钥文件获取单元,用于根据所述加密密钥唯一标识获取每个DPAPI加密块的主密钥文件;
第二解密关键信息获取单元,用于对每个DPAPI加密块的主密钥文件进行解析,以获取第二解密关键信息,其中,所述第二解密关键信息包括第二干扰值、第二基于口令的密钥派生函数迭代次数、第二安全散列算法标识、第二加密算法标识和主密钥文件密文;
第一解密单元,用于根据本次登录密码、系统熵参数和所述第一、第二解密关键信息对DPAPI加密块进行解密。
如权利要求8所述的系统,其特征在于,还包括,数据源判断单元,用于判断所述数据源的类型。
如权利要求9所述的系统,其特征在于,所述数据源的类型包括存储介质、系统分区和单个文件。
如权利要求8所述的系统,其特征在于,所述第一文件获取单元具体包括:
目录获取子单元,用于获取系统分区的Documents目录或Users目录;
主密钥文件获取子单元,用于读取所述Documents目录或Users目录中的所有用户名目录,以获取所有用户名目录中的主密钥文件。
如权利要求8所述的系统,其特征在于,所述加密块获取单元具体包括:
加密块判断子单元,用于判断需要解密的文件中是否包括DPAPI加密块的头部数据信息;
加密块获取子单元,用于当需要解密的文件中包括DPAPI加密块的头部数据信息时,根据所述头部数据信息获取DPAPI加密块。
如权利要求8所述的系统,其特征在于,所述解密单元具体包括:
散列值计算子单元,用于计算本次登录密码的安全散列值;
主密钥明文获取子单元,用于根据所述安全散列值和第二解密关键信息对所述主密钥文件密文进行解密,以获取主密钥明文;
主密钥获取子单元,用于计算所述主密钥明文的加密散列值,并将所述主密钥明文的加密散列值与所述第一加密散列输出数据进行比较,若两个值相等,则对所述主密钥密文解密成功,获取主密钥;
DPAPI加密块明文获取子单元,用于根据所述主密钥和第一解密关键信息对DPAPI加密块的密文进行解密,以获取DPAPI加密块的明文。
如权利要求13所述的系统,其特征在于,所述系统还包括:
历史凭据文件获取单元,用于获取与主密钥文件相对应的历史凭据文件;
历史凭据文件解析单元,用于对所述历史凭据文件进行解析,以获取第三解密关键信息,其中所述第三解密关键信息包括第三安全散列算法标识、第三基于口令的密钥派生函数迭代次数、第三加密算法标识、第三干扰值和历史凭据文件密文;
    所述解密单元还包括:
散列值获取子单元,用于当对DPAPI加密块解密失败时,根据第三解密信息和第N次登录密码的安全散列值获取第N‑1次登录密码的安全散列值;
解密子单元,根据所述第N‑1次登录密码的安全散列值和第一解密关键信息对DPAPI加密块进行解密,若解密成功,则获取DPAPI加密块的明文;若解密失败,则重复上述步骤;
其中,第N次的初始值为本次,第N‑1次为第N次的的上一次。

说明书

说明书一种DPAPI加密数据的解密方法和系统
技术领域
 本发明涉及一种数据解密方法和系统,特别地,涉及一种DPAPI加密数据的解密方法和解密系统。
背景技术
微软从Windows 2000开始便引入了一种简单易用的应用程序数据保护接口(Data Protect Application‑Programming Interface,DPAPI),用来为用户程序和操作系统提供系统级别的数据保护。在Windows系统中的无线网络密码、上网密码、加密文件系统的私钥等各种私密数据全部采用DPAPI加密存储,然而DPAPI的加密机制极为复杂,微软也从未公开任何关于DPAPI的技术细节,因此,对于理解DPAPI的内部实现机制是非常困难的。
目前,国内还没有人研究DPAPI的离线解密方法,国外关于DPAPI的离线解密方法的相关技术文档和专利也极少。国内的取证软件对于DPAPI加密数据采用的取证方法是一种称之为“动态取证”的方法,即在获取到需要取证的目标数据源后,需运行安装在目标源设备上的操作系统,并登录对应的账户,然后在该账户上安装对应的取证软件,取证软件内部再通过调用CryptUnProtectData函数来解密加密的数据,最后在界面上进行展示。这种取证方法直接依赖于目标源的操作系统,在运行操作系统过程中很可能会污染目标源的数据,无法达到对目标数据源只读的要求。国外虽有部分软件能实现DPAPI的离线解密,但是都是直接调用加密应用程序编程接口(CryptoAPI)来实现的,并未对CryptoAPI接口的内部算法作分析和实现,由于CryptoAPI直接依赖于Windows操作系统而且不同的操作系统支持的安全函数不同,导致这些软件无法实现跨平台的要求,而且在某些版本的Windows系统上甚至还无法正常解密。
总之,需要本领域技术人员迫切解决的一个技术问题就是:如何能够无需依赖数据源所在设备上的操作系统,也无需调用CryptoAPI函数以实现对DPAPI加密数据的解密。
发明内容
本发明所要解决的技术问题是提供一种对DPAPI加密数据的解密方法和系统,可实现对DPAPI加密数据的离线解密,无需依赖目标数据源所在设备上的操作系统,也无需依赖CryptoAPI接口,进而实现对目标数据源的只读操作且不受操作系统的限制而满足跨平台的要求。
为了解决上述问题,本发明一方面提供了一种DPAPI加密数据的解密方法,包括如下步骤:
对数据源所在设备进行加载;
在数据源中识别出Windows系统所在的系统分区,读取所述系统分区内的文件;
获取系统分区内需要解密的文件和所有用户的主密钥文件;
在所述需要解密的文件中获取所有DPAPI加密块;
对所有DPAPI加密块进行解析,以获取所有DPAPI加密块各自的第一解密关键信息,其中,所述第一解密关键信息包括加密密钥唯一标识、第一加密算法标识、第一安全散列算法标识和加密散列输出数据;
根据所述加密密钥唯一标识获取每个DPAPI加密块的主密钥文件;
对所述每个DPAPI加密块的主密钥文件进行解析,以获取第二解密关键信息,其中,所述第二解密关键信息包括第二干扰值、第二基于口令的密钥派生函数迭代次数、第二安全散列算法标识、第二加密算法标识和主密钥文件密文;
根据本次登录密码、系统熵参数和所述第一、第二解密关键信息对DPAPI加密块进行解密。
优选的,在所述对数据源所在设备进行加载之前还包括:判断所述数据源的类型。其中,所述数据源的类型包括存储介质、系统分区和单个文件。
优选的,所述获取系统分区内所有用户的主密钥文件的步骤具体包括:
获取系统分区的Documents目录或Users目录;
读取所述Documents目录或Users目录中的所有用户名目录,以获取所有用户名目录中的主密钥文件。
优选的,所述在需要解密的文件中获取所有DPAPI加密块的步骤,具体为:
判断需要解密的文件中是否包括DPAPI加密块的头部数据信息;
若包括,则根据所述头部数据信息获取DPAPI加密块。
优选的,对所述DPAPI加密块进行解密的步骤,具体包括:
计算本次登录密码的安全散列值;
根据所述安全散列值和第二解密关键信息对所述主密钥文件密文进行解密,以获取主密钥明文;
计算所述主密钥明文的加密散列值,并将所述主密钥明文的加密散列值与所述第一加密散列输出数据进行比较,若两个值相等,则对所述主密钥密文解密成功,获取主密钥;
根据所述主密钥和第一解密关键信息对DPAPI加密块进行解密,以获取DPAPI加密块的明文。
优选的,在获取系统分区内所有用户的主密钥文件的步骤之后,还包括:
获取与主密钥文件相对应的历史凭据文件;
对所述历史凭据文件进行解析,以获取第三解密关键信息,其中所述第三解密关键信息包括第三安全散列算法标识、第三基于口令的密钥派生函数迭代次数、第三加密算法标识、第三干扰值和历史凭据文件密文;
    所述方法还包括如下步骤:
若对DPAPI加密块解密失败,则根据第三解密信息和第N次登录密码的安全散列值获取第N‑1次登录密码的安全散列值;
根据所述第N‑1次登录密码的安全散列值和第一解密关键信息对所述DPAPI加密块进行解密,若解密成功,则获取DPAPI加密块的明文;若解密失败,则重复上述步骤;
其中,第N次的初始值为本次,第N‑1次为第N次的的上一次。
本发明另一方面提供了一种与DPAPI加密数据的解密方法相对应的解密系统,包括:
加载单元,用于对数据源所在设备进行加载;
识别与读取单元,用于在数据源中识别出Windows系统所在的系统分区,读取所述系统分区内的文件;
第一文件获取单元,用于获取系统分区内需要解密的文件和所有用户的主密钥文件;
加密块获取单元,用于在所述需要解密的文件中获取所有DPAPI加密块;
第一解密关键信息获取单元,用于对所有DPAPI加密块进行解析,以获取所有DPAPI加密块各自的第一解密关键信息,其中,所述第一解密关键信息包括加密密钥唯一标识、第一加密算法标识、第一安全散列算法标识和加密散列输出数据;
主密钥文件获取单元,用于根据所述加密密钥唯一标识获取每个DPAPI加密块的主密钥文件;
第二解密关键信息获取单元,用于对每个DPAPI加密块的主密钥文件进行解析,以获取第二解密关键信息,其中,所述第二解密关键信息包括第二干扰值、第二基于口令的密钥派生函数迭代次数、第二安全散列算法标识、第二加密算法标识和主密钥文件密文;
第一解密单元,用于根据本次登录密码、系统熵参数和所述第一、第二解密关键信息对DPAPI加密块进行解密。
优选的,所述系统还包括,数据源判断单元,用于判断所述数据源的类型。其中,所述数据源的类型包括存储介质、系统分区和单个文件。
优选的,所述第一文件获取单元具体包括:
目录获取子单元,用于获取系统分区的Documents目录或Users目录;
主密钥文件获取子单元,用于读取所述Documents目录或Users目录中的所有用户名目录,以获取所有用户名目录中的主密钥文件。
优选的,所述加密块获取单元具体包括:
加密块判断子单元,用于判断需要解密的文件中是否包括DPAPI加密块的头部数据信息;
加密块获取子单元,用于当需要解密的文件中包括DPAPI加密块的头部数据信息时,根据所述头部数据信息获取DPAPI加密块。
优选的,所述解密单元具体包括:
散列值计算子单元,用于计算本次登录密码的安全散列值;
主密钥明文获取子单元,用于根据所述安全散列值和第二解密关键信息对所述主密钥文件密文进行解密,以获取主密钥明文;
主密钥获取子单元,用于计算所述主密钥明文的加密散列值,并将所述主密钥明文的加密散列值与所述第一加密散列输出数据进行比较,若两个值相等,则对所述主密钥密文解密成功,获取主密钥;
DPAPI加密块明文获取子单元,用于根据所述主密钥和第一解密关键信息对DPAPI加密块的密文进行解密,以获取DPAPI加密块的明文。
优选的,所述系统还包括:
历史凭据文件获取单元,用于获取与主密钥文件相对应的历史凭据文件;
历史凭据文件解析单元,用于对所述历史凭据文件进行解析,以获取第三解密关键信息,其中所述第三解密关键信息包括第三安全散列算法标识、第三基于口令的密钥派生函数迭代次数、第三加密算法标识、第三干扰值和历史凭据文件密文;
    所述解密单元还包括:
散列值获取子单元,用于当对DPAPI加密块解密失败时,根据第三解密信息和第N次登录密码的安全散列值获取第N‑1次登录密码的安全散列值;
解密子单元,根据所述第N‑1次登录密码的安全散列值和第一解密关键信息对DPAPI加密块进行解密,若解密成功,则获取DPAPI加密块的明文;若解密失败,则重复上述步骤;
其中,第N次的初始值为本次,第N‑1次为第N次的的上一次。
本发明提供的对DPAPI加密数据的离线解密方法和系统,与现有技术相比,具有如下优点:
第一,可实现对DPAPI加密数据的离线解密,无需依赖目标数据源所在设备上的操作系统,即便由于系统文件损坏或者丢失等导致操作系统无法启动时,根据本发明所述的第一、第二、第三关键信息即可对加密数据进行解密。而且,在操作系统上有多个系统账户时,本发明也无须依次登录每一个系统账户获取该账户的加密数据,在知道每一个用户的登录密码情况下,可一次性批量的解密每个用户的加密数据,在提高了解密效率的同时满足了对数据源的只读要求。
第二,本发明并不依赖CryptAPI接口,无需调用CryptoAPI函数,不受不同的Windows操作系统的限制,可满足跨平台的要求。
附图说明
图1是本发明的DPAPI加密数据的解密方法实施例的流程图;
图2是本发明的DPAPI加密数据的解密系统实施例的示意图;
图3是Windows XP系统的DPAPI加密块的示意图;
图4是Windows XP系统的主密钥文件的示意图;
图5是Windows XP系统的只包含一个历史凭据节点的历史凭据文件的示意图。
具体实施方式
首先,为了更好的理解本发明,下面将简单介绍一下与DPAPI相关的概念。
(1)加密应用程序编程接口(Cryptography Application Programming Interface,CryptoAPI)是Windows平台提供的一组函数,该函数允许应用程序对用户的秘密信息进行编码、加密和数字签名等操作。CryptAPI函数内部的加密操作是在加密服务提供程序的独立模块中执行的。
(2)加密服务提供程序(Cryptographic Service Provider,CSP)是一组实现标准的加密和签名算法的硬件和软件的组合。每个CSP都包含一组它们自己定义并实现的函数,不同的CSP提供的安全算法不同,并且CSP是平台相关的,不同版本的Windows操作系统提供的CPS的个数和类型不同。而每个CSP都有其对应的名称和类型,其中名称必须是唯一的。目前常用的CSP类型有9种,要指定采用哪种CSP,只需在CryptAcquirecContext函数中指定即可,DPAPI一般默认使用PROV_RSA_FULL类型。
(3)算法标识(ALG_ID)是微软定义的一系列32位整数类型值,用于指明CryptoAPI所采用的加密或散列算法。其中,以0x66打头的标识通常表示对称加密算法,以0x88打头的标识通常表示散列算法。例如,算法标识CALG_3DES,其对应的值为0x6603,表示为三重数据加密标准。
(4)安全散列算法(Secure Hash Algorithm,SHA)是散列算法中的一种,又叫做摘要算法,用于产生消息摘要(Message Digest)。在数字签名标准(Digital Signature Standard,DSS)中,安全散列算法通常和数字签名算法(Digital Signature Algorithm,DSA)一起用于对消息进行数据签名。每一个安全散列算法都有其对应的算法标识。在CryptoAPI中,SHA对应的算法标识为CALG_SHA。目前,安全散列算法有四种:SHA‑1,SHA‑256,SHA‑384和SHA‑512,可分别产生160位、256位、384位和512位长的消息摘要。
(5)会话密钥(Session Key)是随机产生的密钥,其使用一次后,立马被丢弃而不会被保存。在CryptoAPI中,会话密钥通常是对称加密算法的密钥。会话密钥由40‑2000位随机数组成,其可以通过调用函数CryptDeriveKey同时传递一个散列值来派生。
(6)干扰值(Salt Value),也叫做“盐”,通常也是随机数,其一般可以看作是会话密钥的一部分。干扰值被添加到会话密钥时,其通常是以明文的形式被放置在加密数据的前端,加入干扰值可以有效地防止对称密钥算法被预先计算好的彩虹表攻击。在CryptoAPI中,干扰值通过函数CryptGenRandom来生成。
(7)基于口令的密钥派生函数(Password‑Based Key Derivation Function,PBKDF)通过对干扰后的用户输入口令计算多次散列来缓和字典攻击,攻击者若想确定口令的正确性,需执行上百万条指令,导致完成一次字典攻击就需要花大量的时间。PKKDF目前有两个版本:PBKDF1和PBKDF2,两个函数均以口令、干扰值和内部函数的迭代次数等作为输入。在DPAPI中,采用的是PBKDF2版本,而且内部做了部分改动。
(8)加密散列函数,又叫做基于散列的消息认证代码(Hash‑based Message Authentication code,HMAC),使用加密散列函数需要一个密钥,同时还需指定一个散列函数,可以是MD5或SHA‑1等,HMAC主要是用来确定加密的数据不被篡改。
(9)密钥分组链接(Cipher‑Block Chaining,简称CBC)是一种加密模式,在CBC模式中,每个分组完的平文块都需要与前一个经过加密后的密文块进行异或操作,然后再进行加密操作。然而,由于第一个平文块前没有对应的加密块,因此需要使用初始化向量。CBC加密模式是微软默认使用的加密模式,本发明中所有对称加密算法如未特别说明均默认采用CBC加密模式。
(10)填充(Padding)是明文根据加密函数进行数据分组后,由于最后一个明文块不满足分组数据长度要求从而在尾部额外添加的数据。例如:数据分组长度是8字节,而最后一个数据块是3个字节,则需要额外填充5个字节的数据串。填充的数据串可以0数据串,01交替数据串或者其他模式的数据串,具体模式应视填充方式而定。填充的数据串解密后一般会被自动移除,微软默认的填充方式为PKCS填充,本发明中所有对称加密算法如未特别说明均默认采用PKCS填充方式。
 下面再简要介绍一下DPAPI的加密过程。DPAPI包含两个接口,一个加密接口CryptProtectData,一个解密接口CrypUnProtectData。其中,加密CryptoDataProtecttData接口函数原型如下:
BOOL WINAPI CryptProtectData(
  DATA_BLOB* pDataIn,
  LPCWSTR szDataDescr,
  DATA_BLOB* pOptionalEntropy,
  PVOID pvReserved,
  CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct,
  DWORD dwFlags,
  DATA_BLOB* pDataOut
);
各参数说明如下表一所示。
参  数含  义pDataInDATA_BLOB结构指针,指向需要加密的数据明文。szDataDescr描述字符串,返回的数据包含该字符串,其未被加密,该参数为可选参数,可以为NULL。pOptionalEntropyDATA_BLOB结构指针,指向一个额外熵参数,可以是一个加密密码,该参数为可选参数,可以为NULL。若加密时设置了额外熵参数解密时必须提供同样的熵参数,否则无法解密。pvReserved保留,必须为NULL。pPromptStructCRYPTPROTECT_PROMPTSTRUCT结构指针,用于弹出对话框与用户交互,通常为NULL。dwFlags加密标识位,通常为NULL。pDataOutDATA_BLOB结构指针,指向经过加密处理后的数据。
表一
解密接口CryptProtectUnData参数跟CryptProtectData参数类似,不再赘述。
进一步的,CryptProtectData是对CryptoAPI的封装,其加密过程大致可以分成三个阶段,为生成主密钥、解密主密钥以及使用主密钥加密数据。
第一阶段:生成主密钥
当应用程序调用CryptProtectData接口时,DPAPI会读取主密钥存储区下的Preferred文件,获取当前系统使用的主密钥文件及其创建时间,如果创建时间超过了90天,则生成一个新的主密钥文件。
为了防止攻击者对同一个加密主密钥进行长期的攻击,微软引入了主密钥的到期机制,这个到期时间微软设置为90天。即若Preferred文件中指示的主密钥创建时间与系统当前时间相差90天以上,将生成一个新的主密钥,新的主密钥将以同样的方式保护用户数据。这种主密钥过期的策略有效防止了攻击者破解唯一的主密钥后便可访问用户所有的受保护数据。DPAPI不删除任何过期主密钥,所有主密钥文件保存在用户的配置文件目录下,且全都受到用户密码的保护。同时,每一个加密块都存储着当时加密它的主密钥GUID全局唯一标识符。当需要解密加密块时,DPAPI便根据从加密块中获取GUID全局唯一标识符找到对应主密钥文件进行解密。
第二阶段:解密主密钥
若Preferred文件指示的主密钥没有过期,DPAPI将解密对应的主密钥文件,获取64字节的主密钥。
由于主密钥是受到用户登陆密码的保护的,因此,DPAPI首先使用SHA‑1安全散列函数作用于用户登陆密码,然后将此密码散列和16字节的干扰值及迭代次数提供给基于口令的密钥派生函数PBKDF2,用于派生一个会话密钥,然后用此会话密钥作为对称加密算法的加密密钥,对主密钥进行加密,将加密后的主密钥存储在用户的配置文件目录下。
为了防止主密钥被篡改,主密钥将被计算HMAC加密散列。DPAPI将使用SHA版HMAC加密散列算法并以密码散列为加密密钥作用于16字节干扰值,进而派生成对应的加密散列值,该加密散列值再次作为HMAC的密钥计算主密钥的加密散列值,计算后的加密散列值同加密后的主密钥一起存于主密钥文件中。
由于用户登录密码是可修改的,因此,DPAPI还提供了一种机制来解决在用户修改登录密码后仍然可以正常解密主密钥。DPAPI对密码修改模块进行了Hook操作, 当用户修改密码时,所有主密钥将都根据新的密码重新加密。另外,用户配置文件目录下有个历史凭据文件CREDHIST,当用户修改密码时,旧密码的SHA‑1散列值会用新的密码进行加密,然后将加密后的结果存放在文件的底部。因此,如果当前系统登录密码无法解密主密钥,DPAPI将使用当前的密码解密历史凭据文件,获取上一次历史密码,然后用这个历史密码解密主密钥。如果解密仍然失败了,历史密码将再次解密历史凭据文件获取更旧的历史密码,这样继续下去,直到成功解密主密钥为止。
第三阶段:使用主密钥加密数据
DPAPI首先将主密钥、16字节干扰值及应用程序提供的额外熵参数三者组合派生出的一个会话密钥,然后用这个会话密钥对数据进行加密。DPAPI只存储用于派生会话密钥的16字节干扰值,这些干扰值是用来产生加密数据的关键。当DPAPI需要解密加密块时便从加密块中提起这16字节的干扰值,并以同样的方式再次派生出会话密钥,然后用该会话密钥并对数据进行解密。
为使本发明的目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。参照图1,示出了本发明的DPAPI加密数据的解密方法实施例的流程图,包括如下步骤:S1,对数据源所在设备进行加载;S2,在数据源中识别出Windows系统所在的系统分区,读取所述系统分区内的文件;S3,获取系统分区内需要解密的文件和所有用户的主密钥文件;S4,在所述需要解密的文件中获取所有DPAPI加密块;S5,对所有DPAPI加密块进行解析,以获取所有DPAPI加密块各自的第一解密关键信息,其中,所述第一解密关键信息包括加密密钥唯一标识、第一加密算法标识、第一安全散列算法标识和加密散列输出数据;S6,根据所述加密密钥唯一标识获取每个DPAPI加密块的主密钥文件;S7,对每个DPAPI加密块的主密钥文件进行解析,以获取第二解密关键信息,其中,所述第二解密关键信息包括第二干扰值、第二基于口令的密钥派生函数迭代次数、第二安全散列算法标识、第二加密算法标识和主密钥文件密文;S8,根据本次登录密码、系统熵参数和所述第一、第二解密关键信息对DPAPI加密块进行解密。
在S1中,对数据源所在设备进行加载,并解析出数据源中文件的结构,在本发明的优选实施例中,将数据源中的文件以树形结构存储于数据源的内存中。
在S1之前,还可包括判断所述数据源的类型的步骤,其中,所述数据源的类型包括存储介质、系统分区和单个文件。在本发明的优选实施例中,通过判断树形结构文件的顶层根节点类型来判断数据源的类型。
在S3中的获取系统分区内所有用户的主密钥文件的步骤具体包括:S31,获取系统分区的Documents目录或Users目录;S32,读取所述Documents目录或Users目录中的所有用户名目录,以获取所有用户名目录中的主密钥文件,并存储于数据源的主密钥文件集中。在不同的操作系统中,主密钥文件的存储路径是不同的,如表二所示。

表二
在表二中,{CD}为操作系统所在分区,{username}为Windows系统账户名,每个系统账户都有其对应的若干个主密钥,{sid}是Windows系统为区分不同账户而为其分配的全局唯一标识符,其格式固定。而用户名主要为了方便系统用户记忆而设置的,Windows系统内部并不用其来区分不同的用户。另外,与主密钥文件对应的历史凭据文件存储于主密钥文件的上一层目录。
由DPAPI加密块并不总是以单个完整的文件存在,有可能包含在文件中,甚至一个文件可以包含多个DPAPI加密块,因此,需要根据相应的特征从需要解密的文件中检索和获取DPAPI加密块。根据本发明的优选实施例中,S4具体包括如下步骤:S41,判断需要解密的文件中是否包括DPAPI加密块的头部数据信息0x010000000D08C9DDF0115D1118C7A00C04FC297EB;S42,若不包括,则说明文件中不存在DPAPI加密块;若包括,则根据所述头部数据信息获取DPAPI加密块。其中,所述DPAPI加密块为调用了DPAPI的加密函数CryptProtectData后输出的数据块,DPAPI加密块中存储了解密时所需的部分数据信息,包括所使用的加密算法标识、安全散列算法类型、干扰值等。参看图3,为Windows XP系统调用CryptProtectData加密函数生成的一个标准DPAPI加密块的示意图。
在S5中,将获取的第一解密关键信息存储于数据源的DPAPI解析结果集中。其中,第一解密关键信息如表三所示。
关键信息名称占用长度(单位:字节)符号表示加密密钥唯一标识16keyGuid第一加密算法标识4dwCryptoAlgId加密密钥长度4dwCryptoAlgIdKeyBitLen加密算法干扰值16pbyCryptoAlgSalt第一安全散列算法标识4dwHashAlgId消息摘要长度4dwHashDigestBitLen散列算法干扰值16pbyHashSalt密文长度4dwCipherDataLen第一密文dwCipherDataLenpbyCipherData加密散列输出数据长度4dwHmacDataLen加密散列输出数据dwHmacDataLenpbyHmacData
表三
在S7中,所述主密钥文件共包含5个数据单元,分别为主密钥头部单元、用户主密钥单元、本地加密密钥单元、历史凭据标识单元和域密钥备份单元。其中,主密钥头部单元,包含一个GUID全局唯一标识,该标识与DPAPI加密块中的加密密钥唯一标识keyGuid相对应,同时,主密钥头部单元还用来指示各其他各单元占用字节数。历史凭据单元也包含一个全局唯一标识符credhistGuid,用来指示跟该主密钥文件对应的历史凭据文件。域密钥备份单元,只有域环境下的用户下才有此单元,此单元的数据经过了域管理员的公钥加密处理,对于单机用户无论是什么系统都没有这个单元。对加密主密钥的解析主要是指对用户主密钥单元的解析,用户主密钥单元中包含一个经过加密的二进制加密块,其包含的加密数据就是用来加密数据的主密钥,参看图4为XP系统的一个主密钥文件的示意图。其中,获取的第二解密关键信息参看表四所示。
关键信息名称占用长度(单位:字节)符号表示第二干扰值16pbkSalt第二基于口令的密钥派生函数迭代次数4dwPbkdf2Num第二安全散列算法标识4dwHmacAlgId第二加密算法标识4dwCryptoAlgId第二主密钥密文dwCipherDataLenpbyCipherData
表四
对于不同的操作系统,如表四中所示的从主密钥文件解析的第二解密关键信息默认值是不同的,请参看表五所示。
操作系统加密散列算法迭代次数安全散列算法类型加密算法类型Windows XP4000SHA‑1DES‑3Windows 20034000SHA‑1DES‑3Windows Vista24000SHA‑1DES‑3Windows75600SHA‑512AES‑256Windows88000SHA‑512AES‑256
表五
在S8中,具体包括如下步骤:S81,计算本次登录密码的安全散列值;S82,根据所述安全散列值和第二解密关键信息对所述主密钥文件密文进行解密,以获取主密钥明文;S83,计算所述主密钥明文的加密散列值,并将所述主密钥明文的加密散列值与所述第一加密散列输出数据进行比较,若两个值相等,则对所述主密钥密文解密成功,获取主密钥;S84,根据所述主密钥和第一解密关键信息对DPAPI加密块进行解密,以获取DPAPI加密块的明文。
下面将根据本发明的优选实施例对S8做更详细的描述。
在S81中,具体包括如下步骤:S811,将本次登录密码szPwd和用户唯一标识符szSid转换成unicode编码形式,分别记为wszPwd和wszSid;S812,计算wszPwd的SHA‑1安全散列值,记为sha1WszPwd。
在S82中,具体包括如下步骤:S821,使用第二解密关键信息中dwHmacAlgId标识的散列算法,并以sha1WszPwd为密钥,计算wszSid的加密散列值,记为hashWszSid;S822,使用第二解密关键信息中dwHmacAlgId标识的散列算法,dwPbkdf2Num标识的迭代次数,并以hashWszSid为口令,以干扰值pbySalt为消息调用基于口令的密钥派生函数PBKDF2,派生出一对会话密钥和初始化向量,分别记为sessionKey和sessionIv;S823,使用dwCryptoAlgId标识的对称加密算法,并以sessionKey和sessionIv为解密密钥和解密向量对密文pbyCipherData进行解密,获取解密后的明文,即为clearKeyData。
在S83中,具体包括如下步骤:S831,截取明文clearKeyData的前16字节为计算主密钥加密散列的干扰值,记为hmacSalt;S832,从明文clearKeyData第16字节开始截取N个字符记为系统事先计算好的主密钥HMAC值,其中,N的值等于第一解密关键信息中的消息摘要长度的值;S833,截取明文clearText最后64字节为主密钥,记为masterkey;S834,使用第二解密关键信息中的dwHmacAlgId标识的散列算法,以hashWszSid为密钥,计算hmacSalt加密散列值,记为hmacKey;S834使用第二解密关键信息中dwHmacAlgId标识的散列算法,以hmacKey为密钥,计算masterkey加密散列值,记为checkMasterkey; S835, 判断checkMasterkey与第二解密关键信息中的pbyHmacData是否相等,若相等,则说明解密成功,获取其中64字节的主密钥;若不相等,则说明数据可能被篡改过。
在S84中,具体包括如下步骤:S841,使用第一解密关键信息中dwHmacAlgId标识的散列算法,计算主密钥masterkey散列值,记为hashMasterkey;S842,使用第一解密关键信息中dwHmacAlgId标识的散列算法, 以hashMasterkey为密钥,计算第一解密关键信息pbySalt和系统熵参数entrypy的加密散列值,记为hmacMasterkey;S843,使用第一解密关键信息中dwHmacAlgId标识的散列算法、dwCryptoAlgId 标识的加密算法,输入hmacMasterkey,派生出最后的对称加密密钥,记为lastSessionKey;S844,使用第一解密关键信息中dwCryptoAlgId 标识的加密算法, 以lastSessionKey为解密密钥和以全0向量为解密向量对密文pbyCipherData解密操作,若解密成功则获取DPAPI加密块的明文。
进一步的,DPAPI正常运作的情况下会保存用户所有的历史登陆密码,用户所有的历史登陆密码存储在一个文件名为CREDHIST的历史凭据文件容器中。 历史凭据文件CREDHIST以链表的形式存储用户历史登录密码的散列值,每个用户登录密码散列值作为链表的一个节点,整个链表在文件中是以倒着的形式存储,即表头在最后,倒数第二个记录是第一个节点,依次类推。而每个链表节点都具有如下固定的格式。如图5所示为XP系统下的只包含一个历史凭据节点的标准的CREDHIST文件结构。
在S3获取所有用户的主密钥文件后,还包括如下步骤:S33,获取与主密钥文件相对应的历史凭据文件;S34,对所述历史凭据文件进行解析,以获取第三解密关键信息,其中所述第三解密关键信息包括第三安全散列算法标识、第三基于口令的密钥派生函数迭代次数、第三加密算法标识、第三干扰值和历史凭据文件密文。
在S34的基础上,若S8对DPAPI加密块解密失败,在S84后还包括如下步骤:S85,根据第三解密信息和第N次登录密码的安全散列值获取第N‑1次登录密码的安全散列值;S86,根据所述第N‑1次登录密码的安全散列值和第一解密关键信息再次对DPAPI加密块进行解密,若解密成功,则可获取DPAPI加密块的明文;若解密失败,则重复S85和S86,直至处理完历史凭据文件中所有的历史登录密码。其中,第N‑1次为第N次的的上一次,设定第N次的初始值为本次,则第N‑1次为上次,以此类推。根据本发明的优选实施例,S85具体为:使用第三解密关键信息中dwHashAlgId标识的散列算法,并以本次登录密码的安全散列值sha1WszPwd为密钥,计算上次登录密码的的安全散列值,记为preSha1WszPwd;在S86中,具体包括如下步骤,S861,使用第一解密关键信息中dwHashAlgId标识的散列算法,dwPbkdf2Num标识的迭代次数,并以preSha1WszPwd为口令,以干扰值pbySalt为消息调用基于口令的密钥派生函数PBKDF2,派生出一对会话密钥和初始化向量,分别记为sessionKey和sessionIv;S862,使用dwCryptoAlgId标识的对称加密算法,并以sessionKey和sessionIv为解密密钥和解密向量对密文pbyCipherData进行解密,若解密成功,则获取解密后的明文,即为credclearData;S863,截取credClearData前20字节为上一次登录密码的安全散列值,记为newSha1WszPwd;若解密失败,则令sha1WszPwd=newSha1WszPwd,重复执行S9和S10直至处理完历史凭据文件中所有的历史登录密码。
本发明还提供一种DPAPI加密数据的解密系统,参看图2所示为本发明DPAPI加密数据的解密系统的示意图,包括:加载单元21,用于对数据源所在设备进行加载;识别与读取单元22,用于在数据源中识别出Windows系统所在的系统分区,读取所述系统分区内的文件;第一文件获取单元23,用于获取系统分区内需要解密的文件和所有用户的主密钥文件;加密块获取单元24,用于在所述需要解密的文件中获取所有DPAPI加密块;第一解密关键信息获取单元25,用于对所有DPAPI加密块进行解析,以获取所有DPAPI加密块各自的第一解密关键信息,其中,所述第一解密关键信息包括加密密钥唯一标识、第一加密算法标识、第一安全散列算法标识和第一加密散列输出数据;加密主密钥文件获取单元26,用于根据所述加密密钥唯一标识获取每个DPAPI加密块的主密钥文件;第二解密关键信息获取单元27,用于对每个主密钥文件进行解析,以获取第二解密关键信息,其中,所述第二解密关键信息包括第二干扰值、第二基于口令的密钥派生函数迭代次数、第二安全散列算法标识、第二加密算法标识和主密钥文件密文;解密单元28,用于根据本次登录密码、系统熵参数和所述第一、第二解密关键信息对DPAPI加密块进行解密。
进一步的,所述系统还包括数据源判断单元29,用于在对数据源所在设备进行加载之前判断数据源的类型,所述数据源的类型包括存储介质、系统分区和单个文件。
进一步的,所述第一文件获取单元23具体包括:目录获取子单元231,用于获取系统分区的Documents目录或Users目录;主密钥文件获取子单元232,用于读取所述Documents目录或Users目录中的所有用户名目录,以获取所有用户名目录中的主密钥文件。
进一步的,所述加密块获取单元24具体包括:加密块判断子单元241,用于判断需要解密的文件中是否包括DPAPI加密块的头部数据信息;加密块获取子单元242,用于当需要解密的文件中包括DPAPI加密块的头部数据信息时,根据所述头部数据信息获取DPAPI加密块。
进一步的,所述解密单元28具体包括:散列值计算子单元281,用于计算用户输入的登录密码的安全散列值;主密钥明文获取子单元282,用于根据所述安全散列值和第二解密关键信息对所述主密钥文件密文进行解密,以获取主密钥明文;主密钥获取子单元283,用于计算所述主密钥明文的加密散列值,并将所述主密钥明文的加密散列值与所述第一加密散列输出数据进行比较,若两个值相等,则获取主密钥;DPAPI加密块明文获取子单元284,用于根据所述主密钥和第一解密关键信息对DPAPI加密块的密文进行解密,以获取DPAPI加密块的明文。
更进一步的,所述系统还包括:历史凭据文件获取单元30,用于在获取所有用户的主密钥文件后,获取与加密主密钥文件相对应的历史凭据文件;历史凭据文件解析单元31,用于对所述历史凭据文件进行解析,以获取第三解密关键信息,其中所述第三解密关键信息包括第三安全散列算法标识、第三基于口令的密钥派生函数迭代次数、第三加密算法标识、第三干扰值和历史凭据文件密文。
所述解密单元28还包括:散列值获取子单元285,用于根据第三解密关键信息和第N次登录密码的安全散列值获取第N‑1次登录密码的安全散列值;解密子单元286,根据所述第N‑1次登录密码的安全散列值和第一解密关键信息对DPAPI加密块进行解密,若解密成功,则获取DPAPI加密块的明文;若解密失败,则重复上述步骤;其中,第N次的初始值为本次,第N‑1次为第N次的的上一次。
本发明提供的DPAPI加密数据的解密方法和系统,首先,可实现对DPAPI加密数据的离线解密,无需依赖目标数据源所在设备上的操作系统,即便由于系统文件损坏或者丢失等导致操作系统无法启动情况下,根据本发明所述的第一、第二、第三解密关键信息即可对加密数据进行解密。而且,在操作系统上有多个系统账户时,本发明也无须依次登录每一个系统账户获取该账户的加密数据,在知道每一个用户的登录密码情况下,可一次性批量的解密每个用户的加密数据,在提高了解密效率的同时满足了对数据源的只读要求。其次,本发明并不依赖CryptAPI接口,无需调用CryptoAPI函数,不受不同的Windows操作系统的限制,可满足跨平台的要求。
目前测试可知,本发明可以离线解密获取IE自动保存的HTTP身份认证用户名和密码,IE、Firefox、chrome等浏览器自动表单的保存的用户名和密码以及skype、msn、OutLook等其他应用程序自动登录时设置的用户名和密码,另外本发明支持Windows xp、2003、vista、7、8等目前常用的主流操作系统,应用价值广泛。本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于系统实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上对本发明所提供的一种DPAPI加密数据的解密方法和系统进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

一种DPAPI加密数据的解密方法和系统.pdf_第1页
第1页 / 共20页
一种DPAPI加密数据的解密方法和系统.pdf_第2页
第2页 / 共20页
一种DPAPI加密数据的解密方法和系统.pdf_第3页
第3页 / 共20页
点击查看更多>>
资源描述

《一种DPAPI加密数据的解密方法和系统.pdf》由会员分享,可在线阅读,更多相关《一种DPAPI加密数据的解密方法和系统.pdf(20页珍藏版)》请在专利查询网上搜索。

1、(10)申请公布号 CN 103116730 A(43)申请公布日 2013.05.22CN103116730A*CN103116730A*(21)申请号 201310020303.5(22)申请日 2013.01.21G06F 21/62(2013.01)H04L 9/06(2006.01)(71)申请人厦门市美亚柏科信息股份有限公司地址 361008 福建省厦门市软件园二期观日路12号美亚柏科大厦(72)发明人陈江勇 钱镜洁 林艺滨(74)专利代理机构北京恒都律师事务所 11395代理人邸建凯(54) 发明名称一种DPAPI加密数据的解密方法和系统(57) 摘要本发明提供了一种DPAPI加。

2、密数据的解密方法和系统,方法包括:对数据源所在设备进行加载;在数据源中识别出Windows系统所在系统分区并读取其内文件;获取需要解密的文件和所有用户的主密钥文件;在需要解密的文件中获取所有DPAPI加密块;解析所有DPAPI加密块获取包括加密密钥唯一标识的第一解密关键信息;根据加密密钥唯一标识获取每个DPAPI加密块的主密钥文件;解析所述主密钥文件获取第二解密关键信息,第二解密关键信息包括第二干扰值、第二基于口令的密钥派生函数迭代次数;根据本次登录密码、系统熵参数和第一、第二解密关键信息对DPAPI加密块进行解密;通过本发明的方法和系统,可实现对数据源的只读操作且不受操作系统的限制而满足跨平。

3、台的要求。(51)Int.Cl.权利要求书3页 说明书12页 附图4页(19)中华人民共和国国家知识产权局(12)发明专利申请权利要求书3页 说明书12页 附图4页(10)申请公布号 CN 103116730 ACN 103116730 A1/3页21.一种DPAPI加密数据的解密方法,其特征在于,包括如下步骤:对数据源所在设备进行加载;在数据源中识别出Windows系统所在的系统分区,读取所述系统分区内的文件;获取系统分区内需要解密的文件和所有用户的主密钥文件;在所述需要解密的文件中获取所有DPAPI加密块;对所有DPAPI加密块进行解析,以获取所有DPAPI加密块各自的第一解密关键信息,其。

4、中,所述第一解密关键信息包括加密密钥唯一标识、第一加密算法标识、第一安全散列算法标识和加密散列输出数据;根据所述加密密钥唯一标识获取每个DPAPI加密块的主密钥文件;对所述每个DPAPI加密块的主密钥文件进行解析,以获取第二解密关键信息,其中,所述第二解密关键信息包括第二干扰值、第二基于口令的密钥派生函数迭代次数、第二安全散列算法标识、第二加密算法标识和主密钥文件密文;根据本次登录密码、系统熵参数和所述第一、第二解密关键信息对DPAPI加密块进行解密。2.如权利要求1所述的方法,其特征在于,在所述对数据源所在设备进行加载之前还包括:判断所述数据源的类型。3.如权利要求2所述的方法,其特征在于,。

5、所述数据源的类型包括存储介质、系统分区和单个文件。4.如权利要求1所述的方法,其特征在于,所述获取系统分区内所有用户的主密钥文件的步骤具体包括:获取系统分区的Documents目录或Users目录;读取所述Documents目录或Users目录中的所有用户名目录,以获取所有用户名目录中的主密钥文件。5.如权利要求1所述的方法,其特征在于,所述在需要解密的文件中获取所有DPAPI加密块的步骤,具体为:判断需要解密的文件中是否包括DPAPI加密块的头部数据信息;若包括,则根据所述头部数据信息获取DPAPI加密块。6.如权利要求1所述的方法,其特征在于,对所述DPAPI加密块进行解密的步骤,具体包括。

6、:计算本次登录密码的安全散列值;根据所述安全散列值和第二解密关键信息对所述主密钥文件密文进行解密,以获取主密钥明文;计算所述主密钥明文的加密散列值,并将所述主密钥明文的加密散列值与所述第一加密散列输出数据进行比较,若两个值相等,则对所述主密钥密文解密成功,获取主密钥;根据所述主密钥和第一解密关键信息对DPAPI加密块进行解密,以获取DPAPI加密块的明文。7.如权利要求6所述的方法,其特征在于,在获取系统分区内所有用户的主密钥文件的步骤之后,还包括:获取与主密钥文件相对应的历史凭据文件;权 利 要 求 书CN 103116730 A2/3页3对所述历史凭据文件进行解析,以获取第三解密关键信息,。

7、其中所述第三解密关键信息包括第三安全散列算法标识、第三基于口令的密钥派生函数迭代次数、第三加密算法标识、第三干扰值和历史凭据文件密文;所述方法还包括如下步骤:若对DPAPI加密块解密失败,则根据第三解密信息和第N次登录密码的安全散列值获取第N-1次登录密码的安全散列值;根据所述第N-1次登录密码的安全散列值和第一解密关键信息对所述DPAPI加密块进行解密,若解密成功,则获取DPAPI加密块的明文;若解密失败,则重复上述步骤;其中,第N次的初始值为本次,第N-1次为第N次的的上一次。8.一种DPAPI加密数据的解密系统,其特征在于,包括:加载单元,用于对数据源所在设备进行加载;识别与读取单元,用。

8、于在数据源中识别出Windows系统所在的系统分区,读取所述系统分区内的文件;第一文件获取单元,用于获取系统分区内需要解密的文件和所有用户的主密钥文件;加密块获取单元,用于在所述需要解密的文件中获取所有DPAPI加密块;第一解密关键信息获取单元,用于对所有DPAPI加密块进行解析,以获取所有DPAPI加密块各自的第一解密关键信息,其中,所述第一解密关键信息包括加密密钥唯一标识、第一加密算法标识、第一安全散列算法标识和加密散列输出数据;主密钥文件获取单元,用于根据所述加密密钥唯一标识获取每个DPAPI加密块的主密钥文件;第二解密关键信息获取单元,用于对每个DPAPI加密块的主密钥文件进行解析,以。

9、获取第二解密关键信息,其中,所述第二解密关键信息包括第二干扰值、第二基于口令的密钥派生函数迭代次数、第二安全散列算法标识、第二加密算法标识和主密钥文件密文;第一解密单元,用于根据本次登录密码、系统熵参数和所述第一、第二解密关键信息对DPAPI加密块进行解密。9.如权利要求8所述的系统,其特征在于,还包括,数据源判断单元,用于判断所述数据源的类型。10.如权利要求9所述的系统,其特征在于,所述数据源的类型包括存储介质、系统分区和单个文件。11.如权利要求8所述的系统,其特征在于,所述第一文件获取单元具体包括:目录获取子单元,用于获取系统分区的Documents目录或Users目录;主密钥文件获取。

10、子单元,用于读取所述Documents目录或Users目录中的所有用户名目录,以获取所有用户名目录中的主密钥文件。12.如权利要求8所述的系统,其特征在于,所述加密块获取单元具体包括:加密块判断子单元,用于判断需要解密的文件中是否包括DPAPI加密块的头部数据信息;加密块获取子单元,用于当需要解密的文件中包括DPAPI加密块的头部数据信息时,根据所述头部数据信息获取DPAPI加密块。13.如权利要求8所述的系统,其特征在于,所述解密单元具体包括:权 利 要 求 书CN 103116730 A3/3页4散列值计算子单元,用于计算本次登录密码的安全散列值;主密钥明文获取子单元,用于根据所述安全散列。

11、值和第二解密关键信息对所述主密钥文件密文进行解密,以获取主密钥明文;主密钥获取子单元,用于计算所述主密钥明文的加密散列值,并将所述主密钥明文的加密散列值与所述第一加密散列输出数据进行比较,若两个值相等,则对所述主密钥密文解密成功,获取主密钥;DPAPI加密块明文获取子单元,用于根据所述主密钥和第一解密关键信息对DPAPI加密块的密文进行解密,以获取DPAPI加密块的明文。14.如权利要求13所述的系统,其特征在于,所述系统还包括:历史凭据文件获取单元,用于获取与主密钥文件相对应的历史凭据文件;历史凭据文件解析单元,用于对所述历史凭据文件进行解析,以获取第三解密关键信息,其中所述第三解密关键信息。

12、包括第三安全散列算法标识、第三基于口令的密钥派生函数迭代次数、第三加密算法标识、第三干扰值和历史凭据文件密文;所述解密单元还包括:散列值获取子单元,用于当对DPAPI加密块解密失败时,根据第三解密信息和第N次登录密码的安全散列值获取第N-1次登录密码的安全散列值;解密子单元,根据所述第N-1次登录密码的安全散列值和第一解密关键信息对DPAPI加密块进行解密,若解密成功,则获取DPAPI加密块的明文;若解密失败,则重复上述步骤;其中,第N次的初始值为本次,第N-1次为第N次的的上一次。权 利 要 求 书CN 103116730 A1/12页5一种 DPAPI 加密数据的解密方法和系统技术领域00。

13、01 本发明涉及一种数据解密方法和系统,特别地,涉及一种DPAPI加密数据的解密方法和解密系统。背景技术0002 微软从Windows 2000开始便引入了一种简单易用的应用程序数据保护接口(Data Protect Application-Programming Interface,DPAPI),用来为用户程序和操作系统提供系统级别的数据保护。在Windows系统中的无线网络密码、上网密码、加密文件系统的私钥等各种私密数据全部采用DPAPI加密存储,然而DPAPI的加密机制极为复杂,微软也从未公开任何关于DPAPI的技术细节,因此,对于理解DPAPI的内部实现机制是非常困难的。0003 目前。

14、,国内还没有人研究DPAPI的离线解密方法,国外关于DPAPI的离线解密方法的相关技术文档和专利也极少。国内的取证软件对于DPAPI加密数据采用的取证方法是一种称之为“动态取证”的方法,即在获取到需要取证的目标数据源后,需运行安装在目标源设备上的操作系统,并登录对应的账户,然后在该账户上安装对应的取证软件,取证软件内部再通过调用CryptUnProtectData函数来解密加密的数据,最后在界面上进行展示。这种取证方法直接依赖于目标源的操作系统,在运行操作系统过程中很可能会污染目标源的数据,无法达到对目标数据源只读的要求。国外虽有部分软件能实现DPAPI的离线解密,但是都是直接调用加密应用程序。

15、编程接口(CryptoAPI)来实现的,并未对CryptoAPI接口的内部算法作分析和实现,由于CryptoAPI直接依赖于Windows操作系统而且不同的操作系统支持的安全函数不同,导致这些软件无法实现跨平台的要求,而且在某些版本的Windows系统上甚至还无法正常解密。0004 总之,需要本领域技术人员迫切解决的一个技术问题就是:如何能够无需依赖数据源所在设备上的操作系统,也无需调用CryptoAPI函数以实现对DPAPI加密数据的解密。发明内容0005 本发明所要解决的技术问题是提供一种对DPAPI加密数据的解密方法和系统,可实现对DPAPI加密数据的离线解密,无需依赖目标数据源所在设备。

16、上的操作系统,也无需依赖CryptoAPI接口,进而实现对目标数据源的只读操作且不受操作系统的限制而满足跨平台的要求。0006 为了解决上述问题,本发明一方面提供了一种DPAPI加密数据的解密方法,包括如下步骤:对数据源所在设备进行加载;在数据源中识别出Windows系统所在的系统分区,读取所述系统分区内的文件;获取系统分区内需要解密的文件和所有用户的主密钥文件;在所述需要解密的文件中获取所有DPAPI加密块;说 明 书CN 103116730 A2/12页6对所有DPAPI加密块进行解析,以获取所有DPAPI加密块各自的第一解密关键信息,其中,所述第一解密关键信息包括加密密钥唯一标识、第一加。

17、密算法标识、第一安全散列算法标识和加密散列输出数据;根据所述加密密钥唯一标识获取每个DPAPI加密块的主密钥文件;对所述每个DPAPI加密块的主密钥文件进行解析,以获取第二解密关键信息,其中,所述第二解密关键信息包括第二干扰值、第二基于口令的密钥派生函数迭代次数、第二安全散列算法标识、第二加密算法标识和主密钥文件密文;根据本次登录密码、系统熵参数和所述第一、第二解密关键信息对DPAPI加密块进行解密。0007 优选的,在所述对数据源所在设备进行加载之前还包括:判断所述数据源的类型。其中,所述数据源的类型包括存储介质、系统分区和单个文件。0008 优选的,所述获取系统分区内所有用户的主密钥文件的。

18、步骤具体包括:获取系统分区的Documents目录或Users目录;读取所述Documents目录或Users目录中的所有用户名目录,以获取所有用户名目录中的主密钥文件。0009 优选的,所述在需要解密的文件中获取所有DPAPI加密块的步骤,具体为:判断需要解密的文件中是否包括DPAPI加密块的头部数据信息;若包括,则根据所述头部数据信息获取DPAPI加密块。0010 优选的,对所述DPAPI加密块进行解密的步骤,具体包括:计算本次登录密码的安全散列值;根据所述安全散列值和第二解密关键信息对所述主密钥文件密文进行解密,以获取主密钥明文;计算所述主密钥明文的加密散列值,并将所述主密钥明文的加密散。

19、列值与所述第一加密散列输出数据进行比较,若两个值相等,则对所述主密钥密文解密成功,获取主密钥;根据所述主密钥和第一解密关键信息对DPAPI加密块进行解密,以获取DPAPI加密块的明文。0011 优选的,在获取系统分区内所有用户的主密钥文件的步骤之后,还包括:获取与主密钥文件相对应的历史凭据文件;对所述历史凭据文件进行解析,以获取第三解密关键信息,其中所述第三解密关键信息包括第三安全散列算法标识、第三基于口令的密钥派生函数迭代次数、第三加密算法标识、第三干扰值和历史凭据文件密文;所述方法还包括如下步骤:若对DPAPI加密块解密失败,则根据第三解密信息和第N次登录密码的安全散列值获取第N-1次登录。

20、密码的安全散列值;根据所述第N-1次登录密码的安全散列值和第一解密关键信息对所述DPAPI加密块进行解密,若解密成功,则获取DPAPI加密块的明文;若解密失败,则重复上述步骤;其中,第N次的初始值为本次,第N-1次为第N次的的上一次。0012 本发明另一方面提供了一种与DPAPI加密数据的解密方法相对应的解密系统,包括:说 明 书CN 103116730 A3/12页7加载单元,用于对数据源所在设备进行加载;识别与读取单元,用于在数据源中识别出Windows系统所在的系统分区,读取所述系统分区内的文件;第一文件获取单元,用于获取系统分区内需要解密的文件和所有用户的主密钥文件;加密块获取单元,用。

21、于在所述需要解密的文件中获取所有DPAPI加密块;第一解密关键信息获取单元,用于对所有DPAPI加密块进行解析,以获取所有DPAPI加密块各自的第一解密关键信息,其中,所述第一解密关键信息包括加密密钥唯一标识、第一加密算法标识、第一安全散列算法标识和加密散列输出数据;主密钥文件获取单元,用于根据所述加密密钥唯一标识获取每个DPAPI加密块的主密钥文件;第二解密关键信息获取单元,用于对每个DPAPI加密块的主密钥文件进行解析,以获取第二解密关键信息,其中,所述第二解密关键信息包括第二干扰值、第二基于口令的密钥派生函数迭代次数、第二安全散列算法标识、第二加密算法标识和主密钥文件密文;第一解密单元,。

22、用于根据本次登录密码、系统熵参数和所述第一、第二解密关键信息对DPAPI加密块进行解密。0013 优选的,所述系统还包括,数据源判断单元,用于判断所述数据源的类型。其中,所述数据源的类型包括存储介质、系统分区和单个文件。0014 优选的,所述第一文件获取单元具体包括:目录获取子单元,用于获取系统分区的Documents目录或Users目录;主密钥文件获取子单元,用于读取所述Documents目录或Users目录中的所有用户名目录,以获取所有用户名目录中的主密钥文件。0015 优选的,所述加密块获取单元具体包括:加密块判断子单元,用于判断需要解密的文件中是否包括DPAPI加密块的头部数据信息;加。

23、密块获取子单元,用于当需要解密的文件中包括DPAPI加密块的头部数据信息时,根据所述头部数据信息获取DPAPI加密块。0016 优选的,所述解密单元具体包括:散列值计算子单元,用于计算本次登录密码的安全散列值;主密钥明文获取子单元,用于根据所述安全散列值和第二解密关键信息对所述主密钥文件密文进行解密,以获取主密钥明文;主密钥获取子单元,用于计算所述主密钥明文的加密散列值,并将所述主密钥明文的加密散列值与所述第一加密散列输出数据进行比较,若两个值相等,则对所述主密钥密文解密成功,获取主密钥;DPAPI加密块明文获取子单元,用于根据所述主密钥和第一解密关键信息对DPAPI加密块的密文进行解密,以获。

24、取DPAPI加密块的明文。0017 优选的,所述系统还包括:历史凭据文件获取单元,用于获取与主密钥文件相对应的历史凭据文件;历史凭据文件解析单元,用于对所述历史凭据文件进行解析,以获取第三解密关键信息,其中所述第三解密关键信息包括第三安全散列算法标识、第三基于口令的密钥派生函说 明 书CN 103116730 A4/12页8数迭代次数、第三加密算法标识、第三干扰值和历史凭据文件密文;所述解密单元还包括:散列值获取子单元,用于当对DPAPI加密块解密失败时,根据第三解密信息和第N次登录密码的安全散列值获取第N-1次登录密码的安全散列值;解密子单元,根据所述第N-1次登录密码的安全散列值和第一解密。

25、关键信息对DPAPI加密块进行解密,若解密成功,则获取DPAPI加密块的明文;若解密失败,则重复上述步骤;其中,第N次的初始值为本次,第N-1次为第N次的的上一次。0018 本发明提供的对DPAPI加密数据的离线解密方法和系统,与现有技术相比,具有如下优点:第一,可实现对DPAPI加密数据的离线解密,无需依赖目标数据源所在设备上的操作系统,即便由于系统文件损坏或者丢失等导致操作系统无法启动时,根据本发明所述的第一、第二、第三关键信息即可对加密数据进行解密。而且,在操作系统上有多个系统账户时,本发明也无须依次登录每一个系统账户获取该账户的加密数据,在知道每一个用户的登录密码情况下,可一次性批量的。

26、解密每个用户的加密数据,在提高了解密效率的同时满足了对数据源的只读要求。0019 第二,本发明并不依赖CryptAPI接口,无需调用CryptoAPI函数,不受不同的Windows操作系统的限制,可满足跨平台的要求。附图说明0020 图1是本发明的DPAPI加密数据的解密方法实施例的流程图;图2是本发明的DPAPI加密数据的解密系统实施例的示意图;图3是Windows XP系统的DPAPI加密块的示意图;图4是Windows XP系统的主密钥文件的示意图;图5是Windows XP系统的只包含一个历史凭据节点的历史凭据文件的示意图。具体实施方式0021 首先,为了更好的理解本发明,下面将简单介。

27、绍一下与DPAPI相关的概念。0022 (1)加密应用程序编程接口(Cryptogra phy Application Programming Interface,CryptoAPI)是Windows平台提供的一组函数,该函数允许应用程序对用户的秘密信息进行编码、加密和数字签名等操作。CryptAPI函数内部的加密操作是在加密服务提供程序的独立模块中执行的。0023 (2)加密服务提供程序(Cryptographic Service Provider,CSP)是一组实现标准的加密和签名算法的硬件和软件的组合。每个CSP都包含一组它们自己定义并实现的函数,不同的CSP提供的安全算法不同,并且CS。

28、P是平台相关的,不同版本的Windows操作系统提供的CPS的个数和类型不同。而每个CSP都有其对应的名称和类型,其中名称必须是唯一的。目前常用的CSP类型有9种,要指定采用哪种CSP,只需在CryptAcquirecContext函数中指定即可,DPAPI一般默认使用PROV_RSA_FULL类型。0024 (3)算法标识(ALG_ID)是微软定义的一系列32位整数类型值,用于指明CryptoAPI所采用的加密或散列算法。其中,以0x66打头的标识通常表示对称加密算法,以说 明 书CN 103116730 A5/12页90x88打头的标识通常表示散列算法。例如,算法标识CALG_3DES,其。

29、对应的值为0x6603,表示为三重数据加密标准。0025 (4)安全散列算法(Secure Hash Algorithm,SHA)是散列算法中的一种,又叫做摘要算法,用于产生消息摘要(Message Digest)。在数字签名标准(Digital Signature Standard,DSS)中,安全散列算法通常和数字签名算法(Digital Signature Algorithm,DSA)一起用于对消息进行数据签名。每一个安全散列算法都有其对应的算法标识。在CryptoAPI中,SHA对应的算法标识为CALG_SHA。目前,安全散列算法有四种:SHA-1,SHA-256,SHA-384和SH。

30、A-512,可分别产生160位、256位、384位和512位长的消息摘要。0026 (5)会话密钥(Session Key)是随机产生的密钥,其使用一次后,立马被丢弃而不会被保存。在CryptoAPI中,会话密钥通常是对称加密算法的密钥。会话密钥由40-2000位随机数组成,其可以通过调用函数CryptDeriveKey同时传递一个散列值来派生。0027 (6)干扰值(Salt Value),也叫做“盐”,通常也是随机数,其一般可以看作是会话密钥的一部分。干扰值被添加到会话密钥时,其通常是以明文的形式被放置在加密数据的前端,加入干扰值可以有效地防止对称密钥算法被预先计算好的彩虹表攻击。在Cry。

31、ptoAPI中,干扰值通过函数CryptGenRandom来生成。0028 (7)基于口令的密钥派生函数(Password-Based Key Derivation Function,PBKDF)通过对干扰后的用户输入口令计算多次散列来缓和字典攻击,攻击者若想确定口令的正确性,需执行上百万条指令,导致完成一次字典攻击就需要花大量的时间。PKKDF目前有两个版本:PBKDF1和PBKDF2,两个函数均以口令、干扰值和内部函数的迭代次数等作为输入。在DPAPI中,采用的是PBKDF2版本,而且内部做了部分改动。0029 (8)加密散列函数,又叫做基于散列的消息认证代码(Hash-based Mes。

32、sage Authentication code,HMAC),使用加密散列函数需要一个密钥,同时还需指定一个散列函数,可以是MD5或SHA-1等,HMAC主要是用来确定加密的数据不被篡改。0030 (9)密钥分组链接(Cipher-Block Chaining,简称CBC)是一种加密模式,在CBC模式中,每个分组完的平文块都需要与前一个经过加密后的密文块进行异或操作,然后再进行加密操作。然而,由于第一个平文块前没有对应的加密块,因此需要使用初始化向量。CBC加密模式是微软默认使用的加密模式,本发明中所有对称加密算法如未特别说明均默认采用CBC加密模式。0031 (10)填充(Padding)是。

33、明文根据加密函数进行数据分组后,由于最后一个明文块不满足分组数据长度要求从而在尾部额外添加的数据。例如:数据分组长度是8字节,而最后一个数据块是3个字节,则需要额外填充5个字节的数据串。填充的数据串可以0数据串,01交替数据串或者其他模式的数据串,具体模式应视填充方式而定。填充的数据串解密后一般会被自动移除,微软默认的填充方式为PKCS填充,本发明中所有对称加密算法如未特别说明均默认采用PKCS填充方式。0032 下面再简要介绍一下DPAPI的加密过程。DPAPI包含两个接口,一个加密接口CryptProtectData,一个解密接口CrypUnProtectData。其中,加密CryptoD。

34、ataProtecttData接口函数原型如下:BOOL WINAPI CryptProtectData(说 明 书CN 103116730 A6/12页10DATA_BLOB* pDataIn,LPCWSTR szDataDescr,DATA_BLOB* pOptionalEntropy,PVOID pvReserved,CRYPTPROTECT_PROMPTSTRUCT* pPromptStruct,DWORD dwFlags,DATA_BLOB* pDataOut);各参数说明如下表一所示。参 数含 义pDataIn DATA_BLOB结构指针,指向需要加密的数据明文。szDataDes。

35、cr描述字符串,返回的数据包含该字符串,其未被加密,该参数为可选参数,可以为NULL。pOptionalEntropy DATA_BLOB结构指针,指向一个额外熵参数,可以是一个加密密码,该参数为可选参数,可以为NULL。若加密时设置了额外熵参数解密时必须提供同样的熵参数,否则无法解密。pvReserved保留,必须为NULL。pPromptStruct CRYPTPROTECT_PROMPTSTRUCT结构指针,用于弹出对话框与用户交互,通常为NULL。dwFlags加密标识位,通常为NULL。pDataOut DATA_BLOB结构指针,指向经过加密处理后的数据。0033 表一解密接口Cr。

36、yptProtectUnData参数跟CryptProtectData参数类似,不再赘述。0034 进一步的,CryptProtectData是对CryptoAPI的封装,其加密过程大致可以分成三个阶段,为生成主密钥、解密主密钥以及使用主密钥加密数据。0035 第一阶段:生成主密钥当应用程序调用CryptProtectData接口时,DPAPI会读取主密钥存储区下的Preferred文件,获取当前系统使用的主密钥文件及其创建时间,如果创建时间超过了90天,则生成一个新的主密钥文件。0036 为了防止攻击者对同一个加密主密钥进行长期的攻击,微软引入了主密钥的到期机制,这个到期时间微软设置为90天。

37、。即若Preferred文件中指示的主密钥创建时间与系统当前时间相差90天以上,将生成一个新的主密钥,新的主密钥将以同样的方式保护用户数据。这种主密钥过期的策略有效防止了攻击者破解唯一的主密钥后便可访问用户所有的受保护数据。DPAPI不删除任何过期主密钥,所有主密钥文件保存在用户的配置文件目录下,且全都受到用户密码的保护。同时,每一个加密块都存储着当时加密它的主密钥GUID全局唯一标识符。当需要解密加密块时,DPAPI便根据从加密块中获取GUID全局唯一标识符找到对应主密钥文件进行解密。0037 第二阶段:解密主密钥若Preferred文件指示的主密钥没有过期,DPAPI将解密对应的主密钥文件,获取64字节的主密钥。0038 由于主密钥是受到用户登陆密码的保护的,因此,DPAPI首先使用SHA-1安全散列说 明 书CN 103116730 A10。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 电学 > 电通信技术


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1