博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javax.crypto加密
阅读量:4189 次
发布时间:2019-05-26

本文共 11759 字,大约阅读时间需要 39 分钟。

一、制作证书
1.生成keyStroe文件
在命令行下执行以下命令:
Java代码 复制代码 收藏代码
1.keytool -genkey -validity 1 -alias www.tzz-sf.com -keyalg RSA -keystore d:\tzz-sf.keystore
其中
-genkey 表示生成密钥
-validity 指定证书有效期,这里是1天
-alias 指定别名,这里是www.tzz-sf.com
-keyalg 指定算法,这里是RSA
-keystore 指定存储位置,这里是d:\tzz-sf.keystore
根据命令行提示输入:
Java代码 复制代码 收藏代码
1.输入keystore密码:
2.Keystore 密码太短 -至少必须为6个字符
3.输入keystore密码:
4.再次输入新密码:
5.您的名字与姓氏是什么?
6. [Unknown]: tzz
7.您的组织单位名称是什么?
8. [Unknown]: www.tzz-sf.com
9.您的组织名称是什么?
10. [Unknown]: tzz-sf
11.您所在的城市或区域名称是什么?
12. [Unknown]: sz
13.您所在的州或省份名称是什么?
14. [Unknown]: sz
15.该单位的两字母国家代码是什么
16. [Unknown]: cn
17.CN=tzz, OU=www.tzz-sf.com, O=tzz-sf, L=sz, ST=sz, C=cn 正确吗?
18. [否]: y
19.输入<www.tzz-sf.com>的主密码
在这里我使用的密码为 123456789
2.生成自签名证书
光有keyStore文件是不够的,还需要证书文件,证书才是直接提供给外界使用的公钥凭证。
Java代码 复制代码 收藏代码
1.keytool -export -keystore d:\tzz-sf.keystore -alias www.tzz-sf.com -file d:\tzz-sf.cer -rfc
其中
-export 指定为导出操作
-keystore 指定keystore文件
-alias 指定导出keystore文件中的别名
-file 指向导出路径
-rfc 以文本格式输出,也就是以BASE64编码输出
这里的密码是 123456789
当然,使用方是需要导入证书的!
可以通过自签名证书完成CAS单点登录系统的构建!
Java代码 复制代码 收藏代码
1.import java.io.IOException;
2.
3.import sun.misc.BASE64Decoder;
4.import sun.misc.BASE64Encoder;
5.
6.public class Coder {
7.
8. public static String encryptBASE64(byte[] key) {
9. return (new BASE64Encoder()).encodeBuffer(key);
10. }
11.
12. public static byte[] decryptBASE64(String key) throws IOException {
13. return new BASE64Decoder().decodeBuffer(key);
14. }
15.}
Java代码 复制代码 收藏代码
1.package cn.tzz.java.crypto.certificate;
2.
3.import java.io.FileInputStream;
4.import java.security.KeyStore;
5.import java.security.PrivateKey;
6.import java.security.PublicKey;
7.import java.security.Signature;
8.import java.security.cert.Certificate;
9.import java.security.cert.CertificateFactory;
10.import java.security.cert.X509Certificate;
11.import java.util.Date;
12.
13.import javax.crypto.Cipher;
14.
15.import cn.tzz.java.crypto.Coder;
16.
17./**
18. * Java加密技术——数字证书
19. *
20. */
21.public abstract class CertificateCryptUtil extends Coder {
22.
23. /**
24. * Java密钥库(Java Key Store,JKS)KEY_STORE
25. */
26. public static final String KEY_STORE = "JKS";
27.
28. public static final String X509 = "X.509";
29.
30. /**
31. * 由KeyStore获得私钥
32. *
33. * @param keyStorePath
34. * @param alias
35. * @param password
36. * @return
37. * @throws Exception
38. */
39. private static PrivateKey getPrivateKey(String keyStorePath, String alias, String password) throws Exception {
40. KeyStore ks = getKeyStore(keyStorePath, password);
41. PrivateKey key = (PrivateKey) ks.getKey(alias, password.toCharArray());
42. return key;
43. }
44.
45. /**
46. * 由Certificate获得公钥
47. *
48. * @param certificatePath
49. * @return
50. * @throws Exception
51. */
52. private static PublicKey getPublicKey(String certificatePath) throws Exception {
53. Certificate certificate = getCertificate(certificatePath);
54. PublicKey key = certificate.getPublicKey();
55. return key;
56. }
57.
58. /**
59. * 获得Certificate
60. *
61. * @param certificatePath
62. * @return
63. * @throws Exception
64. */
65. private static Certificate getCertificate(String certificatePath) throws Exception {
66. CertificateFactory certificateFactory = CertificateFactory.getInstance(X509);
67. FileInputStream in = new FileInputStream(certificatePath);
68.
69. Certificate certificate = certificateFactory.generateCertificate(in);
70. in.close();
71. return certificate;
72. }
73.
74. /**
75. * 获得Certificate
76. *
77. * @param keyStorePath
78. * @param alias
79. * @param password
80. * @return
81. * @throws Exception
82. */
83. private static Certificate getCertificate(String keyStorePath, String alias, String password) throws Exception {
84. KeyStore ks = getKeyStore(keyStorePath, password);
85. Certificate certificate = ks.getCertificate(alias);
86. return certificate;
87. }
88.
89. /**
90. * 获得KeyStore
91. *
92. * @param keyStorePath
93. * @param password
94. * @return
95. * @throws Exception
96. */
97. private static KeyStore getKeyStore(String keyStorePath, String password) throws Exception {
98. FileInputStream is = new FileInputStream(keyStorePath);
99. KeyStore ks = KeyStore.getInstance(KEY_STORE);
100. ks.load(is, password.toCharArray());
101. is.close();
102. return ks;
103. }
104.
105. /**
106. * 私钥加密
107. *
108. * @param data
109. * @param keyStorePath
110. * @param alias
111. * @param password
112. * @return
113. * @throws Exception
114. */
115. public static byte[] encryptByPrivateKey(byte[] data, String keyStorePath, String alias, String password) throws Exception {
116. // 取得私钥
117. PrivateKey privateKey = getPrivateKey(keyStorePath, alias, password);
118. // 对数据加密
119. Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
120. cipher.init(Cipher.ENCRYPT_MODE, privateKey);
121. return cipher.doFinal(data);
122. }
123.
124. /**
125. * 私钥解密
126. *
127. * @param data
128. * @param keyStorePath
129. * @param alias
130. * @param password
131. * @return
132. * @throws Exception
133. */
134. public static byte[] decryptByPrivateKey(byte[] data, String keyStorePath, String alias, String password) throws Exception {
135. // 取得私钥
136. PrivateKey privateKey = getPrivateKey(keyStorePath, alias, password);
137. // 对数据加密
138. Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
139. cipher.init(Cipher.DECRYPT_MODE, privateKey);
140. return cipher.doFinal(data);
141. }
142.
143. /**
144. * 公钥加密
145. *
146. * @param data
147. * @param certificatePath
148. * @return
149. * @throws Exception
150. */
151. public static byte[] encryptByPublicKey(byte[] data, String certificatePath) throws Exception {
152. // 取得公钥
153. PublicKey publicKey = getPublicKey(certificatePath);
154. // 对数据加密
155. Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
156. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
157. return cipher.doFinal(data);
158. }
159.
160. /**
161. * 公钥解密
162. *
163. * @param data
164. * @param certificatePath
165. * @return
166. * @throws Exception
167. */
168. public static byte[] decryptByPublicKey(byte[] data, String certificatePath) throws Exception {
169. // 取得公钥
170. PublicKey publicKey = getPublicKey(certificatePath);
171. // 对数据加密
172. Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
173. cipher.init(Cipher.DECRYPT_MODE, publicKey);
174. return cipher.doFinal(data);
175. }
176.
177. /**
178. * 验证Certificate
179. *
180. * @param certificatePath
181. * @return
182. */
183. public static boolean verifyCertificate(String certificatePath) {
184. return verifyCertificate(new Date(), certificatePath);
185. }
186.
187. /**
188. * 验证Certificate是否过期或无效
189. *
190. * @param date
191. * @param certificatePath
192. * @return
193. */
194. public static boolean verifyCertificate(Date date, String certificatePath) {
195. boolean status = true;
196. try {
197. // 取得证书
198. Certificate certificate = getCertificate(certificatePath);
199. // 验证证书是否过期或无效
200. status = verifyCertificate(date, certificate);
201. } catch (Exception e) {
202. status = false;
203. }
204. return status;
205. }
206.
207. /**
208. * 验证证书是否过期或无效
209. *
210. * @param date
211. * @param certificate
212. * @return
213. */
214. private static boolean verifyCertificate(Date date, Certificate certificate) {
215. boolean status = true;
216. try {
217. X509Certificate x509Certificate = (X509Certificate) certificate;
218. x509Certificate.checkValidity(date);
219. } catch (Exception e) {
220. status = false;
221. }
222. return status;
223. }
224.
225. /**
226. * 签名
227. *
228. * @param keyStorePath
229. * @param alias
230. * @param password
231. *
232. * @return
233. * @throws Exception
234. */
235. public static String sign(byte[] sign, String keyStorePath, String alias, String password) throws Exception {
236. // 获得证书
237. X509Certificate x509Certificate = (X509Certificate) getCertificate(keyStorePath, alias, password);
238. // 获取私钥
239. KeyStore ks = getKeyStore(keyStorePath, password);
240. // 取得私钥
241. PrivateKey privateKey = (PrivateKey) ks.getKey(alias,password.toCharArray());
242. // 构建签名
243. Signature signature = Signature.getInstance(x509Certificate.getSigAlgName());
244. signature.initSign(privateKey);
245. signature.update(sign);
246. return encryptBASE64(signature.sign());
247. }
248.
249. /**
250. * 验证签名
251. *
252. * @param data
253. * @param sign
254. * @param certificatePath
255. * @return
256. * @throws Exception
257. */
258. public static boolean verify(byte[] data, String sign, String certificatePath) throws Exception {
259. // 获得证书
260. X509Certificate x509Certificate = (X509Certificate) getCertificate(certificatePath);
261. // 获得公钥
262. PublicKey publicKey = x509Certificate.getPublicKey();
263. // 构建签名
264. Signature signature = Signature.getInstance(x509Certificate.getSigAlgName());
265. signature.initVerify(publicKey);
266. signature.update(data);
267.
268. return signature.verify(decryptBASE64(sign));
269.
270. }
271.
272. /**
273. * 验证Certificate
274. *
275. * @param keyStorePath
276. * @param alias
277. * @param password
278. * @return
279. */
280. public static boolean verifyCertificate(Date date, String keyStorePath, String alias, String password) {
281. boolean status = true;
282. try {
283. Certificate certificate = getCertificate(keyStorePath, alias, password);
284. status = verifyCertificate(date, certificate);
285. } catch (Exception e) {
286. status = false;
287. }
288. return status;
289. }
290.
291. /**
292. * 验证Certificate
293. *
294. * @param keyStorePath
295. * @param alias
296. * @param password
297. * @return
298. */
299. public static boolean verifyCertificate(String keyStorePath, String alias, String password) {
300. return verifyCertificate(new Date(), keyStorePath, alias, password);
301. }
302.}
测试:
Java代码 复制代码 收藏代码
1.package cn.tzz.java.crypto.certificate;
2.
3.import static org.junit.Assert.*;
4.
5.import org.junit.Test;
6.
7./**
8. * 测试--Java加密技术——数字证书
9. *
10. */
11.public class CertificateCryptUtilTest {
12. private String password = "123456789";
13. private String alias = "www.tzz-sf.com";
14. //生成证书
15. //keytool -genkey -validity 1 -alias www.tzz-sf.com -keyalg RSA -keystore d:\tzz-sf.keystore
16. //keytool -export -keystore d:\tzz-sf.keystore -alias www.tzz-sf.com -file d:\tzz-sf.cer -rfc
17. private String keyStorePath = "d:/tzz-sf.keystore";
18. private String certificatePath = "d:/tzz-sf.cer";
19.
20. /**公钥加密——私钥解密*/
21. @Test
22. public void test() throws Exception {
23. String inputStr = "加密字符123456Abc";
24. byte[] data = inputStr.getBytes();
25. byte[] encrypt = CertificateCryptUtil.encryptByPublicKey(data, certificatePath);
26.
27. byte[] decrypt = CertificateCryptUtil.decryptByPrivateKey(encrypt, keyStorePath, alias, password);
28. String outputStr = new String(decrypt);
29. System.err.println("加密前: " + inputStr + "-----" + "解密后: " + outputStr);
30. // 验证数据一致
31. assertArrayEquals(data, decrypt);
32. // 验证证书有效
33. assertTrue(CertificateCryptUtil.verifyCertificate(certificatePath));
34. }
35.
36. /**私钥加密——公钥解密*/
37. @Test
38. public void testSign() throws Exception {
39. String inputStr = "加密字符123456Abc";
40. byte[] data = inputStr.getBytes();
41. byte[] encodedData = CertificateCryptUtil.encryptByPrivateKey(data, keyStorePath, alias, password);
42.
43. byte[] decodedData = CertificateCryptUtil.decryptByPublicKey(encodedData, certificatePath);
44.
45. String outputStr = new String(decodedData);
46. System.err.println("加密前: " + inputStr + "----" + "解密后: " + outputStr);
47. assertEquals(inputStr, outputStr);
48.
49. // 产生签名
50. String sign = CertificateCryptUtil.sign(encodedData, keyStorePath, alias, password);
51. System.err.println("签名:\r" + sign);
52. // 验证签名
53. boolean status = CertificateCryptUtil.verify(encodedData, sign, certificatePath);
54. System.err.println("状态:\r" + status);
55. assertTrue(status);
56.
57. }
58.}

