jquery实现登录加密的几种方法以及cookie存放加密/解密
本篇文章的所有操作都是在jsp页面上进行的,完全与后台分离
part 1:加密方式
这个加密方式网上基本都有很多人总结,我在此也就抛砖引玉一下;
1、base64加密
在页面中引入base64.js文件,调用方法为:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>base64加密</title>
<script type="text/javascript" src="base64.js"></script>
<script type="text/javascript">
var b = new Base64();
var str = b.encode("admin:admin");
alert("base64 encode:" + str);
//解密
str = b.decode(str);
alert("base64 decode:" + str);
</script>
</head> <body>
</body>
</html>
2、md5加密
在页面中引用md5.js文件,调用方法为
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>md5加密</title>
<script type="text/ecmascript" src="md5.js"></script>
<script type="text/javascript">
var hash = hex_md5("123dafd");
alert(hash)
</script>
</head> <body>
</body>
</html>
3、sha1加密
据说这是最安全的加密
页面中引入sha1.js,调用方法为
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>sha1加密</title>
<script type="text/ecmascript" src="sha1.js"></script>
<script type="text/javascript">
var sha = hex_sha1('mima123465')
alert(sha)
</script>
</head> <body>
</body>
</html>
part 2:加密以及解密
md5.js只能实现加密功能,但是如果你从cookie中把密码取出来想解密的时候就尴尬了,所以此处我推荐两种密码加密又能解密的方法
1.Base64.js
废话不说,直接看代码(此处包括如何在jsp页面往cookie中保存用户名和密码)
<script>
//step 1:当鼠标点击复选框时,创建一个持久化的cookie
var userName=null;
var passWord=null;
//限制为:鼠标点击登录时判断:
$("#accLogBut").click(function(){
/* 将登录按钮置灰 */ //如果被选中状态,则创建cookie
if($('input[type=checkbox]').is(':checked')){
passWord = $('#passWord').val();
//创建cookie,并将用户名和密码保存进去,密码采用base64加密以及解密
$.cookie('userName',$('#userName').val(), { expires: 7});
$.cookie('passWord',$.base64.encode(passWord),{ expires: 7});
}else{
//如果复选框没有被选中,则删除cookie $.cookie('userName', "");
$.cookie('passWord', "");
}
});
//页面每次被加载的时候,都把cookie中的值取出来,然后存放到对应的文本框中
$(function(){ var userName=$.cookie('userName');
var passWord=$.cookie('passWord'); $("#userName").val(userName);
$("#passWord").val($.base64.decode(passWord));
if(userName!=null&&userName!=""&&passWord!=null&&passWord!=""){ $("#rememberPassword").attr("checked",true);
} });
</script>
<!-- 登录时记住密码结束-->
主要用到上面的两种方法:$.base64.encode(str)加密字符串
$.base64.decode(str)解密字符串
2.这是jquery插件库中的一种比较轻量级的加密解密过程
名字叫做DES
前端采用谷歌的crypto-js
直接上代码
前端需要引入的js
<script type="text/javascript" src="js/jquery.min.js" ></script>
<script type="text/javascript" src="js/tripledes.js" ></script>
<script type="text/javascript" src="js/mode-ecb.js" ></script>
关键方法
DES加密
// DES加密
function encryptByDES(message, key) {
var keyHex = CryptoJS.enc.Utf8.parse(key);
var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
我们对helloworld进行DES加密,key设置为12345678
加密后的结果为
ovATL3QOQmKh0WiTqhkSbg==
后台采用java版本的DES解密
java版的DES工具类
DESUtil.java
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException; import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec; /**
* DES加解密工具类
*
*/
public class DESUtil {
private static final String DES_ALGORITHM = "DES"; /**
* DES加密
*
* @param plainData 原始字符串
* @param secretKey 加密密钥
* @return 加密后的字符串
* @throws Exception
*/
public static String encryption(String plainData, String secretKey) throws Exception { Cipher cipher = null;
try {
cipher = Cipher.getInstance(DES_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, generateKey(secretKey)); } catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) { } try {
// 为了防止解密时报javax.crypto.IllegalBlockSizeException: Input length must
// be multiple of 8 when decrypting with padded cipher异常,
// 不能把加密后的字节数组直接转换成字符串
byte[] buf = cipher.doFinal(plainData.getBytes()); return Base64Utils.encode(buf); } catch (IllegalBlockSizeException e) {
e.printStackTrace();
throw new Exception("IllegalBlockSizeException", e);
} catch (BadPaddingException e) {
e.printStackTrace();
throw new Exception("BadPaddingException", e);
} } /**
* DES解密
* @param secretData 密码字符串
* @param secretKey 解密密钥
* @return 原始字符串
* @throws Exception
*/
public static String decryption(String secretData, String secretKey) throws Exception { Cipher cipher = null;
try {
cipher = Cipher.getInstance(DES_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, generateKey(secretKey)); } catch (NoSuchAlgorithmException e) {
e.printStackTrace();
throw new Exception("NoSuchAlgorithmException", e);
} catch (NoSuchPaddingException e) {
e.printStackTrace();
throw new Exception("NoSuchPaddingException", e);
} catch (InvalidKeyException e) {
e.printStackTrace();
throw new Exception("InvalidKeyException", e); } try { byte[] buf = cipher.doFinal(Base64Utils.decode(secretData.toCharArray())); return new String(buf); } catch (IllegalBlockSizeException e) {
e.printStackTrace();
throw new Exception("IllegalBlockSizeException", e);
} catch (BadPaddingException e) {
e.printStackTrace();
throw new Exception("BadPaddingException", e);
}
} /**
* 获得秘密密钥
*
* @param secretKey
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
* @throws InvalidKeyException
*/
private static SecretKey generateKey(String secretKey)
throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException {
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES_ALGORITHM);
DESKeySpec keySpec = new DESKeySpec(secretKey.getBytes());
keyFactory.generateSecret(keySpec);
return keyFactory.generateSecret(keySpec);
} static private class Base64Utils { static private char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
.toCharArray();
static private byte[] codes = new byte[256]; static {
for (int i = 0; i < 256; i++)
codes[i] = -1;
for (int i = 'A'; i <= 'Z'; i++)
codes[i] = (byte) (i - 'A');
for (int i = 'a'; i <= 'z'; i++)
codes[i] = (byte) (26 + i - 'a');
for (int i = '0'; i <= '9'; i++)
codes[i] = (byte) (52 + i - '0');
codes['+'] = 62;
codes['/'] = 63;
} /**
* 将原始数据编码为base64编码
*/
static private String encode(byte[] data) {
char[] out = new char[((data.length + 2) / 3) * 4];
for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {
boolean quad = false;
boolean trip = false;
int val = (0xFF & (int) data[i]);
val <<= 8;
if ((i + 1) < data.length) {
val |= (0xFF & (int) data[i + 1]);
trip = true;
}
val <<= 8;
if ((i + 2) < data.length) {
val |= (0xFF & (int) data[i + 2]);
quad = true;
}
out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];
val >>= 6;
out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];
val >>= 6;
out[index + 1] = alphabet[val & 0x3F];
val >>= 6;
out[index + 0] = alphabet[val & 0x3F];
} return new String(out);
} /**
* 将base64编码的数据解码成原始数据
*/
static private byte[] decode(char[] data) {
int len = ((data.length + 3) / 4) * 3;
if (data.length > 0 && data[data.length - 1] == '=')
--len;
if (data.length > 1 && data[data.length - 2] == '=')
--len;
byte[] out = new byte[len];
int shift = 0;
int accum = 0;
int index = 0;
for (int ix = 0; ix < data.length; ix++) {
int value = codes[data[ix] & 0xFF];
if (value >= 0) {
accum <<= 6;
shift += 6;
accum |= value;
if (shift >= 8) {
shift -= 8;
out[index++] = (byte) ((accum >> shift) & 0xff);
}
}
}
if (index != out.length)
throw new Error("miscalculated data length!");
return out;
}
}
}
jquery实现登录加密的几种方法以及cookie存放加密/解密的更多相关文章
- JQuery遍历json数组的3种方法
这篇文章主要介绍了JQuery遍历json数组的3种方法,本文分别给出了使用each.for遍历json的方法,其中for又分成两种形式,需要的朋友可以参考下 一.使用each遍历 $(functio ...
- jquery mobile切换页面的几种方法
jquery mobile切换页面的几种方法 - 不厚道青蛙之焦油潭 - 博客频道 - CSDN.NET jquery mobile切换页面的几种方法 分类: phonegap html5 2012- ...
- jquery取消事件冒泡的三种方法展示
jquery取消事件冒泡的三种方法展示 html代码 <!doctype html> <html> <head> <meta charset="ut ...
- Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解
Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解 一.Jquery遍历筛选数组 1.jquery grep()筛选遍历数组 $().ready( function(){ v ...
- jquery动态加载js三种方法实例
这里为你提供了三种动态加载js的jquery实例代码哦,由于jquery是为用户提供方便的,所以利用jquery动态加载文件只要一句话$.getScript(\"test.js\" ...
- 有关WINDOWS XP登录密码的几种方法
网上关于破解WINDOWS XP登录密码的几种方法很多,但许多根本不行.我现在总结自己试过几种,这几种方法其实均比较菜的,但可行的.WINDOWS XP登录是由SAM 文件管理的,总体来说“山姆大叔” ...
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...
- jQuery中detach&&remove&&empty三种方法的区别
jQuery中empty&&remove&&detach三种方法的区别 empty():移除指定元素内部的所有内容,但不包括它本身 remove():移除指定元素内部的 ...
- js和jquery设置css样式的几种方法
一.js设置样式的方法 1. 直接设置style的属性 某些情况用这个设置 !important值无效 element.style.height = '50px'; 2. 直接设置属性(只能用于某些 ...
随机推荐
- Day20 Django的使用_基础
老师网址: https://www.cnblogs.com/yuanchenqi/articles/7652353.html 1,复习上级课,一对一,一对多,多对多的使用 models.py: cla ...
- 学习spring中遇见的问题
报错: Unexpected exception parsing XML document from class path resource [applicationContext.xml]; nes ...
- 关于前端本地压缩图片,兼容IOS/Android/PC且自动按需加载文件之lrz.bundle.js
一.介绍说明主要特点: ①在前端压缩好要上传的图片可以更快的发送给后端,因此也特别适合在移动设备上使用. ②兼容IOS/Android,修复了IOS/Android某些版本已知的BUG. ③按需加载文 ...
- vs2015 key
vs2015 企业版 专业版 密钥 亲测可用 专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV
- Spring-mvc设置@RequestMapping标签更改返回头及@RequestMapping简述
1. 引子:设置返回头 2. 简述 3. value 4. method 5. consumes/produces 6. params 7. headers 1. 引子:设置返回头 返回JSON内容时 ...
- python爬虫入门(二)Opener和Requests
Handler和Opener Handler处理器和自定义Opener opener是urllib2.OpenerDirector的实例,我们之前一直在使用urlopen,它是一个特殊的opener( ...
- jsp 条件查询、列表分页
条件查询 dao //根据搜索条件筛选数据 public List<User> GetUserBySearch(String userName, String sex) throws SQ ...
- Alfred效率神器
下图就是Alfred的主界面我们所有的操作都在这一个界面上进行.通过热键打开主界面(本人设置的是option+command),输入一个"a"后Alfred就会为我在候选界面上显示 ...
- spring配置文件中context:property-placeholder导入多个独立的配置文件
spring中 context:property-placeholder 导入多个独立的 .properties配置文件? Spring容器采用反射扫描的发现机制,在探测到Spring容器中有一个 o ...
- meta 元标签的常用用法
< meta > 元素 概要 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 we ...