用户登录密码RSA加密后传输的实现,非明文密码传输
在用户登录页面,用户输入密码后,在传送到服务器端时,为防止在密码传送过程中,被如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加密后传输的实现,非明文密码传输的更多相关文章
- 电信级的RSA加密后的密码的破解方法
一直以来,电信通过HTTP劫持推送广告的方式已经存在了很多年了,这种手段至今并未停止.这种手段月光博客曾经有多次曝光,见<电信级的网络弹出广告>.<获取了电信恶意弹出广告的罪证> ...
- Centos 用户登录失败N次后锁定用户禁止登陆
针对linux上的用户,如果用户连续3次登录失败,就锁定该用户,几分钟后该用户再自动解锁 Linux有一个pam_tally2.so的PAM模块,来限定用户的登录失败次数,如果次数达到设置的阈值,则锁 ...
- Centos7下用户登录失败N次后锁定用户禁止登陆的方法
前言 针对linux上的用户,如果用户连续3次登录失败,就锁定该用户,几分钟后该用户再自动解锁.Linux有一个pam_tally2.so的PAM模块,来限定用户的登录失败次数,如果次数达到设置的阈值 ...
- Centos7 用户登录失败N次后锁定用户禁止登陆
参考网站:https://blog.csdn.net/qq_33285112/article/details/78813369 未试 思路是查找/var/log/secure中验证失败且出现的次数较 ...
- GS环境里面 9999 常用密码的加密后的值
1. Test6530 APTZ5s6vrw1dglqO/63osA== 2. aaaaaa zgnewZXGGoqcPGtNpXTSXQ== 3. cwpass 3Me34S0+zY4xEGUFtz ...
- 系统开发中使用拦截器校验是否登录并使用MD5对用户登录密码进行加密
项目名称:客户管理系统 项目描述: 项目基于javaEE平台,B/S模式开发.使用Struts2.Hibernate/Spring进行项目框架搭建.使用Struts中的Action 控制器进行用户访问 ...
- 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输
Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...
- 如何正确对用户密码进行加密?转自https://blog.csdn.net/zhouyan8603/article/details/80473083
本文介绍了对密码哈希加密的基础知识,以及什么是正确的加密方式.还介绍了常见的密码破解方法,给出了如何避免密码被破解的思路.相信读者阅读本文后,就会对密码的加密有一个正确的认识,并对密码正确进行加密措施 ...
- iOS动态部署之RSA加密传输Patch补丁
概要:这一篇博客主要说明下iOS客户端动态部署方案中,patch(补丁)是如何比较安全的加载到客户端中. 在整个过程中,需要使用RSA来加密(你可以选择其它的非对称加密算法),MD5来做校验(同样,你 ...
随机推荐
- 管理后台-第二部分:Custom sections in Umbraco 7 – Part 2 the views(翻译文档)
在上一篇文章中我们讨论了怎样在我们Umbraco7.0版本中去添加一个新的自定义的应用程序(或部分)和如何去定义一个树.现在我将给你展示你改何如添加视图,来使你的内容可以做一些更有意义的事情. The ...
- JavaScript原型(链)学习笔记
javascript是基于原型的一门脚本语言,那究竟原型是什么? 本文将从以下几个方面重点阐述原型 构造函数是什么? 构造函数和我们常见的Array String有什么关系? 原型的使用? __pro ...
- 动态创建DataTable总结
最简单的: DataTable dt = new DataTable(); dt.Columns.Add("id"); dt.Columns.Add("name" ...
- Mac下kernel_task占用大量CPU怎么办?
我们都知道要想让电脑运行的快速,那么就要尽量的保持内存和CPU的充足.不过一些MAC用户发现MAC系统中的Kernel_task会占用大量的CPU,导致电脑发热变卡.这个问题该怎么解决呢? 具体操作步 ...
- hdu 1222 Wolf and Rabbit
Problem Description There is a hill with n holes around. The holes are signed from 0 to n-1. A rabbi ...
- 备忘-zTree v3.5 Demo 演示
zTree v3.5 Demo 演示: http://www.ztree.me/v3/demo.php#_110
- iOS开发--图片处理
纵观现实社会和移动app市场,这是一个看脸的时代,而好看且漂亮的APP界面就是移动APP的脸.漂亮的外观后面少不了UI设计人员的辛苦,如果不懂的处理,就浪费了UI设计人员的心血. 比如下面这张图片,是 ...
- Professional iOS Network Programming Connecting the Enterprise to the iPhone and iPad
Book Description Learn to develop iPhone and iPad applications for networked enterprise environments ...
- 20150410---GridView分页(备忘)
GridView自带分页功能,但是模板单一,试用较少数据. AllowPaging="true" PageSize="10" 启用分页设置.默认每页数量为10 ...
- 嵌入值和序列化LOB
Embedded Value 把一个对象映射成另一个对象表中的若干字段. OO系统中会有很多小对象(DataRange,Money).而作为表在DB中毫无意义. 默认想法是把一个对象保存为一个表. 但 ...