转载地址:http://eznoi.baihongyu.com/

你可能感兴趣的文章
.NET Main函数参数解释过程和特殊规则
查看>>
.NET/Rotor源码研究1补遗 - 解决无法检测操作系统版本的错误
查看>>
.NET SDK中CorFlags.Exe的用法
查看>>
ZZ:使用.NET语言开发Silverlight应用程序入门(二):界面和对象模型
查看>>
ZZ:使用.NET语言开发Silverlight应用程序入门(一):了解项目结构
查看>>
微软宣布将发布.NET Framework Library源代码
查看>>
Vista SP1 Beta版体验
查看>>
走近Silverlight - 微软Silverlight上海开发团队Blog第二篇
查看>>
庆祝微软Silverlight上海开发团队的博客正式开张!
查看>>
.NET中的幕后英雄:MSCOREE.DLL
查看>>
如何在NTFS文件系统中创建文件的Link
查看>>
如何构造一个元素类型为Struct的SafeArray
查看>>
Windows Vista真的只是加了新界面吗?
查看>>
恢复定期更新Blog...
查看>>
使用WinDbg对Windows Live Toolbar死锁的简单分析
查看>>
Visual Studio中的Class Designer设计工具需要您的建议!
查看>>
微软在全国高校举办Silverlight大赛: http://www.msuniversity.edu.cn/static/silverlight/index.html
查看>>
.NET / Rotor源码分析5 - 开始使用WinDbg+SOS调试,sscoree.dll,加载SOS并设置JIT断点
查看>>
.NET / Rotor源码分析4 - 修改Rotor使其发送CLR Notification
查看>>
手动生成C#的COM包装类的常见问题和解决办法
查看>>