C#编程总结(十一)数字证书
C#编程总结(十一)数字证书
之前已经通过文章介绍了数字证书的基础知识,包括加密和数字签名。
具体可见:
这里来讲述数字证书的概念、作用、工作原理以及具体应用。希望能够给大家一个清晰的认识。
一、概念
数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在Internet上验证通信实体身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构-----CA机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。数字证书是一种数字标识,提供用户在互联网上的身份认证,它是一个经证书授权中心数字签名的包含公开密钥拥有者信息和公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。
二、来自网络的威胁
随着互联网的逐步推广,网上购物、网银、电子商务、电子政务等也日益深入,来自网络的威胁越来越大,网络安全重要性愈显得的重要。
1、窃听
信用卡号码被窃取,个人安全信息被窃取
网络传输是在公共信道上进行的,特别是HTTP传输大多以明文传输,黑客进行窃听,获取敏感信息。

2、伪装
假冒真正的服务器,假冒真正的用户
这种在日常生活可能经常会遇到,比如,给定一个相似的域名或IP,通过这个访问的时候直接将信息提交给假冒的服务器,这时,我们的用户名密码可能被窃取,
如工商银行的网站:www.icbc.com.cn,假冒的服务器地址:www.1cbc.com.cn,而且页面内容风格极为相似,用户登陆后,信用卡号密码就会被盗取。这种手段不法分子很容易得手。记得之前也曾经有人冒充QQ网站,通过弹出带有链接的小广告,跳转到与QQ登陆画面类似的页面,来盗取QQ密码。

3、篡改
信息在提交到服务器之前被非法修改,最后将自己的钱款转入了非法者账户。
黑客可以盗取用户的Session、Cache信息,来修改提交到服务器的请求信息。

4、抵赖
除了黑客攻击之外,还有一个问题,用户可以否定自己曾经做过的事情。在日常生活中也会遇到同样的问题,比如领导明明安排的一个任务,但你可能忘记了就说不知道,没人通知你,这就叫抵赖,解决办法:领导可以调出之前的通话记录或者邮件,来反击抵赖。在网络中问题就没有这么简单了。

三、数字证书的应运而生
在面临各种网络威胁时,建立安全证书体系结构是公认的解决方案。数字证书提供了一种在网上验证身份的方式。安全证书体制主要采用了公开密钥体制,其它还包括对称密钥加密、数字签名、数字信封等技术我们可以使用数字证书,通过运用对称和非对称密码体制等密码技术建立起一套严密的身份认证系统,从而保证:信息除发送方和接收方外不被其它人窃取;信息在传输过程中不被篡改;发送方能够通过数字证书来确认接收方的身份;发送方对于自己的信息不能抵赖。
针对上述网络威胁,可以通过相应的方案予以解决,从而保证网络行为的安全。
1、Privacy(保密性)
确认信息的保密,不被窃取。
方法:通过公钥加密或者私钥加密,保证信息安全。
2、Authentication & Authorization(鉴别与授权)
确认对方的身份并确保其不越权
方法:通过CA判定证书有效性,确定对方真实身份。
3、Integrity(完整性)
确保你收到信息没有被篡改
方法:通过摘要算法或数字签名,保证数据完整性
4、Non-Repudiation(抗抵赖)
有证据保证交易不被否认
方法:通过CA有责任对相关通信行为负责,防止行为抵赖。
四、工作原理
数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥)并由本人公开,为一组用户所共享,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样信息就可以安全无误地到达目的地了。 既能保证数据的完整性,也能防止行为抵赖。
非对称加密的原理可见:C#编程总结(七)数据加密。
现在还有一个问题,谁来确定公钥的真实身份?
显然通过简单的约束以及相关算法推理不能达到这个目的。这就需要第三方,也就是我们说的中间人来进行判定。
这就是CA。
CA(Certificate Authority)是数字证书认证中心的简称,是指发放、管理、废除数字证书的机构。CA的作用是检查证书持有者身份的合法性,并签发证书(在证书上签字),以防证书被伪造或篡改,以及对证书和密钥进行管理。
现实生活中很形象的例子:我们每个人都有身份证,从技术上而言,我们完全可以自己或者找相关技工,订做自己的身份证,上面贴上自己的照片+署名,这样我们彼此就能明确身份了,但是,如果有人冒名或者改名等,其可以对自己的行为不负责任。所以需要第三方来统一定制身份证,即公安机关,并在身份证上加盖公安机关公章,对每个人的信息负责,保证其身份有效性,保证其无法抵赖,一旦发生违法犯罪的行为,即可对其进行处理。
数字证书--相当于---身份证
CA --相当于---公安机关
具体通过几种常见的通信方案,来说明数字证书的原理,
方案1:通信一方作为服务提供方,申请数字证书,保证通信安全。
企业与普通用户进行通信的过程,也可以认为是某服务器与用户的之间的通信过程。这个在现实生活中很常见。
申请数字证书流程:

