在做项目中的登录功能时一般是通过form表单或者ajax方式将参数提交到服务器进行验证,在这个过程中,在前端对登录密码先进行一次加密的话,安全性肯定要优于直接提交的方式。最近在看博客园的登录页面时发现博客园的登录是用ajax发送http请求的方式,并在前端采用了加密,是采用jsencypt在前端进行加密的。后面查阅资料后了解到淘宝、京东也有用jsencypt库对登录密码进行前端加密的操作。jsencypt具体的使用参考:
https://github.com/travist/jsencrypt

下面简单介绍基本的使用:
创建密钥对JKS格式keystore:

keytool -genkey -v -alias test -keyalg RSA -keystore test.jks

将JKS格式keystore转换成PKCS12证书文件:

keytool -importkeystore -srckeystore test.jks -destkeystore test.p12 -srcstoretype JKS -deststoretype PKCS12

使用OpenSSL工具从PKCS12证书文件导出密钥对:

openssl pkcs12 -in test.p12 -nocerts -nodes -out test.key

从密钥对中提取出公钥:

openssl rsa -in test.key -pubout -out test_public.pem

拿到公钥test_public.pem后,在cat test_public.pem查看这个公钥内容,内容是base64格式的,这个公钥就是供在前端用jsencrypt对登录密码等参数进行RSA加密用的,看下test_public.pem内容:(这里复制github上的过来,读者可以自行尝试)

-----BEGIN RSA PUBLIC KEY-----
MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ
WMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNR
aY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB
AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fv
xTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeH
m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd
-----END RSA PUBLIC KEY-----

接下来用一段简单的前端代码演示下jsencrypt的使用:

