C#实现安全证书签名与验签实用工具类
本篇代码示例介绍了如何在C#中使用安全证书生成签名和验签的过程,以实现第三方平台间的数据安全通信。具体场景是用户在第三方购物平台完成交易后,支付平台发送消息给商户,商户需要验证消息的完整性和真实性后才能处理。以下知识点将逐步阐述: 1. **安全证书(Security Certificates)**: 在这个例子中,使用的安全证书包括商户私钥(private key,存储在`prikeyPath`变量中,如`D:\\testMer.key.der`)和商户公钥(public key,存储在`pubkeyPath`变量中,如`D:\\testUmpay.cert.crt`)。私钥用于加密和签名,而公钥用于解密和验证签名。 2. **密钥操作**: 使用`RSACryptoServiceProvider`类,这是一个强大的加密工具,提供了RSA算法的支持。首先,从私钥文件中读取并解码私钥字符串`prikey`,然后使用`FromXmlString`方法将其加载到`rsa`对象中。 3. **签名生成(Signing)**: 使用`RSAPKCS1SignatureFormatter`类创建签名器,并设置哈希算法为SHA1,这是一种常用的散列函数,确保消息的完整性。接着,对原始未签名的消息`unsign`进行UTF-16编码,并计算其SHA1哈希值。将哈希值作为输入,调用`ComputeHash`方法生成签名`result`。 4. **签名返回**: 将生成的签名转换为Base64格式,以便于在网络传输中存储和验证。返回的签名字符串可用于后续的验证过程。 5. **验签(Verification)**: 商户收到第三方平台发来的消息时,会使用商户公钥对签名进行验证。然而,这段代码中没有提供具体的验签部分,但可以推测在实际应用中,商户会使用类似的方法从接收到的信息中提取签名,使用`RSAPKCS1SignatureDeformatter`解码Base64签名,并与消息的哈希值进行对比,确认其是否匹配。 6. **异常处理**: `try-catch`块用于捕获可能在加载或操作密钥时发生的异常,如果出现异常,则返回空字符串,表示无法生成签名。 7. **文件路径和安全性**: 提供的文件路径(如`D:\\testMer.key.der`)应该被妥善管理,以确保私钥的安全,防止未授权访问。在生产环境中,这些文件通常会被存储在受保护的位置,例如应用程序的私有目录或者安全的秘钥存储库。 总结,本文档展示了在C#中使用安全证书生成和验证消息签名的基础步骤,适用于电商等涉及敏感信息传输的场景。通过这种方式,可以增强数据的可信度和通信的安全性。
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace TestEPS
{
public static class bangzhu
{
private static string prikeyPath = "D:\\testMer.key.der";
private static string pubkeyPath = "D:\\testUmpay.cert.crt";
//private static string prikeyPath = @"E:\证书地址.der";
//private static string pubkeyPath = @"E:\证书.crt";
//用私钥生成签名
public static string sign(string unsign)
{
string prikey = DecodeDERKey(prikeyPath);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
try
{
rsa.FromXmlString(prikey);
}
catch (Exception ex)
{
return "";
}
// 加密对象
RSAPKCS1SignatureFormatter f = new RSAPKCS1SignatureFormatter(rsa);
f.SetHashAlgorithm("SHA1");
//把要签名的源串转化成字节数组
byte[] source = System.Text.UnicodeEncoding.Default.GetBytes(unsign);
SHA1Managed sha = new SHA1Managed();
//对签名源串做哈昔算法,为sha1.
byte[] result = sha.ComputeHash(source);
string s = Convert.ToBase64String(result);
Console.WriteLine(s);
//对哈昔算法后的字符串进行签名.
byte[] b = f.CreateSignature(result);
//生长签名对象sign
string sign = Convert.ToBase64String(b);
return sign;
}
//用公钥进行签名的验证
public static bool verify(string unsign, string sign)
{
string pubkey = pathToXMLKey(pubkeyPath);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(pubkey);
//实例化验签对象.
剩余10页未读,继续阅读
- 粉丝: 18
- 资源: 24
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展