第十四章 调试及安全性(In .net4.5) 之 对称及非对称加密
1. 概述
本章内容包括:对称及非对称加密算法、.net中的加密类、使用哈希操作、创建和管理签名认证、代码访问权限 和 加密字符串。
2. 主要内容
2.1 使用对称和非对称加密
① 对称加密:使用同一个密钥来加密和解密数据,密钥的安全传输是一个很重要的问题。
② 非对称加密:使用两个关联的密钥(公钥和私钥),公钥公开,私钥保密。用公钥加密的信息可以用私钥解密,反之亦然。
③ 对称加密 速度快,适用大数据量情况。使用两种加密算法的组合方式,可以实现大数据的加密传输。
*密钥之外的另一种加密方式是 initialization vector(IV), 以一定的初始值随机打乱要加密的数据。
2.2 在.net平台中加解密
① Advanced Encryption Standard(AES) 是一种对称加密算法。.net平台中对应的实现是 AesManaged 类。
public static void EncryptSomeText()
{
string original = "My secret data"; using(SymmatricAlgorithm symmatricAlgorithm =
new AesManaged())
{
byte[] encrypted = Encrypt(symmatricAlgorithm, original);
string roundtrip = Decrypt(symmatricAlgorithm, encrypted); Console.WriteLine("Original: {0}", original);
Console.WriteLine("Round trip: {0}", roundtrip);
}
} static byte[] Encrypt(SymmatricAlgorithm aesAlg, string plainText)
{
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.key, aesAlg.IV); using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt =
new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
}
return msEncrypt.ToArray();
}
}
} static byte[] Decrypt(SymmatricAlgorithm aesAlg, byte[] cipherText)
{
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.key, aesAlg.IV); using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
using (CryptoStream csDecrypt =
new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader swDecrypt = new StreamReader(csDecrypt))
{
return srDecrypt.ReadToEnd();
}
}
}
}
② .net平台当然也支持非对称加密。相关的类是:RSACryptoServiceProvider 和 DSACryptoServiceProvider。
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
string publicKeyXML = rsa.ToXmlString(false);
string privateKeyXML = rsa.ToXmlString(true);
UnicodeEncoding byteConvertor = new UnicodeEncoding();
byte[] dataToEncrypt = byteConvertor.GetBytes("My secrypt data"); byte[] encryptedData;
using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(publicKeyXml);
encryptedData = rsa.Encrypt(dataToEncrypt, false);
} byte[] decryptedData;
using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(privateKeyXml);
decryptedData = rsa.Decrypt(encryptedData, false);
} string decryptedString = ByteConveror.GetString(decryptData);
Console.WriteLine(decryptedString); //
③ .net平台提供了一个key container来保存非对称密钥。
string containerName = "SecretContainer";
CspParameters csp = new CspParameters() { KeyContainerName = contrainerName };
byte[] encryptedData;
using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp))
{
encryptedData = rsa.Encrypt(dataToEncrypt, false);
}
2.3 使用哈希值
哈希操作是将一个大数据量的数据映射到一个定长的小数据量数据上。比如将所有名字信息都映射到指定的数字。这样就可以实现高效的信息检索。
class Set<T>
{
private List<T>[] buckets = new List<T>[]; public void Insert(T item)
{
int bucket = GetBucket(item.GetHashCode());
if (Contains(item, bucket))
return;
if (buckets[bucket] == null)
buckets[bucket] = new List<T>();
buckets[bucket].Add(item);
}
public bool Contains(T item)
{
return Contains(item, GetBucket(item.GetHashCode()));
} private int GetBucket(int hashCode)
{
unchecked
{
return (int)((uint)hashCode % (uint)buckets.Length);
}
} private bool Contains(T item, int bucket)
{
if (buckets[bucket] != null)
foreach(T member in buckets[bucket])
if (member.Equals(item))
return true;
return false;
}
}
哈希值还可以用于检查数据是否被篡改。
UnicodeEncoding byteConverter = new UnicodeEncoding();
SHA256 sha256 = SHA256.Create(); string data = “A paragraph of text”;
byte[] hashA = sha256.ComputeHash(byteConverter.GetBytes(data)); data = “A paragraph of changed text”;
byte[] hashB = sha256.ComputeHash(byteConverter.GetBytes(data)); data = “A paragraph of text”;
byte[] hashC = sha256.ComputeHash(byteConverter.GetBytes(data)); Console.WriteLine(hashA.SequenceEqual(hashB)); // Displays: false
Console.WriteLine(hashA.SequenceEqual(hashC)); // Displays: true
2.4 创建和管理签名认证
makecert -n “CN=WouterDeKort” -sr currentuser -ss testCertStore
public static void SignAndVerify()
{
string textToSign = “Test paragraph”;
byte[] signature = Sign(textToSign, “cn=WouterDeKort”);
// Uncomment this line to make the verification step fail
// signature[0] = 0;
Console.WriteLine(Verify(textToSign, signature));
} static byte[] Sign(string text, string certSubject)
{
X509Certificate2 cert = GetCertificate();
var csp = (RSACryptoServiceProvider)cert.PrivateKey;
byte[] hash = HashData(text);
return csp.SignHash(hash, CryptoConfig.MapNameToOID(“SHA1”));
} static bool Verify(string text, byte[] signature)
{
X509Certificate2 cert = GetCertificate();
var csp = (RSACryptoServiceProvider)cert.PublicKey.Key;
byte[] hash = HashData(text);
return csp.VerifyHash(hash,
CryptoConfig.MapNameToOID(“SHA1”),
signature);
} private static byte[] HashData(string text)
{
HashAlgorithm hashAlgorithm = new SHA1Managed();
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] data = encoding.GetBytes(text);
byte[] hash = hashAlgorithm .ComputeHash(data);
return hash;
} private static X509Certificate2 GetCertificate()
{
X509Store my = new X509Store(“testCertStore”,
StoreLocation.CurrentUser);
my.Open(OpenFlags.ReadOnly); var certificate = my.Certificates[]; return certificate;
}
2.5 使用代码访问授权
使用 code access security(CAS),应用程序可以被限制访问指定类型的资源,执行指定类型的操作。
① Declarative CAS
[FileIOPermission(SecurityAction.Demand,
AllLocalFiles = FileIOPermissionAccess.Read)]
public void DeclarativeCAS()
{
// Method body
}
② Imperative CAS
FileIOPermission f = new FileIOPermission(PermissionState.None);
f.AllLocalFiles = FileIOPermissionAccess.Read;
try
{
f.Demand();
}
catch (SecurityException s)
{
Console.WriteLine(s.Message);
}
2.6 使用加密字符串
传统的string类型无法保证字符串信息的保密性。
使用System.Security.SecureString的优势:
① 内容是加密的。 ② 保存到指定的内存区域,不会被垃圾回收器四处移动。
③ 内容可变,可以标记为只读类型。 ④ 实现了IDisposable接口,可以确保在用完后被移除。
为了降低初始化时字符串信息的安全风险:
using (SecureString ss = new SecureString())
{
Console.Write(“Please enter password: “);
while (true)
{
ConsoleKeyInfo cki = Console.ReadKey(true);
if (cki.Key == ConsoleKey.Enter) break; ss.AppendChar(cki.KeyChar);
Console.Write(“*”);
}
ss.MakeReadOnly();
}
从SecureString中获取字符串做常规使用
public static void ConvertToUnsecureString(SecureString securePassword)
{
IntPtr unmanagedString = IntPtr.Zero;
try
{
unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(securePassword);
Console.WriteLine(Marshal.PtrToStringUni(unmanagedString));
}
finally
{
Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString);
}
}
3. 总结
① 对称加密算法使用同一个key来加密和解密数据。
② 不对称加密算法使用关联的公钥和私钥来加解密数据。
③ 哈希操作是将大数据量的数据转化为较小的哈希码的过程。
④ 数字签名技术可用于验证作者的授权信息。
⑤ CAS用于限制程序对资源的访问和对具体操作的执行。
⑥ System.Security.SecureString用于更好的在内存中保存敏感数据。
第十四章 调试及安全性(In .net4.5) 之 对称及非对称加密的更多相关文章
- 第十六章 调试及安全性(In .net4.5) 之 调试程序
1. 概述 本章内容包括 如何选择合适的构建类型.创建和管理编译指令.管理程序数据文件(pdb)和指令. 2. 主要内容 2.1 构建类型 .net中默认的两种生成模式是 发布(Release)模式 ...
- 第十五章 调试及安全性(In .net4.5) 之 管理程序集
1. 概述 本章将介绍 什么是程序集.如何强命名程序集.如何把程序集放入GAC.程序集版本 以及 WinMD程序集. 2. 主要内容 2.1 什么是程序集 程序集(Assembly)概念的出现,是为了 ...
- 第十七章 调试及安全性(In .net4.5) 之 程序诊断
1. 概述 生产环境中的程序,也是不能保证没有问题的.为了能方便的找出问题,.net提供了一些特性来进行程序诊断. 这些特性包括:logging.tracing .程序性能分析(profiling) ...
- 第十三章 调试及安全性(In .net4.5) 之 验证程序输入
1. 概述 本章介绍验证程序输入的重要性以及各种验证方法:Parse.TryParse.Convert.正则表达式.JavaScriptSerializer.XML Schemas. 2. 主要内容 ...
- C和指针 (pointers on C)——第十四章:预处理器
第十四章 预处理器 我跳过了先进的指针主题的章节. 太多的技巧,太学科不适合今天的我.但我真的读,读懂.假设谁读了私下能够交流一下.有的小技巧还是非常有意思. 预处理器这一章的内容.大家肯定都用过.什 ...
- 《OpenCL异构并行编程实战》第十二至十四章
▶ 第十二章,在其他语言中使用 OpenCL ● JOCL(Java Building for OpenCL),PyOpenCL ● 一个 PyOpenCL 的例子代码,需要 pyopencl 包 i ...
- 20190827 On Java8 第十四章 流式编程
第十四章 流式编程 流的一个核心好处是,它使得程序更加短小并且更易理解.当 Lambda 表达式和方法引用(method references)和流一起使用的时候会让人感觉自成一体.流使得 Java ...
- 【odoo14】第十四章、CMS网站开发
第十四章.CMS网站开发** Odoo有一个功能齐全的内容管理系统(CMS).通过拖放功能,你的最终用户可以在几分钟内设计一个页面,但是在Odoo CMS中开发一个新功能或构建块就不是那么简单了.在本 ...
- 《Linux命令行与shell脚本编程大全》 第十四章 学习笔记
第十四章:呈现数据 理解输入与输出 标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误 1.STDIN 代表标准输入.对于终端界面 ...
随机推荐
- KSImageNamed-Xcode-master 对项目中图片提供自动提示功能的插件
.使用介绍: (1)KSImageNamed-Xcode-master的使用 安装该插件后,会对文件中图片进行智能提示. 下载地址:http://yun.baidu.com/s/1qWNkvGK
- Cocos2d-x下Lua调用自定义C++类和函数的最佳实践[转]
Cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质 ...
- Asp.net下载文件
网站上的文件是临时文件, 浏览器下载完成, 网站需要将其删除. 下面的写法, 文件读写后没关闭, 经常删除失败. /// <summary> /// 下载服务器文件,参数一物理文件路径(含 ...
- OpenStack Nova 制作 Windows 镜像
OpenStack Nova 制作 Windows 镜像 windows虚拟机ubuntuimage防火墙云计算 本贴转自http://www.vpsee.com 上次 VPSee 给 OpenS ...
- 游戏设计模式系列(一)—— 单线逻辑&&数据驱动,搞定最容易卡死的结算界面
从事游戏行业1年多了,个中心酸不知从何说起.抛开非技术的不说,一个开发者需要面对的最大问题,可能就是和策划频繁改变的需求做斗争了吧,这时候就体现了设计模式的重要性,抛开正式的设计方式不说,先讲讲我1年 ...
- MSP430F149学习之路——PWM信号
代码一: /******************************* 程序功能:ACLK=32768Hz PWM波 T=512/32768 占空比75% ******************** ...
- hadoop fs管理文件权限
sudo addgroup Hadoop#添加一个hadoop组sudo usermod -a -G hadoop larry#将当前用户加入到hadoop组 修改hadoop目录的权限sudo ch ...
- oracle 清除当前用户的回收站
--清除当前用户的回收站:purge recyclebin; --删除表数据truncate table --查看当前用户回收站select * from user_recyclebin t;
- DWR基本配置
DWR——Direct Web Remoter Servlet 供给那些想要以一种简单的方式使用Ajax和XMLHttpRequest的开发者.它具有一套JavaScript功能集,它们把从HTML页 ...
- linx 实用操作命令一
如果apache安装成为linux的服务的话,可以用以下命令操作:service httpd start 启动service httpd restart 重新启动service httpd stop ...