<!doctype html><html><head><title>jsencrypt使用</title><script src="./jquery.min.js"></script><script src="./jsencrypt.min.js"></script><script type="text/javascript">$(function() {$('submit').click(function() {                var data = [];data['username']= $('#username').val();data['passwd']= $('#passwd').val();                var publickey = $('#publickey').val();encryptSend('./Jsencrypt.do', data, publickey);  // Jsencrypt.do对应服务端处理地址});});        // 使用jsencrypt库加密前端参数function encryptSend(url, data, publicKey){            var jsencrypt = new JSEncrypt();jsencrypt.setPublicKey(publicKey);            // enData用来装载加密后的数据var enData = new Object();            // 将参数用jsencrypt加密后赋给enDatafor(var key in data){enData[key] = jsencrypt.encrypt(data[key]);}$.ajax({url: url,type: 'post',data: enData,dataType: 'json',success: function (data) {                    console.info(data);},error: function (xhr) {                    console.error('Something went wrong....');}});}    </script></head><body><label for="publickey">Public Key</label><br/><textarea id="publickey" rows="20" cols="60">-----BEGIN RSA PUBLIC KEY-----MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNRaY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQABAoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fvxTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeHm7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd-----END RSA PUBLIC KEY-----    </textarea><br/><label for="input">jsencrypt:</label><br/>name:<input id="username" name="username" type="text"></input><br/>password:<input id="passwd" name="passwd" type="password"></input><br/><input id="submit" type="button" value="submit" /></body>
</html>

下面演示服务端解密过程,以Java为例。

import java.io.FileInputStream;
import java.security.KeyStore;
import javax.crypto.Cipher;
import org.apache.log4j.Logger;
import sun.misc.BASE64Decoder;public class JsencryptTest {    private static final Logger logger = Logger.getLogger(JsencryptTest.class);    public static void main(String[] args) {        byte[] bs = null;        try {BASE64Decoder decoder = new BASE64Decoder();            // encodePwd是前端密码使用公钥通过jscencrypt进行加密后得到的(这里也是复制github上的举例)String encodePwd = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQ"+ "DlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6"+ "khyfD1Yt3YiCgQWMNW649887VGJiGr/L5i2o"+ "sbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdh"+ "UTooNRaY5nZiu5PgDB0ED/ZKBUSLKL7eibMx"+ "ZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB";bs = decoder.decodeBuffer(encodePwd);} catch (Exception e) {e.printStackTrace();}KeyStore keyStore = null;        try {keyStore = KeyStore.getInstance("JKS");keyStore.load(new FileInputStream("D:/jsencrypt/test.jks"), "123456".toCharArray());Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, keyStore.getKey("test", "123456".toCharArray()));logger.info(new String(cipher.doFinal(bs)));} catch (Exception e) {e.printStackTrace();}}
}

当然在服务端除了上面这样的处理方式外,也可以根据实际业务场景使用不同的处理方式。

转载自微信公众号:weknow

使用jsencrypt实现参数的前端加密相关推荐

  1. java rsa加密解密_前端实现对请求参数进行RSA加密amp;解密,针对字符串过长进行分段加密amp;分段解密的处理...

    前言 在需求开发中,为了安全起见,我们都会难免遇到需要对一些敏感参数进行加密或者解密.所以,今天给大家分享的就是使用jsencrypt对请求参数进行RSA加密与解密,发这篇文章其实主要因为近期我的一位 ...

  2. 前端利用jsencrypt.min.js进行RSA加密(常用在登录密码加密)全局方法封装

    步骤: 项目中下载 npm install jsencrypt untils文件下新建js文件,封装公共方法 import JSEncrypt from 'jsencrypt/bin/jsencryp ...

  3. Vue中前端加密使用RSA加密下的JSEncrypt防止明文暴露

    场景 前端使用Vue在进行登录时,需要将密码存进cookie中. 为了防止密码明文暴露,前端需要采用加密方式对密码进行加密. 常用加密方式之一就是RSA加密解密. RSA加密是一种非对称加密.可以在不 ...

  4. java 登录数据前端加密+后台验证RSA

    前端加密使用RSA+MD5+自写算法 使用到了 md5.js+jsencrypt.min.js+1.js+RSAUtils.java(自写算法) 下载链接:https://gitee.com/gy29 ...

  5. 挖洞实战之信息泄露与前端加密

    前言 本文并非密码向,不会对算法过程/代码逻辑进行具体阐述,因为这没有意义,实战的时候肯定是具体问题具体分析,所以了解个大致流程就行. 在挖洞过程中,很容易找到一些登录/忘记密码是手机验证码验证的站, ...

  6. 前端加密解密 crypto-js

    目录 1. 了解加密解密 2. 实现库 3.方法封装-前端 4. 示例 5. 不使用封装 6. 说明 总结 加密算法类库,进行 MD5. SHA1. SHA2. SHA3. RIPEMD-160 哈希 ...

  7. 【转】挖洞实战之信息泄露与前端加密

    原文链接:挖洞实战之信息泄露与前端加密 - FreeBuf网络安全行业门户 前言 本文并非密码向,不会对算法过程/代码逻辑进行具体阐述,因为这没有意义,实战的时候肯定是具体问题具体分析,所以了解个大致 ...

  8. RSA非对称加密传输---前端加密解密(VUE项目)

    A要传给B一句话(需要保密),就由B生成一对公钥和私钥存好,公钥就好比一把锁,钥匙就是私钥.B只需要把锁给A,A把那句话锁起来,交还给B,在这过程中,即使大家都能看到公钥(锁),也是不知道那句话是啥的 ...

  9. 记一次破解前端加密详细过程

    应工作需要爬过各种各样的航空公司网站,大到B2B平台,小到东南亚某某航空官网,从最初使用webdriver+selenium爬虫到现在利用http请求解析html,经历过各种各样的问题,webdriv ...

  10. 国密SM2前端加密,Java后台解密问题

    背景:要实现请求参数加密的功能,使用的是国密SM2算法,前端向后台发送请求获取公钥,将请求加密发送到后台,后台用对应的私钥进行解密 问题:前端进行加密的请求,后台无法进行解析 解决方案:(此处所用的类 ...

最新文章

  1. matlab有限差分一维导热,一维导热方程-有限差分法-matlab实现11.docx
  2. 【Java集合系列】---ArrayList
  3. 框架:spring总结
  4. eclipse自动补全的设置
  5. FastLeaderElection
  6. (译)我的第一游戏完成之后的5点心得体会
  7. Java利用poi-tl实现富文本HTML转Word
  8. 涨点神器!特征金字塔技术总结
  9. 结婚时贴红“囍”字的来历
  10. 第二章 SQL命令 ALTER TABLE(二)
  11. Docker Wnmp 搭建
  12. 怎么解c语言逆向编码,逆向还原C语言代码 练习1
  13. 《Blender图解教程:新手入门练习》
  14. PHP开发微信小程序的经验总结
  15. 前端校验还是后端校验
  16. UE使用(UltraEdit)
  17. 树的基本概念和遍历规则 数据结构和算法 二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历)
  18. android原生输入法皮肤,天了噜搜狗输入法安卓版皮肤竟然会说话
  19. 从校园到职场 - 选择真的比努力重要么?
  20. 数据库系统概论(知识整理)你值得拥有

热门文章

  1. EnglishWords——星期与月份
  2. eclipse(mac)启动配置-设置jdk路径
  3. python有关urllib,urllib2和requests应用记录
  4. 通过JS语句判断WEB网站的访问端是电脑还是手机
  5. Android学习笔记(一)——Android应用的界面编程
  6. 迭代器java.util.Iterator接口
  7. pyramid setup(修改版)
  8. 《如何阅读一本书》总结
  9. Netlink 0007 --- 创建实现分析
  10. 最短路 spfa算法