再共享一个安全帮助类-SecurityHelper
发现自己的博客首页的底部Banner条的位置不对,原因是内容太少了。还没想好应该写什么,所以先把以前的一些小东西先整理出来,装点一下门面。
SecurityHelper是以前写了用于远程业务通讯安全的一个帮助类,功能也很简单,还有需要改进的地方,但当时觉得能用了就没再管它。大家如果有什么建议将不胜感激。
对了,请教一个问题,目前这些代码虽然都是我写的,但用在了公司的项目中。这会不会违背了职业道德?我的理解是这些代码都是比较通用的部分,凡是涉及具体业务的内容一律剔除,不涉及公司的商业秘密,也不可能因此对业务系统造成损害。另一方面,这类代码完全可以公开了接受公众检验,提高质量。当然这只是个人看法,如果大部分人认为这样做不合适那我会处理掉。
SecurityHelper是以前写了用于远程业务通讯安全的一个帮助类,功能也很简单,还有需要改进的地方,但当时觉得能用了就没再管它。大家如果有什么建议将不胜感激。
对了,请教一个问题,目前这些代码虽然都是我写的,但用在了公司的项目中。这会不会违背了职业道德?我的理解是这些代码都是比较通用的部分,凡是涉及具体业务的内容一律剔除,不涉及公司的商业秘密,也不可能因此对业务系统造成损害。另一方面,这类代码完全可以公开了接受公众检验,提高质量。当然这只是个人看法,如果大部分人认为这样做不合适那我会处理掉。
1
using System;
2
using System.IO;
3
using System.Security.Cryptography;
4
using System.Text;
5
using System.Xml;
6
7
namespace NHTSS.Framework.Common
8
{
9
/// <summary>
10
/// 为系统提供加密、解密功能的帮助类。
11
/// </summary>
12
public sealed class SecurityHelper
13
{
14
/// <summary>
15
/// 内部构造,不允许实例化该类。
16
/// </summary>
17
internal SecurityHelper()
18
{
19
}
20
21
/// <summary>
22
/// 加密文本。
23
/// </summary>
24
/// <remarks>
25
/// 使用RSA算法。
26
/// </remarks>
27
/// <param name="xmlKeyPath">密钥文件(XML)路径。</param>
28
/// <param name="strMessage">待加密的文本。</param>
29
/// <returns>密文。</returns>
30
public static string RSAEncryptString(string xmlKeyPath, string strMessage)
31
{
32
if (!File.Exists(xmlKeyPath))
33
{
34
throw new System.IO.FileNotFoundException("加密密钥文件不存在。");
35
}
36
try
37
{
38
UnicodeEncoding myByteConverter = new UnicodeEncoding();
39
40
byte[] dataToEncrypt = myByteConverter.GetBytes(strMessage);
41
byte[] encryptedData;
42
43
using (RSACryptoServiceProvider myRSACSP = new RSACryptoServiceProvider())
44
{
45
XmlDocument myDoc = new XmlDocument();
46
myDoc.Load(xmlKeyPath);
47
myRSACSP.FromXmlString(myDoc.OuterXml);
48
49
encryptedData = myRSACSP.Encrypt(dataToEncrypt, false);
50
}
51
return Convert.ToBase64String(encryptedData);
52
}
53
catch (System.Exception ex)
54
{
55
throw new ApplicationException("加密失败!\r\n" + ex.Message, ex);
56
}
57
}
58
59
/// <summary>
60
/// 解密文本。
61
/// </summary>
62
/// <remarks>
63
/// 使用RSA算法。
64
/// </remarks>
65
/// <param name="xmlKeyPath">密钥文件(XML)路径。</param>
66
/// <param name="strCryptograph">待解密的文本。</param>
67
/// <returns>明文。</returns>
68
public static string RSADecryptString(string xmlKeyPath, string strCryptograph)
69
{
70
if (!File.Exists(xmlKeyPath))
71
{
72
throw new System.IO.FileNotFoundException("解密密钥文件不存在。");
73
}
74
75
try
76
{
77
byte[] dataToDecrypt = Convert.FromBase64String(strCryptograph);
78
byte[] decryptedData;
79
80
using (RSACryptoServiceProvider myRSACSP = new RSACryptoServiceProvider())
81
{
82
XmlDocument myDoc = new XmlDocument();
83
myDoc.Load(xmlKeyPath);
84
myRSACSP.FromXmlString(myDoc.OuterXml);
85
86
decryptedData = myRSACSP.Decrypt(dataToDecrypt, false);
87
}
88
UnicodeEncoding myByteConverter = new UnicodeEncoding();
89
return myByteConverter.GetString(decryptedData);
90
}
91
catch (System.Exception ex)
92
{
93
throw new ApplicationException("解密失败!\r\n" + ex.Message, ex);
94
}
95
}
96
97
98
/// <summary>
99
/// 对文本进行签名。
100
/// </summary>
101
/// <param name="xmlPrivateKeyPath">签名密钥(XML)的路径。</param>
102
/// <param name="strMessage">待签名的文本。</param>
103
/// <returns>签名。</returns>
104
public static string RSASignString(string xmlPrivateKeyPath, string strMessage)
105
{
106
if (!File.Exists(xmlPrivateKeyPath))
107
{
108
throw new System.IO.FileNotFoundException("签名密钥文件不存在。");
109
}
110
111
try
112
{
113
UnicodeEncoding myByteConverter = new UnicodeEncoding();
114
115
byte[] dataToSign = myByteConverter.GetBytes(strMessage);
116
byte[] signedData;
117
118
using (RSACryptoServiceProvider myRSACSP = new RSACryptoServiceProvider())
119
{
120
XmlDocument myDoc = new XmlDocument();
121
myDoc.Load(xmlPrivateKeyPath);
122
myRSACSP.FromXmlString(myDoc.OuterXml);
123
124
signedData = myRSACSP.SignData(dataToSign, new SHA1CryptoServiceProvider());
125
}
126
return myByteConverter.GetString(signedData);
127
}
128
catch (System.Exception ex)
129
{
130
throw new ApplicationException("签名失败!\r\n" + ex.Message, ex);
131
}
132
}
133
134
/// <summary>
135
/// 验证签名。
136
/// </summary>
137
/// <param name="xmlPublicKeyPath">验证签名的公钥文件(XML)路径。</param>
138
/// <param name="strMessage">消息原文。</param>
139
/// <param name="strSignature">签名数据。</param>
140
/// <returns>验证结果。</returns>
141
public static bool RSAVerifySignString(string xmlPublicKeyPath, string strMessage, string strSignature)
142
{
143
if (!File.Exists(xmlPublicKeyPath))
144
{
145
throw new System.IO.FileNotFoundException("验证密钥文件不存在。");
146
}
147
148
try
149
{
150
UnicodeEncoding myByteConverter = new UnicodeEncoding();
151
152
byte[] dataToSign = myByteConverter.GetBytes(strMessage);
153
byte[] signedData = myByteConverter.GetBytes(strSignature);
154
155
bool bolResult = false;
156
using (RSACryptoServiceProvider myRSACSP = new RSACryptoServiceProvider())
157
{
158
XmlDocument myDoc = new XmlDocument();
159
myDoc.Load(xmlPublicKeyPath);
160
myRSACSP.FromXmlString(myDoc.OuterXml);
161
162
bolResult = myRSACSP.VerifyData(dataToSign, new SHA1CryptoServiceProvider(), signedData);
163
}
164
return bolResult;
165
}
166
catch (System.Exception ex)
167
{
168
throw new ApplicationException("验证签名失败!\r\n" + ex.Message, ex);
169
}
170
}
171
}
172
173
/// <summary>
174
/// 用来生成密钥对。
175
/// </summary>
176
/// <remarks>
177
/// 采用RSA算法。XML文件表示。
178
/// </remarks>
179
public class KeyGenerator
180
{
181
private XmlDocument _privateKey;
182
private XmlDocument _publicKey;
183
184
/// <summary>
185
/// 缺省构造,生成密钥对。
186
/// </summary>
187
public KeyGenerator()
188
{
189
//Use RSA Provider to generate public / private key pair
190
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
191
{
192
// create the xml-docs
193
_privateKey = new XmlDocument();
194
_publicKey = new XmlDocument();
195
196
// use RSA convenience methods to stuff public and private keys into dom's
197
_privateKey.LoadXml(RSA.ToXmlString(true));
198
_publicKey.LoadXml(RSA.ToXmlString(false));
199
}
200
}
201
202
/// <summary>
203
/// 私钥。
204
/// </summary>
205
public XmlDocument PrivateKey
206
{
207
get { return _privateKey; }
208
}
209
210
/// <summary>
211
/// 公钥。
212
/// </summary>
213
public XmlDocument PublicKey
214
{
215
get { return _publicKey; }
216
}
217
218
/// <summary>
219
/// 生成加密型强随机非零值序列作为会话令牌。
220
/// </summary>
221
/// <remarks>
222
/// 使用弱加密,16位。
223
/// </remarks>
224
/// <returns>随机的令牌。</returns>
225
public static string GenToken()
226
{
227
byte[] random = new Byte[16];
228
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
229
rng.GetNonZeroBytes(random);
230
UnicodeEncoding myByteConverter = new UnicodeEncoding();
231
return myByteConverter.GetString(random);
232
}
233
}
234
}
using System;2
using System.IO;3
using System.Security.Cryptography;4
using System.Text;5
using System.Xml;6