用户发送信息:

企业回复(或发送)信息:

用户验证证书真实性:
用户在与企业A进行通信时,必须验证其身份,这就需要通过CA来验证其证书的有效期,防止伪装。

方案2:结合对称加密算法
公钥加密算法虽然安全,但是其加密、解密速度慢,且耗费资源。而私钥加密,密钥管理不便,但是加解密速度快。我们可以结合两种加密算法,取其所长。
先采用对此加密算法,对传输的大量信息进行加密,然后再将密钥通过非对称加密算法加密,则接收方用发送方的公钥解密获取密钥,再用密钥解密就获取到了全部信息的明文了。

方案3:通信双方都申请了数字证书
双方发送信息时,采用接收方的公钥加密,接收方打开消息时用其私钥解密。公钥来自于证书。

五、数字证书构成
我们以12306的证书做下讲解。网络购票越来越方便,在使用12306购票之前,必须安装证书。如何安装证书,在12306官网有提供。
如果已经安装过了,则可以直接打开,默认操作路径:IE-->工具-->Internet选项-->内容-->证书-->受信任的根证书颁发机构-->SRCA
具体内容如下:


来介绍几个重要的概念:
序列号
证书颁发机构 (CA) 分配给证书的唯一序列号。序列号对于给定 CA 颁发的所有证书都是唯一的。
签名算法:
CA 用于对证书进行数字签名的哈希算法。
就是指的这个数字证书的数字签名所使用的加密算法,这样就可以使用证书发布机构的证书里面的公钥,根据这个算法对指纹进行解密。指纹的加密结果就是数字签名。是先对主题证书的待签名数据,进行sha1运算,然后在用上级CA私钥进行RSA加密运算。
签名哈希算法:
生成数字签名时,获取信息的哈希值所使用的算法。具体可见:数字签名,http://www.cnblogs.com/yank/p/3533998.html
公钥:
与证书关联的公钥类型和长度。
这个我们在前面介绍公钥密码体制时介绍过,公钥是用来对消息进行加密的。这里使用的是RSA算法,公钥长度是1024位。
具体可见:
http://www.cnblogs.com/yank/p/3533998.html
使用者密钥标识符
证书所含密钥的唯一标识符,用来区分同一证书拥有者的多对密钥。
指纹和指纹算法
指纹:证书数据的摘要(即指纹)
指纹算法:为数字签名生成数据摘要(即指纹)的哈希算法。
这个是用来保证证书的完整性的,确保证书没有被修改过。 其原理就是在发布证书时,发布者根据指纹算法(hash算法)计算整个证书的hash值(指纹)并和证书放在一起,使用者在打开证书时,也根据指纹算法计算一下证书的hash值(指纹),如果与证书中的指纹一致,就说明证书没有被修改过。
六、数字证书的分类
基于数字证书的应用角度分类,数字证书可以分为以下几种:
1.服务器证书
服务器证书被安装于服务器设备上,用来证明服务器的身份和进行通信加密。服务器证书可以用来防止假冒站点。
在服务器上安装服务器证书后,客户端浏览器可以与服务器证书建立SSL连接,在SSL连接上传输的任何数据都会被加密。同时,浏览器会自动验证服务器证书是否有效,验证所访问的站点是否是假冒站点。
服务器证书保护的站点多被用来进行密码登录、订单处理、网上银行交易等。
2.电子邮件证书
电子邮件证书可以用来证明电子邮件发件人的真实性。它并不证明数字证书上面CN一项所标识的证书所有者姓名的真实性,它只证明邮件地址的真实性。
收到具有有效电子签名的电子邮件,我们除了能相信邮件确实由指定邮箱发出外,还可以确信该邮件从被发出后没有被篡改过。
另外,使用接收的邮件证书,我们还可以向接收方发送加密邮件。该加密邮件可以在非安全网络传输,只有接收方的持有者才可能打开该邮件。
3.客户端个人证书
客户端证书主要被用来进行身份验证和电子签名。
安全的客户端证书我被存储于专用的usbkey中。存储于key中的证书不能被导出或复制,且key使用时需要输入key的保护密码。使用该证书需要物理上获得其存储介质usbkey,且需要知道key的保护密码,这也被称为双因子认证。这种认证手段是目前在internet最安全的身份认证手段之一。
客户端个人证书的申请,一般需要被严格鉴证,以证明数字证书与使用者的绑定关系。该证书可以被用来进行电子签名。合法的电子证书的电子签名结果具有法律效力。因此,客户端个人证书被广泛应用于各个行业,如网络商务、电子政务、网上报税、网上银行等。
多数客户端个人证书一般具有电子邮件证书的功能。
4.企业证书
企业证书与客户端个人证书类似,可以用来进行身份验证和电子签名。区别只在于企业证书被法人或机构所拥有。
5.代码签名证书
代码签名证书用来证明软件的签发者,发布信任代码。比如网络上广泛使用的ActiveX如果未签名,浏览器会拒绝安装;而签过名的ActiveX则会被提示该软件的发行公司,由用户确认是否安装。这对于防止恶意软件假冒可信公司安装软件非常重要。
代码签名证书除了可以用于签署微软可执行代码外,也可以用来签名java代码、Symbian代码等。
七、创建证书
通常由CA提供证书创建工具。

