全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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小时内与您取得联系。