在用户登录页面,用户输入密码后,在传送到服务器端时,为防止在密码传送过程中,被如360这种东东给拦截到,

需要在传送前对密码进行加密,然后再传送!

利用RSA加密,在客户端使用公钥对密码进行加密,在服务器端接收时使用私钥进行解密

JS端加密主要用到https://github.com/jasondavies/jsbn所述的功能来实现

1、使用linux服务器生成pem文件

$ openssl genrsa -out key.pem

2、提取modulus用作js加密的密钥(红字部份)

$ openssl rsa -in key.pem -noout -modulus

Modulus=C4E4B9345F5BA44DDE717385660EBF6A217CF2D59145A3DA3B57D460A285242E04D7CF57969E77749BC6D325B1381E29BD827F90F13909A97256B4B6B217141F
3、参照https://github.com/jasondavies/jsbn自己引用jsbn.js、prng4.js、rng.js、rsa.js、base64.js

4、JS脚本加密

var RSAPublicKey="C4E4B9345F5BA44DDE717385660EBF6A217CF2D59145A3DA3B57D460A285242E04D7CF57969E77749BC6D325B1381E29BD827F90F13909A97256B4B6B217141F";
var strPassword="123456";
var RSA = new RSAKey();
RSA.setPublic(RSAPublicKey, "10001");
strPassword = RSA.encrypt(strPassword);

在服务器端,使用Rsa来解密

package com.zufangbao.core.security;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Security;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.apache.log4j.Logger;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;
import org.springframework.stereotype.Component;

/**
 * RSA加解密处理
 * @author Administrator
 *
 */
@Component
public class RsaUtil {
	private static final Logger log = Logger.getLogger(RsaUtil.class);

	public RsaUtil(){
	}
	/**
	 * 使用Pom初始化 @see setPomFile
	 * @param pomFile
	 */
	public RsaUtil(String pemFile){
		this.setPemFile(pemFile);
	}
	/**
	 * 使用公钥私钥初始化 @see setKey
	 * @param publicKey
	 * @param privateKey
	 */
	public RsaUtil(PublicKey publicKey, PrivateKey privateKey){
		this.setKey(publicKey, privateKey);
	}
	/**
	 * 使用公钥私钥文件初始化 @see setKey
	 * @param publicKeyFile
	 * @param privateKeyFile
	 */
	public RsaUtil(String publicKeyFile, String privateKeyFile){
		this.setKey(publicKeyFile, privateKeyFile);
	}
	private PublicKey publicKey;
	private PrivateKey privateKey;
	/**
	 * 获取公钥
	 * @return
	 */
	public PublicKey getPublicKey() {
		return publicKey;
	}
	/**
	 * 设置公钥
	 * @param publicKey
	 */
	public void setPublicKey(PublicKey publicKey) {
		this.publicKey = publicKey;
	}
	/**
	 * 获取私钥
	 * @return
	 */
	public PrivateKey getPrivateKey() {
		return privateKey;
	}
	/**
	 * 设置私钥
	 * @param privateKey
	 */
	public void setPrivateKey(PrivateKey privateKey) {
		this.privateKey = privateKey;
	}
	/**
	 * 设置POM文件方式指定公钥私钥
	 * @param pomFile
	 */
	public void setPemFile(String pemFile){
		BufferedReader br = null;
		try{
			br = new BufferedReader(new FileReader(pemFile));
			Security.addProvider(new BouncyCastleProvider());

			PEMKeyPair kp = (PEMKeyPair) new PEMParser(br).readObject();
			byte[] encodedPublicKey = kp.getPublicKeyInfo().getEncoded();
			byte[] encodedPrivateKey = kp.getPrivateKeyInfo().getEncoded();

			// Now convert to Java objects
			KeyFactory keyFactory = KeyFactory.getInstance( "RSA");
			X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedPublicKey);
			PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);

			PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedPrivateKey);
			PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
			this.setKey(publicKey, privateKey);
		}catch(Exception e){
			log.fatal("setPomFile failed", e);
		}finally{
			if (br != null){
				try {
					br.close();
				} catch (IOException e) {
					log.fatal("setPomFile failed", e);
				}
			}
		}
	}
	/**
	 * 设置公钥私钥
	 * @param publicKey
	 * @param privateKey
	 */
	public void setKey(PublicKey publicKey, PrivateKey privateKey){
		this.publicKey = publicKey;
		this.privateKey = privateKey;
	}
	/**
	 * 设置公钥私钥
	 * @param publicKeyFile
	 * @param privateKeyFile
	 */
	public void setKey(String publicKeyFile, String privateKeyFile){
		PublicKey publicKey = this.readPublicKey(publicKeyFile);
		PrivateKey privateKey = this.readPrivateKey(privateKeyFile);
		this.setKey(publicKey, privateKey);
	}
	/**
	 * 读取公钥
	 * @param keyFile
	 * @return
	 */
	private PublicKey readPublicKey(String keyFile){
		FileInputStream fis = null;
		try{
			fis = new FileInputStream(keyFile);
			byte[] bytes = new byte[fis.available()];
			fis.read(bytes);
			PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
			KeyFactory factory = KeyFactory.getInstance("RSA");
			PublicKey key = factory.generatePublic(keySpec);
			return key;
		}catch(Exception e){
			log.fatal("readPublicKey failed", e);
			return null;
		}finally{
			if (fis != null){
				try {
					fis.close();
				} catch (IOException e) {
					log.fatal("readPublicKey failed", e);
				}
			}
		}
	}
	/**
	 * 读取私钥
	 * @param keyFile
	 * @return
	 */
	private PrivateKey readPrivateKey(String keyFile){
		FileInputStream fis = null;
		try{
			fis = new FileInputStream(keyFile);
			byte[] bytes = new byte[fis.available()];
			fis.read(bytes);
			PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
			KeyFactory factory = KeyFactory.getInstance("RSA");
			PrivateKey key = factory.generatePrivate(keySpec);
			return key;
		}catch(Exception e){
			log.fatal("readPublicKey failed", e);
			return null;
		}finally{
			if (fis != null){
				try {
					fis.close();
				} catch (IOException e) {
					log.fatal("readPublicKey failed", e);
				}
			}
		}
	}
	/**
	 * 加密字符串
	 * @param value 普通字符串 长度不能超过53个字节
	 * @return 返回Base64位编码的字符串
	 */
	public String encryptString2b64(String value){
		if (this.getPublicKey() == null){
			log.fatal("RSA公钥为空,加密失败");
			return null;
		}
		try{
			Cipher cipher = Cipher.getInstance("RSA");
	        cipher.init(Cipher.ENCRYPT_MODE, this.getPublicKey());
	        byte[] bytes = cipher.doFinal(value.getBytes());
	        return Base64.encodeBase64String(bytes);
		}catch(Exception e){
			log.fatal("encryptString failed", e);
			return null;
		}
	}
	/**
	 * 使用私钥解码Base64位字串
	 * @param value Base64位字串
	 * @return 返回原始字符串
	 */
	public String decryptString4b64(String value){
		if (this.getPrivateKey() == null){
			log.fatal("RSA私钥为空,加密失败");
			return null;
		}
		if (value == null){
			log.fatal("待RSA解密字串不能为空");
			return null;
		}
		try{
			Cipher cipher = Cipher.getInstance("RSA");
	        cipher.init(Cipher.DECRYPT_MODE, this.getPrivateKey());
	        byte[] bytes = Base64.decodeBase64(value);
	        bytes = cipher.doFinal(bytes);
	        return new String(bytes);
		}catch(Exception e){
			log.fatal("decryptString failed", e);
			return null;
		}
	}
	/**
	 * 加密字符串
	 * @param value 普通字符串 长度不能超过53个字节
	 * @return 返回hex编码的字符串
	 */
	public String encryptString2hex(String value){
		if (this.getPublicKey() == null){
			log.fatal("RSA公钥为空,加密失败");
			return null;
		}
		try{
			Cipher cipher = Cipher.getInstance("RSA");
	        cipher.init(Cipher.ENCRYPT_MODE, this.getPublicKey());
	        byte[] bytes = cipher.doFinal(value.getBytes());
	        return new String(Hex.encodeHex(bytes));
		}catch(Exception e){
			log.fatal("encryptString failed", e);
			return null;
		}
	}
	/**
	 * 使用私钥解码hex字串
	 * @param value hex字串
	 * @return 返回原始字符串
	 */
	public String decryptString4hex(String value){
		if (this.getPrivateKey() == null){
			log.fatal("RSA私钥为空,加密失败");
			return null;
		}
		if (value == null){
			log.fatal("待RSA解密字串不能为空");
			return null;
		}
		try{
			Cipher cipher = Cipher.getInstance("RSA");
	        cipher.init(Cipher.DECRYPT_MODE, this.getPrivateKey());
	        byte[] bytes = Hex.decodeHex(value.toCharArray());
	        bytes = cipher.doFinal(bytes);
	        return new String(bytes);
		}catch(Exception e){
			log.fatal("decryptString failed", e);
			return null;
		}
	}
}

  pom.xml主要依赖有

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.8</version>
</dependency>
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcpkix-jdk15on</artifactId>
    <version>1.49</version>
</dependency>

 在项目中通过spring注入pem文件,实现解密

