有这样一个需求,前端登录的usernamepassword,password必需加密。但不可使用MD5,由于后台要检測password的复杂度,那么在保证安全的前提下将password传到后台呢,答案就是使用RSA非对称加密算法解决 。

java代码

须要依赖 commons-codec

RSACoder.java

  1. import org.apache.commons.codec.binary.Base64;
  2. import javax.crypto.Cipher;
  3. import java.security.*;
  4. import java.security.spec.PKCS8EncodedKeySpec;
  5. import java.security.spec.X509EncodedKeySpec;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. /**
  9. * Created by lake on 17-4-12.
  10. */
  11. public class RSACoder {
  12. public static final String KEY_ALGORITHM = "RSA";
  13. public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
  14. private static final String PUBLIC_KEY = "RSAPublicKey";
  15. private static final String PRIVATE_KEY = "RSAPrivateKey";
  16. public static byte[] decryptBASE64(String key) {
  17. return Base64.decodeBase64(key);
  18. }
  19. public static String encryptBASE64(byte[] bytes) {
  20. return Base64.encodeBase64String(bytes);
  21. }
  22. /**
  23. * 用私钥对信息生成数字签名
  24. *
  25. * @param data 加密数据
  26. * @param privateKey 私钥
  27. * @return
  28. * @throws Exception
  29. */
  30. public static String sign(byte[] data, String privateKey) throws Exception {
  31. // 解密由base64编码的私钥
  32. byte[] keyBytes = decryptBASE64(privateKey);
  33. // 构造PKCS8EncodedKeySpec对象
  34. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  35. // KEY_ALGORITHM 指定的加密算法
  36. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  37. // 取私钥匙对象
  38. PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
  39. // 用私钥对信息生成数字签名
  40. Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
  41. signature.initSign(priKey);
  42. signature.update(data);
  43. return encryptBASE64(signature.sign());
  44. }
  45. /**
  46. * 校验数字签名
  47. *
  48. * @param data 加密数据
  49. * @param publicKey 公钥
  50. * @param sign 数字签名
  51. * @return 校验成功返回true 失败返回false
  52. * @throws Exception
  53. */
  54. public static boolean verify(byte[] data, String publicKey, String sign)
  55. throws Exception {
  56. // 解密由base64编码的公钥
  57. byte[] keyBytes = decryptBASE64(publicKey);
  58. // 构造X509EncodedKeySpec对象
  59. X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
  60. // KEY_ALGORITHM 指定的加密算法
  61. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  62. // 取公钥匙对象
  63. PublicKey pubKey = keyFactory.generatePublic(keySpec);
  64. Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
  65. signature.initVerify(pubKey);
  66. signature.update(data);
  67. // 验证签名是否正常
  68. return signature.verify(decryptBASE64(sign));
  69. }
  70. public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception{
  71. // 对密钥解密
  72. byte[] keyBytes = decryptBASE64(key);
  73. // 取得私钥
  74. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  75. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  76. Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
  77. // 对数据解密
  78. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  79. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  80. return cipher.doFinal(data);
  81. }
  82. /**
  83. * 解密<br>
  84. * 用私钥解密
  85. *
  86. * @param data
  87. * @param key
  88. * @return
  89. * @throws Exception
  90. */
  91. public static byte[] decryptByPrivateKey(String data, String key)
  92. throws Exception {
  93. return decryptByPrivateKey(decryptBASE64(data),key);
  94. }
  95. /**
  96. * 解密<br>
  97. * 用公钥解密
  98. *
  99. * @param data
  100. * @param key
  101. * @return
  102. * @throws Exception
  103. */
  104. public static byte[] decryptByPublicKey(byte[] data, String key)
  105. throws Exception {
  106. // 对密钥解密
  107. byte[] keyBytes = decryptBASE64(key);
  108. // 取得公钥
  109. X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
  110. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  111. Key publicKey = keyFactory.generatePublic(x509KeySpec);
  112. // 对数据解密
  113. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  114. cipher.init(Cipher.DECRYPT_MODE, publicKey);
  115. return cipher.doFinal(data);
  116. }
  117. /**
  118. * 加密<br>
  119. * 用公钥加密
  120. *
  121. * @param data
  122. * @param key
  123. * @return
  124. * @throws Exception
  125. */
  126. public static byte[] encryptByPublicKey(String data, String key)
  127. throws Exception {
  128. // 对公钥解密
  129. byte[] keyBytes = decryptBASE64(key);
  130. // 取得公钥
  131. X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
  132. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  133. Key publicKey = keyFactory.generatePublic(x509KeySpec);
  134. // 对数据加密
  135. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  136. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  137. return cipher.doFinal(data.getBytes());
  138. }
  139. /**
  140. * 加密<br>
  141. * 用私钥加密
  142. *
  143. * @param data
  144. * @param key
  145. * @return
  146. * @throws Exception
  147. */
  148. public static byte[] encryptByPrivateKey(byte[] data, String key)
  149. throws Exception {
  150. // 对密钥解密
  151. byte[] keyBytes = decryptBASE64(key);
  152. // 取得私钥
  153. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  154. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  155. Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
  156. // 对数据加密
  157. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  158. cipher.init(Cipher.ENCRYPT_MODE, privateKey);
  159. return cipher.doFinal(data);
  160. }
  161. /**
  162. * 取得私钥
  163. *
  164. * @param keyMap
  165. * @return
  166. * @throws Exception
  167. */
  168. public static String getPrivateKey(Map<String, Key> keyMap)
  169. throws Exception {
  170. Key key = (Key) keyMap.get(PRIVATE_KEY);
  171. return encryptBASE64(key.getEncoded());
  172. }
  173. /**
  174. * 取得公钥
  175. *
  176. * @param keyMap
  177. * @return
  178. * @throws Exception
  179. */
  180. public static String getPublicKey(Map<String, Key> keyMap)
  181. throws Exception {
  182. Key key = keyMap.get(PUBLIC_KEY);
  183. return encryptBASE64(key.getEncoded());
  184. }
  185. /**
  186. * 初始化密钥
  187. *
  188. * @return
  189. * @throws Exception
  190. */
  191. public static Map<String, Key> initKey() throws Exception {
  192. KeyPairGenerator keyPairGen = KeyPairGenerator
  193. .getInstance(KEY_ALGORITHM);
  194. keyPairGen.initialize(1024);
  195. KeyPair keyPair = keyPairGen.generateKeyPair();
  196. Map<String, Key> keyMap = new HashMap(2);
  197. keyMap.put(PUBLIC_KEY, keyPair.getPublic());// 公钥
  198. keyMap.put(PRIVATE_KEY, keyPair.getPrivate());// 私钥
  199. return keyMap;
  200. }
  201. }

