Windows的本地加密保护机制提供了简单的调用接口,密钥的生成、保护等事项一概由系统来处理,其编程接口称为DPAPI。这一加密保护机制的边界是用户登录帐户或者本地计算机系统,使用操作系统设定的加密处理过程保护数据和解密还原数据,用户无需关心密钥的来源和管理。使用 DPAPI加密本地敏感信息可以使应用程序免于处理生成和存储加密密钥这一难题。

在保护边界之外,DPAPI加密的保护的机制与强度与EFS类似。较EFS的差异是,同一用户帐户或者计算机保护范围之内,还可以使用可选乱数建立更细粒度的加密分割边界。持有与加密时相同安全令牌的进程,使用相同的可选乱数,都能够访问数据。本地计算机系统范围内加密的数据,只有系统启动后,本地运行的进程能够解密数据。这能够防止远程进程获得本地敏感数据,也能防止以本地多启动方式启动到其他操作系统实例,直接从硬盘获取所保护的数据。

可选乱数不会是一个强的保护,渗入本地计算机的恶意代码能够扫描文件获得存储的保护字,也可以通过键盘钩子截获口令派生的保护字。本地计算机范围保护的数据能够被所有能够在本机上运行的程序打开,攻击者如果能够获得计算机的物理控制,可以通过修改注册表、未加密文件等方式强行插入开机启动过程,也有获取这些加密数据的机会。所以,以谨慎的使用方式,保持计算机不被恶意代码侵袭仍然是实施有效加密的必要条件。

面对其设计的安全场景,DPAPI可以认为是一种强保护机制。Windows采用了精心设计的密钥管理机制保护所加密的数据。

.NET数据保护类是DPAPI的托管封装。由于这是操作系统提供的服务,应用程序无需添加额外的库。.NET  DPAPI有两个类,它们是ProtectedData类 和ProtectedMemory类,分别用于一般数据保护和内存区保护。

ProtectedData 类对字节数组进行加密。Windows 2000、XP 之后的系统中具有该功能。加密方法是调用静态 Protect函数,传递明文和可选乱数。解密方法是调用静态 Unprotect 方法,传递密文和加密时设定的可选乱数。应用程序可以指定加密的数据只能由同一用户帐户解密,或者指定由本地计算机上的任何帐户解密。这个范围由一个DataProtectionScope 枚举类型的参数指定,具体说明如下:

CurrentUser: 受保护的数据与当前用户关联。只有在当前用户上下文中运行的线程才可以取消数据保护。

LocalMachine :受保护的数据与计算机上下文关联。计算机中运行的任何进程都可以取消数据保护。此枚举值通常用于服务器(不受信任的用户无法访问服务器)上运行的服务器特定应用程序。

数据加密保护的代码示例:

ProtectedData.Protect( data, s_aditionalEntropy, DataProtectionScope.CurrentUser );

数据解密去保护的代码示例:

ProtectedData.Unprotect( data, s_aditionalEntropy, DataProtectionScope.CurrentUser );

ProtectedMemory是Vista以后引入的更高级一些的本地加密保护功能。它能够建立进程之间内存的加密隔离,这能够防止攻击者通过访问虚拟内存交换文件等内存搜索机制获取口令等敏感信息。使用 ProtectedMemory 类对内存中字节数组进行加密。这一加密过程会在内存中用密文代替明文,结果是即使搜索内存,都无法找到明文。ProtectedMemory加密的内存数据如果保存在硬盘的话,在计算机重启之后是不可以加密的。可以指定由当前进程加密的内存只能由当前进程解密、可以由所有进程解密,或者可以从相同的用户上下文解密,这一范围由MemoryProtectionScope 枚举类型的参数指定。 具体如下:

SameProcess:  只有与加密代码相同的进程中运行的代码才能解密。

CrossProcess: 任何进程中的任何代码均可使用 UnProtect 方法解密。

SameLogon: 只有与加密时相同的用户上下文中运行的代码才能解密。

内存加密保护的代码示例:

ProtectedMemory.Protect( secret, MemoryProtectionScope.SameLogon );

内存解密去保护的代码示例:

ProtectedMemory.Unprotect( secret, MemoryProtectionScope.SameLogon );