用户登录密码RSA加密后传输的实现,非明文密码传输的更多相关文章

  1. 电信级的RSA加密后的密码的破解方法

    一直以来,电信通过HTTP劫持推送广告的方式已经存在了很多年了,这种手段至今并未停止.这种手段月光博客曾经有多次曝光,见<电信级的网络弹出广告>.<获取了电信恶意弹出广告的罪证> ...

  2. Centos 用户登录失败N次后锁定用户禁止登陆

    针对linux上的用户,如果用户连续3次登录失败,就锁定该用户,几分钟后该用户再自动解锁 Linux有一个pam_tally2.so的PAM模块,来限定用户的登录失败次数,如果次数达到设置的阈值,则锁 ...

  3. Centos7下用户登录失败N次后锁定用户禁止登陆的方法

    前言 针对linux上的用户,如果用户连续3次登录失败,就锁定该用户,几分钟后该用户再自动解锁.Linux有一个pam_tally2.so的PAM模块,来限定用户的登录失败次数,如果次数达到设置的阈值 ...

  4. Centos7 用户登录失败N次后锁定用户禁止登陆

    参考网站:https://blog.csdn.net/qq_33285112/article/details/78813369  未试 思路是查找/var/log/secure中验证失败且出现的次数较 ...

  5. GS环境里面 9999 常用密码的加密后的值

    1. Test6530 APTZ5s6vrw1dglqO/63osA== 2. aaaaaa zgnewZXGGoqcPGtNpXTSXQ== 3. cwpass 3Me34S0+zY4xEGUFtz ...

  6. 系统开发中使用拦截器校验是否登录并使用MD5对用户登录密码进行加密

    项目名称:客户管理系统 项目描述: 项目基于javaEE平台,B/S模式开发.使用Struts2.Hibernate/Spring进行项目框架搭建.使用Struts中的Action 控制器进行用户访问 ...

  7. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  8. 如何正确对用户密码进行加密?转自https://blog.csdn.net/zhouyan8603/article/details/80473083

    本文介绍了对密码哈希加密的基础知识,以及什么是正确的加密方式.还介绍了常见的密码破解方法,给出了如何避免密码被破解的思路.相信读者阅读本文后,就会对密码的加密有一个正确的认识,并对密码正确进行加密措施 ...

  9. iOS动态部署之RSA加密传输Patch补丁

    概要:这一篇博客主要说明下iOS客户端动态部署方案中,patch(补丁)是如何比较安全的加载到客户端中. 在整个过程中,需要使用RSA来加密(你可以选择其它的非对称加密算法),MD5来做校验(同样,你 ...

随机推荐

  1. CNZZ每天百亿条日志写入,SLS+ODPS轻松拆招

    如果你是一个站长,想要提交一个查询,从一亿多条日志中找出从湖南省发出.使用ISP电信.通过百度搜索跳转到达的访问日志.该怎么做? 别急,在接收到您的查询条件后,CNZZ可以快速通过SLS(简单日志服务 ...

  2. 重构20-Extract Subclass(提取父类)

    当一个类中的某些方法并不是面向所有的类时,可以使用该重构将其迁移到子类中.我这里举的例子十分简单,它包含一个Registration类,该类处理与学生注册课程相关的所有信息. public class ...

  3. 【原创】mac 上如何安装及切换输入法

    1. 安装输入法 刚购入mac mini一台,默认只有英文输入法,而自己用习惯了sogou输入法,于是就在网上下载安装了一个sogou拼音输入 for mac. 下载完毕后,在屏幕下方的dock区域右 ...

  4. Jboss中不能正常的解析EL表达式

    在写好EL表达是后发现在页面原封不动的现实成了${user.name}没有解析出来,我还以为那里出了问题,原来只要在页面添加上<%@ page isELIgnored="false&q ...

  5. 机房收费系统之uml图——初版

    说起uml图,在我心中最难的当属类图无疑.虽然敲了三层的小例子,但真正让把三层和uml图结合起来,并且还要考虑设计模式的时候,总是让人有一种无从下手的感觉,不过还好,通过这半个多月的思考与探索(竟然用 ...

  6. React Native视频播放(iOS)

    网站链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/learn-react-native-video/ React Nativ ...

  7. UVA 113 Power of Cryptography (数学)

    Power of Cryptography  Background Current work in cryptography involves (among other things) large p ...

  8. Angularjs 中使用指令绑定点击事件

    项目中,模板中的菜单是jQuery控制的,在Angularjs中就运行不到了,因为菜单项是ng-repeat之后的. 如html <ul id="main-menu"> ...

  9. Android之列表内容显示

    一:刚开始布局设计:在layout的activity_main中添加listView,效果图如下: 二:在Main_Activity中代码如下: package net.jiaxiang.arrada ...

  10. 初次尝试ColumnStore Index

    1.首先使用非聚集索引 SET STATISTICS IO ON SET STATISTICS TIME ON SELECT MemberId , MAX(AddDT) AS RecentSucDT ...