測试类

RSACoderTest.java

  1. import org.junit.Before;
  2. import org.junit.Test;
  3. import java.security.Key;
  4. import java.util.Map;
  5. import static org.junit.Assert.assertEquals;
  6. import static org.junit.Assert.assertTrue;
  7. /**
  8. * Created by lake on 17-4-12.
  9. */
  10. public class RSACoderTest {
  11. private String publicKey;
  12. private String privateKey;
  13. @Before
  14. public void setUp() throws Exception {
  15. Map<String, Key> keyMap = RSACoder.initKey();
  16. publicKey = RSACoder.getPublicKey(keyMap);
  17. privateKey = RSACoder.getPrivateKey(keyMap);
  18. System.err.println("公钥: \n\r" + publicKey);
  19. System.err.println("私钥: \n\r" + privateKey);
  20. }
  21. @Test
  22. public void test() throws Exception {
  23. System.err.println("公钥加密——私钥解密");
  24. String inputStr = "abc";
  25. byte[] encodedData = RSACoder.encryptByPublicKey(inputStr, publicKey);
  26. byte[] decodedData = RSACoder.decryptByPrivateKey(encodedData,
  27. privateKey);
  28. String outputStr = new String(decodedData);
  29. System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);
  30. assertEquals(inputStr, outputStr);
  31. }
  32. @Test
  33. public void testSign() throws Exception {
  34. System.err.println("私钥加密——公钥解密");
  35. String inputStr = "sign";
  36. byte[] data = inputStr.getBytes();
  37. byte[] encodedData = RSACoder.encryptByPrivateKey(data, privateKey);
  38. byte[] decodedData = RSACoder.decryptByPublicKey(encodedData, publicKey);
  39. String outputStr = new String(decodedData);
  40. System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);
  41. assertEquals(inputStr, outputStr);
  42. System.err.println("私钥签名——公钥验证签名");
  43. // 产生签名
  44. String sign = RSACoder.sign(encodedData, privateKey);
  45. System.err.println("签名:" + sign);
  46. // 验证签名
  47. boolean status = RSACoder.verify(encodedData, publicKey, sign);
  48. System.err.println("状态:" + status);
  49. assertTrue(status);
  50. }
  51. }

前端代码

依赖 jsencrypt 项目

  1. <script src="bin/jsencrypt.min.js"></script>
  2. <script type="text/javascript">
  3. var encrypt = new JSEncrypt();
  4. encrypt.setPublicKey('java生成的公钥');
  5. var encrypted = encrypt.encrypt('加密的字符串');
  6. </script>

说明

前端生成加密的字符串encrypted,传到后台,java使用私钥进行解密就可以。

