JAVA 中解密RSA算法JS加密实例详解

有这样一个需求,前端登录的用户名密码,密码必需加密,但不可使用MD5,因为后台要检测密码的复杂度,那么在保证安全的前提下将密码传到后台呢,答案就是使用RSA非对称加密算法解决 。
java代码
需要依赖 commons-codec 包
RSACoder.Java
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
/**
* Created by lake on 17-4-12.
*/
public class RSACoder {
public static final String KEY_ALGORITHM = "RSA";
public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
private static final String PUBLIC_KEY = "RSAPublicKey";
private static final String PRIVATE_KEY = "RSAPrivateKey";
public static byte[] decryptBASE64(String key) {
return Base64.decodeBase64(key);
}
public static String encryptBASE64(byte[] bytes) {
return Base64.encodeBase64String(bytes);
}
/**
* 用私钥对信息生成数字签名
*
* @param data 加密数据
* @param privateKey 私钥
* @return
* @throws Exception
*/
public static String sign(byte[] data, String privateKey) throws Exception {
// 解密由base64编码的私钥
byte[] keyBytes = decryptBASE64(privateKey);
// 构造PKCS8EncodedKeySpec对象
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
// KEY_ALGORITHM 指定的加密算法
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
// 取私钥匙对象
PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 用私钥对信息生成数字签名
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(priKey);
signature.update(data);
return encryptBASE64(signature.sign());
}
/**
* 校验数字签名
*
* @param data 加密数据
* @param publicKey 公钥
* @param sign 数字签名
* @return 校验成功返回true 失败返回false
* @throws Exception
*/
public static boolean verify(byte[] data, String publicKey, String sign)
throws Exception {
// 解密由base64编码的公钥
byte[] keyBytes = decryptBASE64(publicKey);
// 构造X509EncodedKeySpec对象
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
// KEY_ALGORITHM 指定的加密算法
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
// 取公钥匙对象
PublicKey pubKey = keyFactory.generatePublic(keySpec);
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(pubKey);
signature.update(data);
// 验证签名是否正常
return signature.verify(decryptBASE64(sign));
}
public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception{
// 对密钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 对数据解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 解密<br>
* 用私钥解密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptByPrivateKey(String data, String key)
throws Exception {
return decryptByPrivateKey(decryptBASE64(data),key);
}
/**
* 解密<br>
* 用公钥解密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptByPublicKey(byte[] data, String key)
throws Exception {
// 对密钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得公钥
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
// 对数据解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/**
* 加密<br>
* 用公钥加密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptByPublicKey(String data, String key)
throws Exception {
// 对公钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得公钥
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
// 对数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data.getBytes());
}
/**
* 加密<br>
* 用私钥加密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptByPrivateKey(byte[] data, String key)
throws Exception {
// 对密钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 对数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 取得私钥
*
* @param keyMap
* @return
* @throws Exception
*/
public static String getPrivateKey(Map<String, Key> keyMap)
throws Exception {
Key key = (Key) keyMap.get(PRIVATE_KEY);
return encryptBASE64(key.getEncoded());
}
/**
* 取得公钥
*
* @param keyMap
* @return
* @throws Exception
*/
public static String getPublicKey(Map<String, Key> keyMap)
throws Exception {
Key key = keyMap.get(PUBLIC_KEY);
return encryptBASE64(key.getEncoded());
}
/**
* 初始化密钥
*
* @return
* @throws Exception
*/
public static Map<String, Key> initKey() throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator
.getInstance(KEY_ALGORITHM);
keyPairGen.initialize(1024);
KeyPair keyPair = keyPairGen.generateKeyPair();
Map<String, Key> keyMap = new HashMap(2);
keyMap.put(PUBLIC_KEY, keyPair.getPublic());// 公钥
keyMap.put(PRIVATE_KEY, keyPair.getPrivate());// 私钥
return keyMap;
}
}
测试类
RSACoderTest.java
import org.junit.Before;
import org.junit.Test;
import java.security.Key;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Created by lake on 17-4-12.
*/
public class RSACoderTest {
private String publicKey;
private String privateKey;
@Before
public void setUp() throws Exception {
Map<String, Key> keyMap = RSACoder.initKey();
publicKey = RSACoder.getPublicKey(keyMap);
privateKey = RSACoder.getPrivateKey(keyMap);
System.err.println("公钥: \n\r" + publicKey);
System.err.println("私钥: \n\r" + privateKey);
}
@Test
public void test() throws Exception {
System.err.println("公钥加密——私钥解密");
String inputStr = "abc";
byte[] encodedData = RSACoder.encryptByPublicKey(inputStr, publicKey);
byte[] decodedData = RSACoder.decryptByPrivateKey(encodedData,
privateKey);
String outputStr = new String(decodedData);
System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);
assertEquals(inputStr, outputStr);
}
@Test
public void testSign() throws Exception {
System.err.println("私钥加密——公钥解密");
String inputStr = "sign";
byte[] data = inputStr.getBytes();
byte[] encodedData = RSACoder.encryptByPrivateKey(data, privateKey);
byte[] decodedData = RSACoder.decryptByPublicKey(encodedData, publicKey);
String outputStr = new String(decodedData);
System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);
assertEquals(inputStr, outputStr);
System.err.println("私钥签名——公钥验证签名");
// 产生签名
String sign = RSACoder.sign(encodedData, privateKey);
System.err.println("签名:" + sign);
// 验证签名
boolean status = RSACoder.verify(encodedData, publicKey, sign);
System.err.println("状态:" + status);
assertTrue(status);
}
}
前端代码
依赖 jsencrypt 项目
<script src="bin/jsencrypt.min.js"></script>
<script type="text/javascript">
var encrypt = new JSEncrypt();
encrypt.setPublicKey('java生成的公钥');
var encrypted = encrypt.encrypt('加密的字符串');
</script>
说明
前端生成加密的字符串encrypted,传到后台,java使用私钥进行解密即可。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# JAVA
# 中解密RSA算法JS加密
# RSA算法
# JS加密
# java加密算法分享(rsa解密、对称加密、md5加密)
# Java中RSA加密解密的实现方法分析
# java 加密之RSA算法加密与解密的实例详解
# Java实现的RSA加密解密算法示例
# Java-web中利用RSA进行加密解密操作的方法示例
# java使用RSA与AES加密解密的实例代码详解
# java使用RSA加密方式实现数据加密解密的代码
# vue前端RSA加密java后端解密的方法实现
# 前端RSA加密java后端解密示例代码
# 公钥
# 希望能
# 这样一个
# 谢谢大家
# 但不
# 非对称
# 前提下
# return
# key
# byte
# encodeBase64String
# bytes
# RSAPrivateKey
# SIGNATURE_ALGORITHM
# MD5withRSA
# String
# KEY_ALGORITHM
# RSAPublicKey
# PRIVATE_KEY
# private
相关文章:
,购物网站怎么盈利呢?
建站主机选购指南:核心配置优化与品牌推荐方案
常州企业网站制作公司,全国继续教育网怎么登录?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
平台云上自主建站:模板化设计与智能工具打造高效网站
网站企业制作流程,用什么语言做企业网站比较好?
建站之星如何快速更换网站模板?
,如何利用word制作宣传手册?
如何将凡科建站内容保存为本地文件?
,南京靠谱的征婚网站?
建站10G流量真的够用吗?如何应对访问高峰?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
定制建站流程解析:需求评估与SEO优化功能开发指南
网站制作员失业,怎样查看自己网站的注册者?
家具网站制作软件,家具厂怎么跑业务?
高防服务器如何保障网站安全无虞?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
建站之星如何修改网站生成路径?
岳西云建站教程与模板下载_一站式快速建站系统操作指南
韩国服务器如何优化跨境访问实现高效连接?
临沂网站制作公司有哪些,临沂第四中学官网?
制作门户网站的参考文献在哪,小说网站怎么建立?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
山东网站制作公司有哪些,山东大源集团官网?
教程网站设计制作软件,怎么创建自己的一个网站?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
如何在Ubuntu系统下快速搭建WordPress个人网站?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
免费视频制作网站,更新又快又好的免费电影网站?
已有域名和空间,如何快速搭建网站?
网站制作需要会哪些技术,建立一个网站要花费多少?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
如何制作一个表白网站视频,关于勇敢表白的小标题?
如何做静态网页,sublimetext3.0制作静态网页?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
网站制作难吗安全吗,做一个网站需要多久时间?
如何在建站主机中优化服务器配置?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
如何在云服务器上快速搭建个人网站?
建站之星如何快速解决建站难题?
,网页ppt怎么弄成自己的ppt?
html制作网站的步骤有哪些,iapp如何添加网页?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
专业公司网站制作公司,用什么语言做企业网站比较好?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
如何生成腾讯云建站专用兑换码?
*请认真填写需求信息,我们会在24小时内与您取得联系。