.NET环境下的DPAPI加密编程的更多相关文章

  1. linux环境下给文件加密/解密的方法

      原文地址:linix环境下给文件加密/解密的方法 作者:oracunix 一. 利用 vim/vi 加密:优点:加密后,如果不知道密码,就看不到明文,包括root用户也看不了:缺点:很明显让别人知 ...

  2. Java 环境下使用 AES 加密的特殊问题处理

    在 Java 环境下使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊的处理. 1. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 ...

  3. C#基础:.NET环境下WebConfig的加密

    在将ASP.NET项目部署到服务器上时,内网环境下Web.Config往往是直接复制过去.对于外网环境,则需要对Web.Config文件进行加密. .NET环境下一共提供了2种方式的加密功能,分别是D ...

  4. C#基础之.NET环境下WebConfig的加密

    在将ASP.NET项目部署到服务器上时,内网环境下Web.Config往往是直接复制过去.对于外网环境,则需要对Web.Config文件进行加密. .NET环境下一共提供了2种方式的加密功能,分别是D ...

  5. Win32 DPAPI加密编程

    DPAPI函数是CryptoAPI中少有的简单易用的加密函数,调用过程简单,其调用接口几乎不涉及密码学概念.Win32 DPAPI有4个函数,它们分别是CryptProtectData.CryptUn ...

  6. Qt 环境下MAPX组件的编程

    使用mapx打包文件可以方便的迅速开发,今天介绍一种不使用打包文件,直接使用mapx组件的编程方法. 就像之前介绍flash控件编程的方法,首先建立一个qt demo.基于那个的窗口都可以. 本den ...

  7. qt环境下Mapx组建的编程---------regoin

    #include "widget.h" #include "ui_widget.h" #include <QPushButton> #include ...

  8. Windows环境下32位汇编语言程序设计(典藏版)

    Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)(年,经典再现!) 罗云彬 著 ISBN 978-7-121-20759-4 2013年7月出版 定价:99.00元 756页 1 ...

  9. Windows环境下32位汇编语言程序设计(典藏版)

    <Windows环境下32位汇编语言程序设计(典藏版) > 基本信息 作者: 罗云彬 出版社:电子工业出版社 ISBN:9787121207594 上架时间:2013-7-8 出版日期:2 ...

随机推荐

  1. oracle数据库sqlldr命令的使用

    将数据导入 oracle 的方法应该很多 , 对于不同需求有不同的导入方式 , 最近使用oracle的sqlldr命令 导入数据库数据感觉是个挺不错的技术点 .  使用sqlldr命令 将文本文件导入 ...

  2. [LeetCode 题解]: Maximum Depth of Binary Tree

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  3. Razor TagHelper实现Markdown转HTML

    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 用途 Markdown的语法简洁明了.学习容易,而且功能比纯文本更强,因此有很多人 ...

  4. centos6和7的防火墙开关

    CentOS6.5查看防火墙的状态: 1 [linuxidc@localhost ~]$service iptable status 显示结果: 1 2 3 4 5 [linuxidc@localho ...

  5. 使用PLSQL Developer时中文乱码问题

    使用PLSQL Developer时中文乱码问题 一.问题: 执行一些查询结果有中文的SQL语句,显示不了中文,显示???. 二.产生的原因: 客户端与服务器端的编码不一致造成的. 三.解决方案: 1 ...

  6. OCP新题库,052新加的考题及答案整理-24题

    24. YOUR DB_RECOVERY_FILE_DEST_SIZE Is 8G. Currently, 5G of the space Is used of which 4G consists o ...

  7. 使用 WebClient 來存取 GET,POST,PUT,DELETE,PATCH 網路資源

    WebClient 基本資訊 提供通用方法使用 WebRequest 類別傳送及接收 URI (支援 http:, https:, ftp:,和 file: ) 的資源 Namespace:Syste ...

  8. MySQL中optimize的作用

    MySQL执行命令delete语句时,如果包括where条件,并不会真正的把数据从表中删除,而是将数据转换成了碎片,通过下面的命令可以查看表中的碎片数量和索引等信息: mysql > show ...

  9. Mysql:如果数据存在则更新,不存在则插入

    mysql语法支持如果数据存在则更新,不存在则插入,首先判断数据存在还是不存在的那个字段要设置成unique索引, 例如表tb_addrbook如下: 索引: 语句1:不存在插入 INSERT INT ...

  10. POJ 2253-Frogger(最小生成树的最大权)

    原题链接:点击此处 题意: 一只叫Freddy的青蛙蹲坐在湖中的一块石头上.突然他发现一只叫Fiona的青蛙在湖中的另一块石头上.Freddy想要跟Fiona约会,但由于湖水太脏,他不想游泳过去而是跳 ...