集团主站
欢迎来到成都达内官方网站!达内—美国上市公司 亿元级外企IT培训企业!
成都it培训哪家好
成都it培训哪家好
全国服务监督电话:400-111-8989  |   联系客服   |
当前位置:主页 > 培训课程 > .NET >

成都.NET培训:.NET加密方式解析-数字签名

发布者: 成都达内     浏览次数:     发布时间:2017-04-20 16:08:42

数字证书和数字签名的实现主要是基于非对称加密和数字摘要,数字签名是数字证书不可或缺的一部分。这篇博客主要讲解数字签名、数字证书,以及数字签名在.NET种的实现方法。...

  数据安全的相关技术在现在愈来愈变得重要,因为人们对于自身的信息都有一种保护的欲望,不想被人获取到自己的私密信息,加密几乎已经是这个时代的关键词了。

  在这个HTTPS盛行的时代,作为一个开发人员怎么可能不去了解和学习呢。这篇博文就来给大家简单介绍一个HTTPS在.NET种的应用和实现方法。

  数字证书和数字签名的实现主要是基于非对称加密和数字摘要,数字签名是数字证书不可或缺的一部分。这篇博客主要讲解数字签名、数字证书,以及数字签名在.NET种的实现方法。

  一.数字签名概述

  1.数字签名的基本原理

  这里首先来了解一些什么叫做数字签名,数字签名是附加在数据单元上的一些数据,或是对数据单元所做的密码变换。数字签名是对非对称加密和消息摘要的应用。数签名的原理:使用非对称密钥将签名函数添加到非对称算法,创建一个“签名”,另一方接收加密的信息,使用确认函数来验证签名。有如下图:

  说明:用户A选择一个非对称签名算法创建一对新密钥,自己保留私钥,公钥发给B。用户B使用用户A的公钥来验证签名。

  将散列码做为创建数字签名,有如下图:

  将散列码作为确认一个数字签名,有如下图:

  2.数字签名的特点

  第三方不能伪造用户A的数字签名;第三方不能重新使用用户A的数字签名;第三方不能改变签名后的文件;用户A无法否认自己的签名文件。

  数字签名能够提供一种和物理签名类似的合理机制。数字签名的安全性和加密的其他方面是一样的,他们都是基于可能的有效密钥管理的。

  数字签名只采用了非对称密钥加密算法,能保证发送信息的完整性、身份认证和不可以否认行,数字加密采用了对称密钥加密算法和非对称密钥加密算法相结合的方法,能够保证发送信息的保密性。

  二.数字证书概述

  对于HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)很多开发人员都不会陌生,即使是普通用户也是比较的熟悉。数字证书(公钥证书):用于电子信息活动中电子文件行为主体的验证和证明,并可实现电子文件保密性和完整性的电子数据。数字证书是一个经证书认证中心发行的证书。

  数字证书:个人数字证书,单位数字证书、单位员工数字证书、服务器证书、VPN证书、WAP证书、代码签名证书和表单签名证书等。

  数字证书是一个经证书授权重心数字签名的包含公开密钥拥有者信息以及公开密钥的文件,最简单的证书包含一个公开密钥、名称一剂证书授权中心的数字签名。

  数字证书的特点:信息的保密性;交易者身份的确定性;不可否认性、不可修改性。

  数字证书的三种保存形式:带有私钥的证书;二进制编码的证书;Base64编码证书。

  三.DotNet数字签名核心对象解析

  在.NET中包含两种支持数字签名的非对称算法:RSA算法(为两种数据加密和数字签名定义了函数);DSA算法(支持数字签名,不支持数据加密)。在.NET中使用RSA算法进行数字签名使用RSACryptoServiceProvider类,使用DSA进行数字签名的四个核心类如下图:

  DSA类:数字签名算法DSA的基类;DSACryptoServiceProvider类:定义访问DSA算法的加密服务提供程序实现的包装对象;DSASignatureDeformatter类:验证DSA签名;DSASignatureFormatter类:创建DSA签名;

  接下来我们具体了解一下这些类:

  1.RSACryptoServiceProvider类

  (1).SignData()方法:使用指定的哈希算法计算指定输入流的哈希值,并对计算所得的哈希值签名。

  public byte[] SignData(Stream inputStream, object halg)

  {

  int calgHash = Utils.ObjToAlgId(halg, OidGroup.HashAlgorithm);

  return this.SignHash(Utils.ObjToHashAlgorithm(halg).ComputeHash(inputStream), calgHash);

  }

  该方法存在三个重载方法,三个重载方法的第一个参数不同,分别是Stream、byte[]两个类型。由代码可以看出,该方法接受两个参数,inputStream是要计算其哈希值的输入数据,halg用于创建哈希值的哈希算法。SignHash()通过用私钥对其进行加密来计算指定哈希值的签名。

  (2).VerifyData():通过使用提供的公钥确定签名中的哈希值并将其与所提供数据的哈希值进行比较验证数字签名是否有效。

  public bool VerifyData(byte[] buffer, object halg, byte[] signature)

  {

  int calgHash = Utils.ObjToAlgId(halg, OidGroup.HashAlgorithm);

  return this.VerifyHash(Utils.ObjToHashAlgorithm(halg).ComputeHash(buffer), calgHash, signature);

  }

  该方法没有重载版本,有源码可以看出该方法接收三个参数,分别是:buffer已签名的数据,halg用于创建数据的哈希值的哈希算法名称,signature要验证的签名数据。该方法返回一个布尔类型,如果签名有效,则为 true;否则为 false。

  VerifyHash()通过使用提供的公钥确定签名中的哈希值并将其与提供的哈希值进行比较来验证数字签名是否有效。

  2.DSA类解析

  (1).CreateSignature():创建指定数据的 Cryptography.DSA 签名。

  public abstract byte[] CreateSignature(byte[] rgbHash);

  该方法为一个抽象方法,在派生类中重写,接受一个字节数组表示要签名的数据,返回指定数据的数字签名。在使用CreateSignature方法时,必须自己创建SHA-1散列码,返回一个用字节数组表示的DSA签名。

  (2).VerifySignature():验证指定数据的 Cryptography.DSA 签名。

  public abstract bool VerifySignature(byte[] rgbHash, byte[] rgbSignature);

  该方法接受字符数组表示的SHA-1散列码和签名来验证。

  3.DSACryptoServiceProvider类解析

  (1).ImportParameters():导入指定的 DSAParameters。该方法接受一个参数,Cryptography.DSA的参数。

  (2).VerifyData():通过将指定的签名数据与为指定数据计算的签名进行比较来验证指定的签名数据。

  public bool VerifyData(byte[] rgbData, byte[] rgbSignature)

  {

  return this.VerifyHash(this._sha1.ComputeHash(rgbData), (string) null, rgbSignature);

  }

  该方法接受两个参数,rgbData已签名的数据;rgbSignature要验证的签名数据,如果签名验证为有效,则为 true;否则,为 false。

  VerifyHash()通过将指定的签名数据与为指定哈希值计算的签名进行比较来验证指定的签名数据,我们看一下VerifyHash()的实现代码:

  public bool VerifyHash(byte[] rgbHash, string str, byte[] rgbSignature)

  {

  if (rgbHash == null)

  throw new ArgumentNullException("rgbHash");

  if (rgbSignature == null)

  throw new ArgumentNullException("rgbSignature");

  int calgHash = X509Utils.NameOrOidToAlgId(str, OidGroup.HashAlgorithm);

  if (rgbHash.Length != this._sha1.HashSize / 8)

  {

  string key = "Cryptography_InvalidHashSize";

  object[] objArray = new object[2];

  int index1 = 0;

  string str1 = "SHA1";

  objArray[index1] = (object) str1;

  int index2 = 1;

  // ISSUE: variable of a boxed type

  __Boxed local = (ValueType) (this._sha1.HashSize / 8);

  objArray[index2] = (object) local;

  throw new CryptographicException(Environment.GetResourceString(key, objArray));

  }

  this.GetKeyPair();

  return Utils.VerifySign(this._safeKeyHandle, 8704, calgHash, rgbHash, rgbSignature);

  }

  该方法接收三个参数,rgbHash要签名的数据的哈希值,str用于创建数据的哈希值的哈希算法名称,rgbSignature要验证的签名数据。

  4.X509Certificate类解析

  该类在System.Security.Cryptography.X509Certificates空间下,提供帮助你使用 X.509 v.3 证书的方法。

  (1).LoadCertificateFromBlob():加载证书:

  private void LoadCertificateFromBlob(byte[] rawData, object password, X509KeyStorageFlags keyStorageFlags)

  {

  if (rawData == null || rawData.Length == 0)

  throw new ArgumentException(Environment.GetResourceString("Arg_EmptyOrNullArray"), "rawData");

  if (X509Utils.MapContentType(X509Utils._QueryCertBlobType(rawData)) == X509ContentType.Pfx && (keyStorageFlags & X509KeyStorageFlags.PersistKeySet) == X509KeyStorageFlags.PersistKeySet)

  new KeyContainerPermission(KeyContainerPermissionFlags.Create).Demand();

  uint dwFlags = X509Utils.MapKeyStorageFlags(keyStorageFlags);

  IntPtr num = IntPtr.Zero;

  RuntimeHelpers.PrepareConstrainedRegions();

  try

  {

  num = X509Utils.PasswordToHGlobalUni(password);

  X509Utils._LoadCertFromBlob(rawData, num, dwFlags, (keyStorageFlags & X509KeyStorageFlags.PersistKeySet) != X509KeyStorageFlags.DefaultKeySet, ref this.m_safeCertContext);

  }

  finally

  {

  if (num != IntPtr.Zero)

  Marshal.ZeroFreeGlobalAllocUnicode(num);

  }

  }

  该方法是X509Certificate类构造函数等几个方法加载证书的具体实现方法。

  (2).Export():使用指定的格式和密码将当前 X509Certificate对象导出到字节数组。

  public virtual byte[] Export(X509ContentType contentType, SecureString password)

  {

  return this.ExportHelper(contentType, (object) password);

  }

  该方法接受两个参数,contentType描述如何设置输出数据格式的 X509ContentType 值之一。password访问 X.509 证书数据所需的密码。返回表示当前 X509Certificate 对象的字节数组。

  成都it培训哪家好,当然是成都达内培训,成都达内是一家专业的程序员培训机构,专注于成都嵌入式培训,成都web前端培训,成都.NET培训,成都大数据培训,成都会计实操培训,成都IT培训,成都编程培训等IT培训,专业的成都软件培训机构,专业师资授课,真实项目实战、零首付、低押金、名企就业。

