EntLib 3.1学习笔记(3) : Cryptography Application Block

简介:

http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/dnpag2crypto1.mspx?mfr=true
http://msdn2.microsoft.com/en-us/library/aa480457.aspx

只支持对称加密和Hash摘要。

1. 解决的问题:
    开发人员经常编写一些需要加密和哈希功能的应用程序,以满足其组织的安全性要求。通常需要加密由应用程序创建和维护的数据以及配置信息。另外,还需要对用于访问应用程序功能或数据的密码进行哈希运算。

    加密应用程序块通过将应用程序代码从特定的加密提供程序中抽象出来,从而简化了开发人员的工作。您可以通过更改配置来更改基础提供程序,而无需更改基础应用程序代码。它还可以封装与加密有关的常见难题(例如,加密和保留加密密钥)的最佳做法实现。

2. 使用
(0) 使用EntLib Configuration配置App.config/Web.config;
    项目中添加Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll引用;
    代码中引用命名空间using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography;
(1) Encrypt(支持DPAPI、AES、DES、3DES、RC2和自定义加密算法)

string  plainText  =   " Source " ;
string  symmProvider  =   " symmProvider " ; // EntLib Configuretion工具配置时设定的provider名字
string  target  =  Cryptographer.EncryptSymmetric(symmProvider, plainText);

(2) Decrypt

string  encryptedData  =   " ×××××××××…… " ;
string  symmProvider  =   " symmProvider " ; // EntLib Configuretion工具配置时设定的provider名字
string  plainText  =  Cryptographer.DecryptSymmetric(symmProvider, encryptedData);

(3) Hash(支持System.Security.Cryptography命名空间下的所有hash算法和自定义hash算法)

private   const   string  hashProvider  =   " hashprovider " ;
private   string  plainText  =   " password " ;
byte [] valueToHash  =  Encoding.UTF8.GetBytes(plainText); 
private   byte [] generatedHash  =  Cryptographer.CreateHash(hashProvider, valueToHash);

(4) 比较Hash是否与文本匹配

const   string  hashProvider  =   " hashprovider " ;
byte [] existingHashValue;
byte [] valueToHash  =  Encoding.UTF8.GetBytes( " password " );  
bool  comparisonSucceeded  =  Cryptographer.CompareHash(hashProvider, valueToHash, existingHashValue);

 

3. Cryptography Application Block的设计:

 

4. 关于使用对称加密时,密钥的存放
    我们知道,对称加密中加密和解密要用到同一个密钥key;如果攻击者得到了Key,它就可以解密得到原始数据,因此加密后数据的安全性就落在了对Key的保密上。在使用.Net的System.Security.Cryptography命名空间下的AES、DES、3DES、RC2等加密算法时,EntLib配置工具会有个密钥文件生成向导,将密钥进行DPAPI(Data Protection API,DPAPI的加密密钥是根据当前登录到计算机的用户名和密码信息派生出来的,由操作系统进行管理,关于DPAPI的更多知识,恶意参考下面的第6节)对称加密后存在文件Key.Key中(如果文件被删,则会加/解密失败,配置文件中的<securityCryptographyConfiguration>定义了密钥文件在本地计算机上的绝对路径)。我们可以使用下面两种方式来保护Key的安全:
(1) 使用ACL将密钥文件只授权给合适的用户。(Protect your keys with access control lists (ACL). Only grant the necessary permissions to the identities that require access to the key file. )
(2) 不要在低信任环境中的计算机上配置远程调试。(Do not configure your computer to allow remote debugging when that computer runs in a low-trust environment. An example of such a computer is a Web server that allows anonymous access. )

5. 密钥的分发:
    不用计算机上的熵(entropy)值不同,所以当我们在一台计算机上加密,而要在另一台计算机上解密时,我们不能直接传送Key.Key文件,而只能使用EntLib配置工具:
(1) 导出密钥(Export Key)->输入密码(password);
(2) 配置工具会将Key.Key文件中的密钥进行DPAPI解密,再根据输入的密码组织成密钥进行加密,生成txt文件;
(3) 传输该txt文件;
(4) 另一台计算机上,使用EntLib创建加密Provider时,选择从txt文件中导入密钥,输入刚才加密用的密钥(password),EntLib会解密txt文件并进行DPAPI加密后存到本地计算机上。

    密钥分发太繁杂了,导来导去的,实际项目中:譬如一个服务器和N个客户端,每个客户端独占一个密钥,谁会这样分发密钥!感觉玩玩还行,适用价值不高...

