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
}

2

3

4

5

6

7

8



9


10

11

12

13



14


15

16

17

18



19

20

21


22

23

24

25

26

27

28

29

30

31



32

33



34

35

36

37



38

39

40

41

42

43

44



45

46

47

48

49

50

51

52

53

54



55

56

57

58

59


60

61

62

63

64

65

66

67

68

69



70

71



72

73

74

75

76



77

78

79

80

81



82

83

84

85

86

87

88

89

90

91

92



93

94

95

96

97

98


99

100

101

102

103

104

105



106

107



108

109

110

111

112



113

114

115

116

117

118

119



120

121

122

123

124

125

126

127

128

129



130

131

132

133

134


135

136

137

138

139

140

141

142



143

144



145

146

147

148

149



150

151

152

153

154

155

156

157



158

159

160

161

162

163

164

165

166

167



168

169

170

171

172

173


174

175

176

177

178

179

180



181

182

183

184


185

186

187

188



189

190

191



192

193

194

195

196

197

198

199

200

201

202


203

204

205

206



207



208

209

210


211

212

213

214



215



216

217

218


219

220

221

222

223

224

225

226



227

228

229

230

231

232

233

234
