.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 );
.NET环境下的DPAPI加密编程的更多相关文章
- linux环境下给文件加密/解密的方法
原文地址:linix环境下给文件加密/解密的方法 作者:oracunix 一. 利用 vim/vi 加密:优点:加密后,如果不知道密码,就看不到明文,包括root用户也看不了:缺点:很明显让别人知 ...
- Java 环境下使用 AES 加密的特殊问题处理
在 Java 环境下使用 AES 加密,在密钥长度和字节填充方面有一些比较特殊的处理. 1. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 ...
- C#基础:.NET环境下WebConfig的加密
在将ASP.NET项目部署到服务器上时,内网环境下Web.Config往往是直接复制过去.对于外网环境,则需要对Web.Config文件进行加密. .NET环境下一共提供了2种方式的加密功能,分别是D ...
- C#基础之.NET环境下WebConfig的加密
在将ASP.NET项目部署到服务器上时,内网环境下Web.Config往往是直接复制过去.对于外网环境,则需要对Web.Config文件进行加密. .NET环境下一共提供了2种方式的加密功能,分别是D ...
- Win32 DPAPI加密编程
DPAPI函数是CryptoAPI中少有的简单易用的加密函数,调用过程简单,其调用接口几乎不涉及密码学概念.Win32 DPAPI有4个函数,它们分别是CryptProtectData.CryptUn ...
- Qt 环境下MAPX组件的编程
使用mapx打包文件可以方便的迅速开发,今天介绍一种不使用打包文件,直接使用mapx组件的编程方法. 就像之前介绍flash控件编程的方法,首先建立一个qt demo.基于那个的窗口都可以. 本den ...
- qt环境下Mapx组建的编程---------regoin
#include "widget.h" #include "ui_widget.h" #include <QPushButton> #include ...
- Windows环境下32位汇编语言程序设计(典藏版)
Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)(年,经典再现!) 罗云彬 著 ISBN 978-7-121-20759-4 2013年7月出版 定价:99.00元 756页 1 ...
- Windows环境下32位汇编语言程序设计(典藏版)
<Windows环境下32位汇编语言程序设计(典藏版) > 基本信息 作者: 罗云彬 出版社:电子工业出版社 ISBN:9787121207594 上架时间:2013-7-8 出版日期:2 ...
随机推荐
- 语法解析 rs.next()
ResultSet.next()方法将指针从当前位置下移一行.ResultSet 指针最初位于第一行之前:第一次调用 next 方法使第一行成为当前行:第二次调用使第二行成为当前行,依此类推. 如果新 ...
- 【OCP-12c】CUUG最新考试原题整理及答案(071-11)
11.(5-8) choose the best answer: Examine the structure of the BOOKS_TRANSACTIONS table. You want to ...
- 求二叉树第K层的节点个数+求二叉树叶子节点的个数
size_t _FindLeafSize(Node* root) //求二叉树叶子节点的个数 { //static size_t count = 0; if ...
- 极光开发者沙龙 JIGUANG MEETUP —— 移动应用性能优化实践
活动背景 移动互联网时代,各大互联网公司都已将自己的产品和服务全面移动化,各类新产品功能都会优先在移动 App 上尝试. 应用性能作为影响用户体验最重要的因素,在开发过程中显得尤为重要. 用户网络环境 ...
- uC/OS-II 函数之信号量相关函数
上文主要介绍了时间相关的函数,本文介绍信号量相关的函数:OSSemCreate()建立信号量函数,OSSemPend()取得使用权函数,OSSemPost()使用权递加函数 信号量介绍 如果我们想对一 ...
- IOS面试题(一)
第一次写博客,我在这里先给大家分享一些iOS中常见的面试题吧! 1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: ...
- 快速上手日期插件daterangepicker
参数介绍: 参数 格式 示例 含义 startDate MM/DD/YYYY “startDate”:”10/14/2017” 设置默认的开始日期 endDate MM/DD/YYYY “endDat ...
- weex 编译vue成js
cd 项目 1.开发 npm run web 开发过程中可以直接使用浏览器运行 npm run ios 2.打包 npm run build 会在 dist 文件夹 中生成js文件, 即可拖入ios ...
- urllib和urllib3
urllib库 urllib 是一个用来处理网络请求的python标准库,它包含4个模块. urllib.request---请求模块,用于发起网络请求 urllib.parse---解析模块,用于解 ...
- JAVA泛型方法与类型限定
泛型方法可以定义在普通类中,也可以定义在泛型类中 class ArrayAlg{ public static <T> T getMiddle(T...a){ return a[a.len ...