6. 关于DPAPI(http://www.microsoft.com/china/technet/security/guidance/secmod21.mspx):
(1) Windows2000操作系统和更高版本的操作系统提供了用于加密和解密数据的Win32数据保护API(DPAPI); 
(2) DPAPI是加密API(Crypto API)的一部分并且是在crypt32.dll中实现的。它包含两个方法:CryptProtectData和 CryptUnprotectData; 
(3) DPAPI 特别有用,因为它能够消除使用密码的应用程序所带来的密钥管理问题。虽然加密能确保数据安全,但您必须采取额外的步骤来确保密钥的安全。DPAPI使用与DPAPI函数的调用代码关联的用户帐户的密码,以便派生加密密钥。因此,是操作系统(而非应用程序)管理着密钥。 
(4) DPAPI 能够与计算机存储或用户存储(需要一个已加载的用户配置文件)配合使用。DPAPI 默认情况下用于用户存储,但您可以通过将 CRYPTPROTECT_LOCAL_MACHINE 标志传递给 DPAPI 函数来指定使用计算机存储。
(5) 这种用户配置文件方式提供了一个额外的安全层,因为它限制了哪些用户能访问机密内容。只有加密该数据的用户才能解密该数据。但是,当通过 ASP.NET Web 应用程序使用 DPAPI 时,使用用户配置文件需要您执行额外的开发工作,因为您需要采取明确的步骤来加载和卸载用户配置文件(ASP.NET 不会自动加载用户配置文件)。
(6) 计算机存储方式更容易开发,因为它不需要管理用户配置文件。但是,除非使用一个附加的熵参数,否则并不安全,因为该计算机的任何用户都可以解密数据。(熵是一个设计用来使解密机密内容更为困难的随机值)。使用附加的熵参数出现的问题在于它必须由应用程序安全地存储起来,这带来了另一个密钥管理问题。

注意:如果您将 DPAPI 和计算机存储一起使用,那么加密字符串仅适用于给定的计算机,因此您必须在每台计算机上生成加密数据。不要在场或群集中将加密数据从一台计算机复制到另一台计算机。

如果将 DPAPI 和用户存储一起使用,则可以用一个漫游的用户配置文件在任何一台计算机上解密数据。


有关对称加密和非对称加密的更多支持,可以参考我以前写的:http://www.cnblogs.com/happyhippy/category/79936.html


本文转自Silent Void博客园博客,原文链接:http://www.cnblogs.com/happyhippy/archive/2007/08/15/856147.html,如需转载请自行联系原作者

相关文章
|
设计模式 算法 Java
建造者模式(Builder Pattern)
建造者模式(Builder Pattern)是一种创建型设计模式,它可以将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
202 1
|
4天前
|
人工智能 JavaScript Linux
【Claude Code 全攻略】终端AI编程助手从入门到进阶(2026最新版)
Claude Code是Anthropic推出的终端原生AI编程助手,支持40+语言、200k超长上下文,无需切换IDE即可实现代码生成、调试、项目导航与自动化任务。本文详解其安装配置、四大核心功能及进阶技巧,助你全面提升开发效率,搭配GitHub Copilot使用更佳。
|
6天前
|
存储 人工智能 自然语言处理
OpenSpec技术规范+实例应用
OpenSpec 是面向 AI 智能体的轻量级规范驱动开发框架,通过“提案-审查-实施-归档”工作流,解决 AI 编程中的需求偏移与不可预测性问题。它以机器可读的规范为“单一真相源”,将模糊提示转化为可落地的工程实践,助力开发者高效构建稳定、可审计的生产级系统,实现从“凭感觉聊天”到“按规范开发”的跃迁。
819 12
|
2天前
|
云安全 安全
免费+限量+领云小宝周边!「阿里云2026云上安全健康体检」火热进行中!
诚邀您进行年度自检,发现潜在风险,守护云上业务连续稳健运行
1162 1
|
5天前
|
消息中间件 人工智能 Kubernetes
阿里云云原生应用平台岗位急招,加入我们,打造 AI 最强基础设施
云原生应用平台作为中国最大云计算公司的基石,现全面转向 AI,打造 AI 时代最强基础设施。寻找热爱技术、具备工程极致追求的架构师、极客与算法专家,共同重构计算、定义未来。杭州、北京、深圳、上海热招中,让我们一起在云端,重构 AI 的未来。
|
4天前
|
人工智能 JavaScript 前端开发
【2026最新最全】一篇文章带你学会Cursor编程工具
本文介绍了Cursor的下载安装、账号注册、汉化设置、核心模式(Agent、Plan、Debug、Ask)及高阶功能,如@引用、@Doc文档库、@Browser自动化和Rules规则配置,助力开发者高效使用AI编程工具。
646 4
|
10天前
|
存储 JavaScript 前端开发
JavaScript基础
本节讲解JavaScript基础核心知识:涵盖值类型与引用类型区别、typeof检测类型及局限性、===与==差异及应用场景、内置函数与对象、原型链五规则、属性查找机制、instanceof原理,以及this指向和箭头函数中this的绑定时机。重点突出类型判断、原型继承与this机制,助力深入理解JS面向对象机制。(238字)
|
8天前
|
IDE 开发工具 C语言
【2026最新】VS2026下载安装使用保姆级教程(附安装包+图文步骤)
Visual Studio 2026是微软推出的最新Windows专属IDE,启动更快、内存占用更低,支持C++、Python等开发。推荐免费的Community版,安装简便,适合初学者与个人开发者使用。
929 11
|
4天前
|
存储 人工智能 测试技术
【Claude Skills】从原理到实战的完全指南
Claude Skills通过模块化设计,将AI变为领域专家,实现工作流标准化。它支持指令封装、自动触发与脚本集成,提升复用性与协作效率,适用于个人提效与团队协同,是AI定制化的新范式。