再共享一个安全帮助类-SecurityHelper
发现自己的博客首页的底部Banner条的位置不对,原因是内容太少了。还没想好应该写什么,所以先把以前的一些小东西先整理出来,装点一下门面。
SecurityHelper是以前写了用于远程业务通讯安全的一个帮助类,功能也很简单,还有需要改进的地方,但当时觉得能用了就没再管它。大家如果有什么建议将不胜感激。
对了,请教一个问题,目前这些代码虽然都是我写的,但用在了公司的项目中。这会不会违背了职业道德?我的理解是这些代码都是比较通用的部分,凡是涉及具体业务的内容一律剔除,不涉及公司的商业秘密,也不可能因此对业务系统造成损害。另一方面,这类代码完全可以公开了接受公众检验,提高质量。当然这只是个人看法,如果大部分人认为这样做不合适那我会处理掉。
SecurityHelper是以前写了用于远程业务通讯安全的一个帮助类,功能也很简单,还有需要改进的地方,但当时觉得能用了就没再管它。大家如果有什么建议将不胜感激。
对了,请教一个问题,目前这些代码虽然都是我写的,但用在了公司的项目中。这会不会违背了职业道德?我的理解是这些代码都是比较通用的部分,凡是涉及具体业务的内容一律剔除,不涉及公司的商业秘密,也不可能因此对业务系统造成损害。另一方面,这类代码完全可以公开了接受公众检验,提高质量。当然这只是个人看法,如果大部分人认为这样做不合适那我会处理掉。
1using System;
2using System.IO;
3using System.Security.Cryptography;
4using System.Text;
5using System.Xml;
6
7namespace 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}
2using System.IO;
3using System.Security.Cryptography;
4using System.Text;
5using System.Xml;
6
7namespace 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}