Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇
作者:Terrylee
一.概述:
Enterprise Library Cryptography Application Block简化了开发人员在其应用程序中集成加密功能的方式。应用程序可以使用应用程序块来执行各种任务,例如加密信息、从数据创建哈希,以及比较哈希值来检验数据是否被更改。
加密应用程序块具有以下功能:
它可以减少编写样本代码来执行标准任务的需要,从而提供了可用于解决常见应用程序加密问题的实现。
它有助于维护应用程序和整个企业中一致的加密做法。
利用涵盖提供的各种功能区域且一致的体系结构模型,从而使开发人员在学习过程中少走一些弯路。
它提供了可用于解决常见应用程序加密问题的实现。
它是可扩展的,并支持加密提供程序的其他实现。
开发人员经常编写一些需要加密和哈希功能的应用程序,以满足其组织的安全性要求。通常需要加密由应用程序创建和维护的数据以及配置信息。另外,还需要对用于访问应用程序功能或数据的密码进行哈希运算。
加密应用程序块通过将应用程序代码从特定的加密提供程序中抽象出来,从而简化了开发人员的工作。您可以通过更改配置来更改基础提供程序,而无需更改基础应用程序代码。它还可以封装与加密有关的常见难题(例如,加密和保留加密密钥)的最佳做法实现。
二.使用步骤向导
1.使用配置工具为Cryptography Application Block创建配置
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzIvOS8yLzAvNDUvMjkyZDc3MmFjNDlmNjM4NzEzZTU4NWU0OTUwNGI4ZDkuanBl.jpe?w=700&webp=1)
我们看到,创建一个Cryptography Application Block后,默认的有两个Provider:Hash Provider和Sysmmetric Provider。
2.如果要创建一个Hash值,则右击Hash Provider,选择一种加密算法即可
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzIvNC8wLzgvMTcvZmRiM2ViOGZmYjQ2NDQwMzU5ZDVmMDdlNjE5NTI5YWEuanBl.jpe?w=700&webp=1)
对于创建Hash值,有一项需要配置,即可以选择时候加盐
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvOS84LzQvNzMvZjNjNjQ5ZTYyZWFiNzA1YjZlMWIxNThmYjg5MzM5YWEuanBl.jpe?w=700&webp=1)
3.创建对称加密时,首先选择一种加密算法
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzYvOS81LzIvMjcvZGFjYTY5OTMxYjA3NmM2ZjRiODgzYmQ2MGZlNjZhM2QuanBl.jpe?w=700&webp=1)
我们需要创建一个密钥,单击General按钮,生成密钥
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzkvOC82LzQvMzEvZjJlMjhkZDIxZDI3NDQ4MzIwYzA1YTg3YWRlMzhhZmUuanBl.jpe?w=700&webp=1)
对于生成的密钥,可以导出保存
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvMi8zLzIvMTYvM2QxMWY0ZWIwYTZkOTg4ZjljMTQ2YTI1ZDE4OGMwODQuanBl.jpe?w=700&webp=1)
在导出密钥时,同样可以设置是否需要密码
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvMC83LzMvNDIvMTg1YzQ3NGRlNDVmMTE4MjBhZTRjNTAyZDk0NTRmMTkuanBl.jpe?w=700&webp=1)
4.别忘了在项目中设置目录拷贝
1
copy
"
$(ProjectDir)\*.config
"
"
$(TargetDir)
"
5.编写代码
加密数据
1
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtRbXh2WTJ0VGRHRnlkQzVuYVdZPQ%3D%3D.jpg?w=700&webp=1)
/**/
///转换原字符串成字节数组
2
byte
[] valueToEncrypt
=
System.Text.Encoding.Unicode.GetBytes(
this
.inputForm.Input);
3
4
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtRbXh2WTJ0VGRHRnlkQzVuYVdZPQ%3D%3D.jpg?w=700&webp=1)
/**/
///加密数据
5
this
.encryptedContents
=
Cryptographer.EncryptSymmetric(symmProvider, valueToEncrypt);
6
7
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtRbXh2WTJ0VGRHRnlkQzVuYVdZPQ%3D%3D.jpg?w=700&webp=1)
/**/
///清空数组中的内容,很好的编程实践
8
Array.Clear(valueToEncrypt,
0
, valueToEncrypt.Length);
9
10
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtRbXh2WTJ0VGRHRnlkQzVuYVdZPQ%3D%3D.jpg?w=700&webp=1)
/**/
///转换加密后的内容成可以显示的Base64String
11
string
encryptedText
=
Convert.ToBase64String(
this
.encryptedContents);
解密数据
1
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtRbXh2WTJ0VGRHRnlkQzVuYVdZPQ%3D%3D.jpg?w=700&webp=1)
/**/
///解密数据
2
byte
[] decryptedContents
=
Cryptographer.DecryptSymmetric(symmProvider,
this
.encryptedContents);
3
4
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtRbXh2WTJ0VGRHRnlkQzVuYVdZPQ%3D%3D.jpg?w=700&webp=1)
/**/
/// 获取字符串并显示
5
string
readableString
=
System.Text.Encoding.Unicode.GetString(decryptedContents);
6
7
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtRbXh2WTJ0VGRHRnlkQzVuYVdZPQ%3D%3D.jpg?w=700&webp=1)
/**/
///清空数组中的内容
8
Array.Clear(decryptedContents,
0
, decryptedContents.Length);
获取一个Hash值
1
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtRbXh2WTJ0VGRHRnlkQzVuYVdZPQ%3D%3D.jpg?w=700&webp=1)
/**/
/// <summary>
2
/// 获取一个Hash值
3
/// </summary>
4
/// <param name="plainText"></param>
5
/// <returns></returns>
6
private
byte
[] GetHash(
string
plainText)
7
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtRbXh2WTJ0VGRHRnlkQzVuYVdZPQ%3D%3D.jpg?w=700&webp=1)
{
8
byte[] valueToHash = System.Text.Encoding.UTF8.GetBytes(plainText);
9
10
byte[] generatedHash = Cryptographer.CreateHash(hashProvider, valueToHash);
11
12![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtVM1ZpUW14dlkydFRkR0Z5ZEM1bmFXWT0%3D.jpg?w=700&webp=1)
/**//// 从内存中清空
13
Array.Clear(valueToHash, 0, valueToHash.Length);
14
15
return generatedHash;
16
}
比较Hash值
1
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtRbXh2WTJ0VGRHRnlkQzVuYVdZPQ%3D%3D.jpg?w=700&webp=1)
/**/
/// <summary>
2
/// 比较Hash值
3
/// </summary>
4
/// <param name="plainText"></param>
5
/// <param name="existingHashValue"></param>
6
/// <returns></returns>
7
private
bool
CompareHash(
string
plainText,
byte
[] existingHashValue)
8
![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtRbXh2WTJ0VGRHRnlkQzVuYVdZPQ%3D%3D.jpg?w=700&webp=1)
{
9
byte[] valueToHash = System.Text.Encoding.UTF8.GetBytes(plainText);
10
11
bool matched = Cryptographer.CompareHash(hashProvider, valueToHash, existingHashValue);
12
13![Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtVM1ZpUW14dlkydFRkR0Z5ZEM1bmFXWT0%3D.jpg?w=700&webp=1)
/**//// 从内存中清空
14
Array.Clear(valueToHash, 0, valueToHash.Length);
15
16
return matched;
17
}
总结
Cryptography Application Block应用程序块相对来说使用比较简单,有关加密和安全的更多知识,请大家多参考密码学方面的文章,这里就不详细介绍了。