(责任编辑:成都达内)
最新开班
  • 成都Java培训班
    免费试听名额发放中...
  • 成都C++培训班
    免费试听名额发放中...
  • 成都PHP培训班
    免费试听名额发放中...
  • 成都网络工程培训班
    免费试听名额发放中...
  • 成都Unity3D培训班
    免费试听名额发放中...
  • 成都大数据培训班
    免费试听名额发放中...
  • 成都uid培训班
    免费试听名额发放中...
  • 成都会计培训班
    免费试听名额发放中...
  • 成都Python培训班
    免费试听名额发放中...
  • 成都嵌入式培训班
    免费试听名额发放中...
  • 成都web培训班
    免费试听名额发放中...
  • 成都软件测试培训班
    免费试听名额发放中...
在线留言
提交

校区地址:成都市锦江区东大街紫东楼端35号明宇金融广场19楼1906室

联系电话:400-111-8989

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市高新区奥克斯广场蜀锦路209号一楼商铺

联系电话:400-111-8989

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都锦江区东大街芷泉街229号东方广场C座3楼303

联系电话:400-111-8989

公交路线:芷泉街(188路;115路;515路;236路;505路;501路;84路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市武侯区佳灵路3号红牌楼广场2号写字楼11楼1115号

联系电话:400-111-8989

公交路线:红牌楼东(11路;92路;100路;111路;139路;g28路;快速公交K1/K2) 地铁路线:红牌楼站(地铁3号线)

校区地址:成都市锦江区红星路二段70号四川日报大厦502-2

联系电话:400-111-8989

公交路线:市二医院站(6路;49路;102路;5路;37路;g92路;) 地铁路线:地铁市二医院(地铁3号线)

校区地址:成都市锦江区东大街芷泉段229号东方广场C座16层

联系电话:400-111-8989

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:四川省成都市武侯区高新科技孵化园9号园区E座7楼

联系电话:400-111-8989

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

了解达内动态
关注成都达内教育公众号

首页 | 关于达内 | 课程中心 | 专家师资 | 视频教程 | 学员空间 | 校企合作 | 新闻资讯 | 就业指导 | 网站地图

2016-2025 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56 蜀ICP备18021046号-3