RSA算法 JS加密 JAVA解密的更多相关文章

  1. RSA js加密 java解密

    1. 首先你要拥有一对公钥.私钥: ``` pubKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1gr+rIfYlaNUNLiFsK/Kn ...

  2. 使用PHP实现RSA算法的加密和解密

    本文提供使用RSA算法加密解密数据的PHP程序类(签名和验签的实现方式可以查看使用PHP实现RSA算法的签名和验签 这篇文章),封装了格式化公钥和私钥文件的方法,这样无论使用什么格式的公钥或者私钥都可 ...

  3. RSA前台js加密,后台C#解密

    一.需求: 为了安全,项目中前台登陆用的密码需要加密传到后台,后台c#解密登陆密码. 二.解决方案 采用非对称加密算法RSA来达到目的,前台登陆页面一加载便发送一次ajax请求获取后台产生的公钥,用于 ...

  4. <密码学入门>关于RSA算法的加密解密及代码实现

    RSA算法 是一种公钥加密算法,RSA算法相比别的算法思路非常清晰,但是想要破解的难度非常大.RSA算法基于一个非常简单的数论事实:两个素数相乘得到一个大数很容易,但是由一个大数分解为两个素数相乘却非 ...

  5. 【转】Java Cipher类 DES算法(加密与解密)

    Java Cipher类 DES算法(加密与解密) 1.加密解密类 import java.security.*; import javax.crypto.*; import java.io.*; / ...

  6. 【知识积累】DES算法之C#加密&Java解密

    一.前言 在项目需要添加安全模块,客户端调用服务端发布的service必须要经过验证,加密算法采用DES,客户端采用C#进行加密,服务端使用Java进行解密.废话不多说,直接上代码. 二.客户端 客户 ...

  7. C#使用RSA证书文件加密和解密示例

    修改MSDN上的示例,使之可以通过RSA证书文件加密和解密,中间遇到一个小问题. Q:执行ExportParameters()方法时,回报CryptographicException:该项不适于在指定 ...

  8. RSA前端JS加密,后端JAVA解密实现

    用RSA非对称加密方式实现.后台生成rsa密钥对,然后在页面设置rsa公钥,提交时用公钥加密密码,生成的密文传到后台,后台再用私钥解密,获取密码明文.这样客户端只需要知道rsa加密方式和公钥,前台不知 ...

  9. JS到PHP使用RSA算法进行加密通讯

    我们平时做用户登录表单提交,用户名密码都是明文直接POST到后端,这样很容易被别人从监听到. 在js上做rsa,感觉jsencrypt这个是封装的比较好的,但用起来还是遇到了些坑,所以踩进代码里填填坑 ...

随机推荐

  1. 通用ajax请求方法封装,兼容主流浏览器

    ajax简单介绍 没有AJAX会怎么样?普通的ASP.Net每次运行服务端方法的时候都要刷新当前页面. 假设没有AJAX,在youku看视频的过程中假设点击了"顶.踩".评论.评论 ...

  2. Cas Server源码编译现场实例

    最近公司有项目需要做单点登录,根据要求就写下这篇从github上下载的包到项目编译通过,再到修改原代码实现自己的特殊逻辑. 前提: java环境 tomcat环境 maven环境 MyEclipse开 ...

  3. 【AIX】查看系统内存、CPU等信息

    1.查看内存大小(结果单位为kb) bootinfo –r 2.查看物理CPU个数 prtconf|grep Processors 3.查看逻辑CPU个数 pmcycles –m 4.查看COU核数 ...

  4. C#DES加密,JavaDES解密,另转C#和Java实现Des完整代码

    C#DES加密,JavaDES解密,另转C#和Java实现Des完整代码 转载 2014年06月17日 17:36:09 标签: DES / C#DES / JavaDES / C#和Java交叉DE ...

  5. V-rep学习笔记:串口操作

    VREP Regular API提供了串口操作的相关函数,可以对串口进行打开.关闭和读写: 下面使用一款淘宝上常见的AHRS(Attitude and heading reference system ...

  6. python之函数用法get()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法get() #http://www.runoob.com/python/att-dic ...

  7. linux下kerberos教程

    一.kerberos介绍 Kerberos这一名词来源于希腊神话“三个头的狗——地狱之门守护者”系统设计上采用客户端/服务器结构与DES加密技术,并且能够进行相互认证,即客户端和服务器端均可对对方进行 ...

  8. >/dev/null 2>&1 这句话的含义及使用的意义

    一般在shell包括dos下都可能会这样使用. null是一个名叫null小桶的东西,将输出重定向到它的好处是不会因为输出的内容过多而导致文件大小不断的增加.其实,你就认为null就是什么都没有,也就 ...

  9. Ubuntu16.04下的stm32环境配置

    安装stlink 必须安装libusb-1.0-0-dev, 其他安装不起作用 -dev git clone https://github.com/texane/stlink.git cd stlin ...

  10. Kubernetes的Cron Job

    Kubernetes集群使用Cron Job管理基于时间的作业,可以在指定的时间点执行一次或在指定时间点执行多次任务. 一个Cron Job就好像Linux crontab中的一行,可以按照Cron定 ...