.NET环境下的DPAPI加密编程

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 );
时间: 2024-10-29 19:10:26

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

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

在 Java 环境下使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊的处理. 1. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 Invalid AES key length 你需要下载一个支持更长密钥的包.这个包叫做 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6,可以从这里下载,下载地址:http://www.

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

在将ASP.NET项目部署到服务器上时,内网环境下Web.Config往往是直接复制过去.对于外网环境,则需要对Web.Config文件进行加密. .NET环境下一共提供了2种方式的加密功能,分别是DpapiProtectedConfigurationProvider和RsaProtectedConfigurationProvider提供程序. 前者在本机加密Web.Config后,只能在本机进行解密,如果需要将Config文件复制到外部主机,则无法进行解密.后者在本机加密Config文件后,可

Linux环境下使用同态加密库HElib

HElib库是在NTL库的基础上编写的,所以要顺利使用HElib库就得先编译NTL库: http://www.shoup.net/ntl/-- NTL库的链接 https://github.com/shaih/HElib-- HElib库的链接 1. 编译NTL库 1)进入http://www.shoup.net/ntl/.依次点击A Tour of NTL->Obtaining and Installing NTL for UNIX.默认按照第一种方式编译: % gunzip ntl-xxx.

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

#include "widget.h" #include "ui_widget.h" #include <QPushButton> #include <QToolBar> Widget::Widget(QWidget *parent) : QWidget(parent), map(nullptr), pCMapXPoint(nullptr),pCMapXPoint1(nullptr),pCMapXPoint2(nullptr), pCMapF

SSL加密编程(1) 概述

SSL是TCP/IP环境上的标准的安全加密传输协议.SSL的全称是安全的Socket层,它具有与Socket类似的客户端/服务器体制.常见的https即http+ssl,从安全的角度看,https的安全技术就是SSL加密.从建立服务的角度,配置一个web服务器提供https服务,其关键就是获取和设置所需的SSL服务器证书.SSL基本的安全约束是对服务器的验证,这一安全约束被用来防止钓鱼网站仿冒合法的网站,从而防止客户端向假的服务器,如仿冒电子邮件或者网银外观的网站,提供登录口令等敏感数据.注册一

代理服务器的理解(1):Windows环境下的代理服务器设置

浏览器中的代理服务器设置 Windows系统接口提供的代理服务器设置是一个全局的代理服务器的设置,如图所示,这里就不多解释: 各个浏览器在使用代理设置的时候,可以主动地获取代理设置亦或是不使用该代理设置,例如Chrome浏览器如果要使用代理设置,只能在图中所示的位置进行更改,所以简单地(不使用辅助性工具)为Chrome设置代理,只能通过更改系统全局代理设置(当然此时不会影响不使用该代理设置的进程),如图: 而360浏览器可以有几种选择: 它可以使用自己程序配置的代理,使用IE的代理(应该就是系统

linux网络环境下socket套接字编程(UDP文件传输)

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输. 在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux

Qt在Windows下的三种编程环境搭建(图文并茂,非常清楚)good

尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/17363165 从QT官网可以得知其支持的平台.编译器和调试器的信息如图所示: http://qt-project.org/doc/qtcreator-3.0/creator-debugger-engines.html (Home | Docs | Qt Creator 3.0 | Debuggingand Analyzing | Setting Up

Qt在Windows下的三种编程环境搭建

尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/17363165 从QT官网可以得知其支持的平台.编译器和调试器的信息如图所示: http://qt-project.org/doc/qtcreator-3.0/creator-debugger-engines.html (Home | Docs | Qt Creator 3.0 | Debuggingand Analyzing | Setting Up