微软提供Makecert.exe(证书创建工具)来创建证书,具体使用说明见:
http://msdn.microsoft.com/zh-cn/library/bfsktky3(v=vs.100).aspx
八、主要应用
网银、电子商务、单点登录、安全电子邮件、VPN、局域网等
C#编程总结(十一)数字证书的更多相关文章
- openssl - 数字证书的编程解析
原文链接: http://www.cangfengzhe.com/wangluoanquan/37.html 这篇文章主要介绍PKI公钥体系中非常核心元素——数字证书的编程解析.在SSL,SET等安全 ...
- 转: 在.NET中操作数字证书
作者:玄魂出处:博客2010-06-23 12:05 http://winsystem.ctocio.com.cn/19/9492019.shtml .NET为我们提供了操作数字证书的两个主要的类,分 ...
- 安全HTTPS-全面详解对称加密,非对称加密,数字签名,数字证书和HTTPS【下】
1. HTTPS 1.1. 什么是HTTPS HTTPS(HypertextTransfer Protocol Secure)即安全的HTTP.HTTPS的安全基础是安全套接层(Secure Soc ...
- 数字证书及CA介绍
数字证书及CA介绍 作者: 编程随想 发布时间: 2013-12-03 11:48 阅读: 95280 次 推荐: 69 原文链接 [收藏] ★ 先说一个通俗的例子 考虑到证书体系的 ...
- 在.NET中操作数字证书(新手教程)
.NET为我们提供了操作数字证书的两个主要的类,分为为: System.Security.Cryptography.X509Certificates.X509Certificate2类, 每个这个类的 ...
- Java加密技术(八)——数字证书
原文:http://snowolf.iteye.com/blog/391931 请大家在阅读本篇内容时先阅读 Java加密技术(四),预先了解RSA加密算法. 在构建Java代码实现前,我们需要完成证 ...
- 公钥、私钥、数字签名、数字证书、对称与非对称算法、HTTPS
作者: yoyoso https://my.oschina.net/ioslighter/blog/359207 对公钥和私钥有点稀里糊涂的,搜索了一些资料,作一些整理吧,先看这个: 加密--公钥 看 ...
- x509数字证书导入-然后删除自身
这种程序的使用场景,需要给客户一个证书,但不能把证书直接给他让他安装,程序中需要用到给客户的私钥,但又不允许客户将这个证书再去授权给其它人. 重点并不是代码,是如何对用户隐藏需要添加的资源 ,以文本为 ...
- xamarin uwp数字证书公钥私钥
对于数字证书存储导入到电脑中,采用如下方式: /// <summary> /// 导入证书 /// </summary> /// <param name="ra ...
随机推荐
- python 模块加载
python 模块加载 本文主要介绍python模块加载的过程. module的组成 所有的module都是由对象和对象之间的关系组成. type和object python中所有的东西都是对象,分为 ...
- Linux下安装Apache并以mod_wsgi方式部署django站点
源码编译方式安装Apache 首先下载Apache源码压缩包,地址为http://mirror.bit.edu.cn/apache/httpd/ 继续下载apr和apr-util压缩包,地址为http ...
- ECMAScript5 Array新增方法
数组在各个编程语言中的重要性不言而喻,但是在之前的JavaScript中数组(JavaScript 数组详解)虽然功能已经很强大,但操作方法并不完善,在ECMAScript5中做了适当的补充. Arr ...
- XCode v8.11 重量级分表分库(无视海量数据)
XCode天生就有分表分库功能,设计于2005年!历时9年,这是分表分库功能第一次针对性正式更新. 在XCode里面,分表分库非常简单,在操作数据(查询/更新)前修改Meta.ConnName/Met ...
- 爱上MVC~在Views的多级文件夹~续~分部页的支持
回到目录 之前写的一篇文章,主要针对View视图,它可以放在N级目录下,不必须非要在views/controller/action这种关系了,而在程序运行过程中,发现分页视图对本功能并不支持,原因很简 ...
- WPF入门教程系列六——布局介绍与Canvas(一)
从这篇文章开始是对WPF中的界面如何布局做一个较简单的介绍,大家都知道:UI是做好一个软件很重要的因素,如果没有一个漂亮的UI,功能做的再好也无法吸引很多用户使用,而且没有漂亮的界面,那么普通用户会感 ...
- CooMark网页颜色取色表
CooMark网页颜色取色表 艾利斯兰 - #F0F8FF - aliceblue 古董白 - #FAEBD7 - antiquewhite 浅绿色 - #00FFFF - aqua 碧绿色 - #7 ...
- js中NAN、NULL、undefined的区别
NaN:保留字(表明数据类型不是数字) undefined:对象属性或方法不存在,或声明了变量但从未赋值.即当你使用了对象未定的属性或者未定义的方法时或当你声明一个变量,但你确从未对其进行赋值,便对其 ...
- jQuery尺寸算法
我们默认都统一是采用offsetWidth或者offsetHeight取值了,但我们知道关于这2个尺寸的算法是这样的: offsetWidth = border-left-width + paddin ...
- JSP网站开发基础总结《十三》
继上一篇为大家补充过滤器类后,本篇为大家简单介绍一下如何实现验证码效果.验证码的作用是什么呢?1.防止恶意注册2.防止恶意提交3.防止盗取账户等等,总的来说验证码的存在就是为了,防止非人为的操作,不过 ...