7
namespace NHTSS.Framework.Common8
{9
/// <summary>10
/// 为系统提供加密、解密功能的帮助类。11
/// </summary>12
public sealed class SecurityHelper13
{14
/// <summary>15
/// 内部构造,不允许实例化该类。16
/// </summary>17
internal SecurityHelper()18
{19
}20

21
/// <summary>22
/// 加密文本。23
/// </summary>24
/// <remarks>25
/// 使用RSA算法。26
/// </remarks>27
/// <param name="xmlKeyPath">密钥文件(XML)路径。</param>28
/// <param name="strMessage">待加密的文本。</param>29
/// <returns>密文。</returns>30
public static string RSAEncryptString(string xmlKeyPath, string strMessage)31
{32
if (!File.Exists(xmlKeyPath))33
{34
throw new System.IO.FileNotFoundException("加密密钥文件不存在。");35
}36
try37
{38
UnicodeEncoding myByteConverter = new UnicodeEncoding();39

40
byte[] dataToEncrypt = myByteConverter.GetBytes(strMessage);41
byte[] encryptedData;42

43
using (RSACryptoServiceProvider myRSACSP = new RSACryptoServiceProvider())44
{45
XmlDocument myDoc = new XmlDocument();46
myDoc.Load(xmlKeyPath);47
myRSACSP.FromXmlString(myDoc.OuterXml);48

49
encryptedData = myRSACSP.Encrypt(dataToEncrypt, false);50
}51
return Convert.ToBase64String(encryptedData);52
}53
catch (System.Exception ex)54
{55
throw new ApplicationException("加密失败!\r\n" + ex.Message, ex);56
}57
}58

59
/// <summary>60
/// 解密文本。61
/// </summary>62
/// <remarks>63
/// 使用RSA算法。64
/// </remarks>65
/// <param name="xmlKeyPath">密钥文件(XML)路径。</param>66
/// <param name="strCryptograph">待解密的文本。</param>67
/// <returns>明文。</returns>68
public static string RSADecryptString(string xmlKeyPath, string strCryptograph)69
{70
if (!File.Exists(xmlKeyPath))71
{72
throw new System.IO.FileNotFoundException("解密密钥文件不存在。");73
}74

75
try76
{77
byte[] dataToDecrypt = Convert.FromBase64String(strCryptograph);78
byte[] decryptedData;79

80
using (RSACryptoServiceProvider myRSACSP = new RSACryptoServiceProvider())81
{82
XmlDocument myDoc = new XmlDocument();83
myDoc.Load(xmlKeyPath);84
myRSACSP.FromXmlString(myDoc.OuterXml);85

86
decryptedData = myRSACSP.Decrypt(dataToDecrypt, false);87
}88
UnicodeEncoding myByteConverter = new UnicodeEncoding();89
return myByteConverter.GetString(decryptedData);90
}91
catch (System.Exception ex)92
{93
throw new ApplicationException("解密失败!\r\n" + ex.Message, ex);94
}95
}96

97

98
/// <summary>99
/// 对文本进行签名。100
/// </summary>101
/// <param name="xmlPrivateKeyPath">签名密钥(XML)的路径。</param>102
/// <param name="strMessage">待签名的文本。</param>103
/// <returns>签名。</returns>104
public static string RSASignString(string xmlPrivateKeyPath, string strMessage)105
{106
if (!File.Exists(xmlPrivateKeyPath))107
{108
throw new System.IO.FileNotFoundException("签名密钥文件不存在。");109
}110

111
try112
{113
UnicodeEncoding myByteConverter = new UnicodeEncoding();114

115
byte[] dataToSign = myByteConverter.GetBytes(strMessage);116
byte[] signedData;117

118
using (RSACryptoServiceProvider myRSACSP = new RSACryptoServiceProvider())119
{120
XmlDocument myDoc = new XmlDocument();121
myDoc.Load(xmlPrivateKeyPath);122
myRSACSP.FromXmlString(myDoc.OuterXml);123

124
signedData = myRSACSP.SignData(dataToSign, new SHA1CryptoServiceProvider());125
}126
return myByteConverter.GetString(signedData);127
}128
catch (System.Exception ex)129
{130
throw new ApplicationException("签名失败!\r\n" + ex.Message, ex);131
}132
}133

134
/// <summary>135
/// 验证签名。136
/// </summary>137
/// <param name="xmlPublicKeyPath">验证签名的公钥文件(XML)路径。</param>138
/// <param name="strMessage">消息原文。</param>139
/// <param name="strSignature">签名数据。</param>140
/// <returns>验证结果。</returns>141
public static bool RSAVerifySignString(string xmlPublicKeyPath, string strMessage, string strSignature)142
{143
if (!File.Exists(xmlPublicKeyPath))144
{145
throw new System.IO.FileNotFoundException("验证密钥文件不存在。");146
}147

148
try149
{150
UnicodeEncoding myByteConverter = new UnicodeEncoding();151

152
byte[] dataToSign = myByteConverter.GetBytes(strMessage);153
byte[] signedData = myByteConverter.GetBytes(strSignature);154

155
bool bolResult = false;156
using (RSACryptoServiceProvider myRSACSP = new RSACryptoServiceProvider())157
{158
XmlDocument myDoc = new XmlDocument();159
myDoc.Load(xmlPublicKeyPath);160
myRSACSP.FromXmlString(myDoc.OuterXml);161

162
bolResult = myRSACSP.VerifyData(dataToSign, new SHA1CryptoServiceProvider(), signedData);163
}164
return bolResult;165
}166
catch (System.Exception ex)167
{168
throw new ApplicationException("验证签名失败!\r\n" + ex.Message, ex);169
}170
}171
}172

173
/// <summary>174
/// 用来生成密钥对。175
/// </summary>176
/// <remarks>177
/// 采用RSA算法。XML文件表示。178
/// </remarks>179
public class KeyGenerator180
{181
private XmlDocument _privateKey;182
private XmlDocument _publicKey;183

184
/// <summary>185
/// 缺省构造,生成密钥对。186
/// </summary>187
public KeyGenerator()188
{189
//Use RSA Provider to generate public / private key pair190
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())191
{192
// create the xml-docs193
_privateKey = new XmlDocument();194
_publicKey = new XmlDocument();195

196
// use RSA convenience methods to stuff public and private keys into dom's197
_privateKey.LoadXml(RSA.ToXmlString(true));198
_publicKey.LoadXml(RSA.ToXmlString(false));199
}200
}201

202
/// <summary>203
/// 私钥。204
/// </summary>205
public XmlDocument PrivateKey206
{207
get { return _privateKey; }208
}209

210
/// <summary>211
/// 公钥。212
/// </summary>213
public XmlDocument PublicKey214
{215
get { return _publicKey; }216
}217

218
/// <summary>219
/// 生成加密型强随机非零值序列作为会话令牌。220
/// </summary>221
/// <remarks>222
/// 使用弱加密,16位。223
/// </remarks>224
/// <returns>随机的令牌。</returns>225
public static string GenToken()226
{227
byte[] random = new Byte[16];228
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();229
rng.GetNonZeroBytes(random);230
UnicodeEncoding myByteConverter = new UnicodeEncoding();231
return myByteConverter.GetString(random);232
}233
}234
}

浙公网安备 33010602011771号