将 crypto-js 文件放到要引用的路径
以下是要引用到的js
2,引用,jQuery也要记得引用哦
3,在登录页的登录按钮的function里,设置key值和iv值,这是加密的设置字段,定义要进行加密的密码passwordNode
下面再加个function
function aesMinEncrypt(key, iv, word){
var _word = CryptoJS.enc.Utf8.parse(word),
_key = CryptoJS.enc.Utf8.parse(key),
_iv = CryptoJS.enc.Utf8.parse(iv)
var encrypted = CryptoJS.AES.encrypt(_word, _key, {
iv: _iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
})
return encrypted.toString()
}
3,(另一种)上面的过程也可以这样
function encryption(){
//密钥 (需要前端和后端保持一致)十六位作为密钥
var key = "ABCDEFGHIJKL_key"
//密钥偏移量 (需要前端和后端保持一致)十六位作为密钥偏移量
var iv = "ABCDEFGHIJKLM_iv"
var username=document.getElementById("usr").value
// var passwordNode=document.getElementById("paw").value
var passwordNode=aesMinEncrypt(key,iv,$("#paw").val())
console.log(passwordNode)
alert("加密后的密码为:"+passwordNode)
$.ajax({
url: "login",
async:false,
type: "POST",
data: {'username':username,'password':passwordNode},
success: function (result) {
$("html").html(result)
}
})
}
function aesMinEncrypt(key, iv, word){
var _word = CryptoJS.enc.Utf8.parse(word),
_key = CryptoJS.enc.Utf8.parse(key),
_iv = CryptoJS.enc.Utf8.parse(iv)
var encrypted = CryptoJS.AES.encrypt(_word, _key, {
iv: _iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
})
return encrypted.toString()
$("#form").submit()
}
4,前端加密就算是完成了,接下来是后端解密,后端解密需要用到一个工具类 AESUtils,里面是解密方法代码如下
package com.wuye.common.utils
import cn.jpush.api.utils.StringUtils
import sun.misc.BASE64Decoder
import javax.crypto.Cipher
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec
/**
* TODO
*
* @author CSD
* @date 2022-07-28 14:16
*/
public class AESUtils {
//密钥 (需要前端和后端保持一致)十六位作为密钥
private static final String KEY = "ABCDEFGHIJKL_key"
//密钥偏移量 (需要前端和后端保持一致)十六位作为密钥偏移量
private static final String IV = "ABCDEFGHIJKLM_iv"
//算法
private static final String ALGORITHMSTR = "AES/CBC/PKCS5Padding"
/**
* base 64 decode
* @param base64Code 待解码的base 64 code
* @return 解码后的byte[]
* @throws Exception
*/
public static byte[] base64Decode(String base64Code) throws Exception{
return StringUtils.isEmpty(base64Code) ? null : new BASE64Decoder().decodeBuffer(base64Code)
}
/**
* AES解密
* @param encryptBytes 待解密的byte[]
* @return 解密后的String
* @throws Exception
*/
public static String aesDecryptByBytes(byte[] encryptBytes) throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHMSTR)
byte[] temp = IV.getBytes("UTF-8")
IvParameterSpec iv = new IvParameterSpec(temp)
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(KEY.getBytes(), "AES"), iv)
byte[] decryptBytes = cipher.doFinal(encryptBytes)
System.out.print(new String(decryptBytes))
return new String(decryptBytes)
}
/**
* 将base 64 code AES解密
* @param encryptStr 待解密的base 64 code
* @return 解密后的string
* @throws Exception
*/
public static String aesDecrypt(String encryptStr) throws Exception {
return StringUtils.isEmpty(encryptStr) ? null : aesDecryptByBytes(base64Decode(encryptStr))
}
//测试一下
public static void main(String[] args) throws Exception {
String str = "Q uus tQvLdwtGSldhrtKQ=="
str = str.replace(" ", "+")
System.out.println(str)
aesDecrypt(str)
}
}
5,在密码验证的java页面做解密,建议打断点看看走的哪里,解密很简单,就一句
password = AESUtils.aesDecrypt(getPassword
*_*?我是谁原创
关注
0点赞·757人阅读
<%@ page contentType="text/htmlcharset=GBK"%>
<%@ page language="java" import="java.util.regex.*,
com.excellence.common.OAConstant,
com.excellence.common.UserInfo,
java.util.*,
java.text.SimpleDateFormat," %>
<html>
<head>
<title>XX系统</title>
<meta http-equiv="Content-Type" content="text/htmlcharset=gb2312">
<link rel="stylesheet" href="/common/styles/default/default.css" type="text/css">
</head>
<script language="javascript">
</script>
<script language="JavaScript" src="/oa/javascripts/crypto-js.js"></script>
<body bgcolor="#FFFFFF" text="#000000" leftmargin="0" topmargin="0">
<center>
</center>
</body>
<script type="text/vbscript">
Function str2asc(strstr)
str2asc = hex(asc(strstr))
End Function
Function asc2str(ascasc)
asc2str = chr(ascasc)
End Function
</script>
<script>
<%
UserInfo userInfo = (UserInfo) request.getSession().getAttribute("userInfo ")
String account=""
//获取用户账号
if(userInfo.getAccount()!=null&&!"".equals(userInfo.getAccount()))
account=userInfo.getAccount()
//有效期:格式:yyyy-MM-dd HH:mm:ss 有效期不能设置超过10分钟
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
Date now = new Date()
Date date = new Date(now .getTime() + 600000)
String time = df.format(date)
%>
//sessionid = base64(DES(用户账号&有效期))
//DES key:67HT4WrP
var sessionId = "<%=account%>" + "&" + "<%=time%>"
var mykey = "67HT4WrP"
// DES加密模式:CBC模式/ECB模式
// CBC模式加密
function encryptCBC(text, textKey) {
// 密钥转成16进制的字符串
var key = CryptoJS.enc.Utf8.parse(textKey)
// 加密过程
var encrypted = CryptoJS.DES.encrypt(text, key, {
// iv偏移量为key值
iv: key,
// 模式为CBC
mode: CryptoJS.mode.CBC,
// DES加密padding为Pkcs7
padding: CryptoJS.pad.Pkcs7
})
// 加密返回为字符串密文(加密经过一次base64加密,结果可看结果)
return encrypted.toString()
}
//对字符串中的特殊字符进行UrlEncode转码
function UrlEncode(str){
var ret=""
var strSpecial="!\"#$%&'()*+,/:<=>?[]^`{|}~%"
var tt= ""
for(var i=0i<str.lengthi++){
var chr = str.charAt(i)
var c=str2asc(chr)
tt += chr+":"+c+"n"
if(parseInt("0x"+c) >0x7f){
ret+="%"+c.slice(0,2)+"%"+c.slice(-2)
}else{
if(chr==" ")
ret+="+"
else if(strSpecial.indexOf(chr)!=-1)
ret+="%"+c.toString(16)
else
ret+=chr
}
}
return ret
}
//对sessionid进行加密
var desPass=encryptCBC(sessionId,mykey)
//对加密的sessionid中的特殊字符转码
var desPassEncode=UrlEncode(desPass)
//URL格式:http://xxxxxxxxxxxx?sessionid=&appid=5t7i9e260w6f41b71rt7fd07h9qo9800&redirectUrl=~/Portals/Views/Test/index.html
var url="http://xxxxxxxxxxxx?sessionid="+desPassEncode+"&appid=5t7i9e260w6f41b71rt7fd07h9qo9800&redirectUrl=~/Portals/Views/Test/index.html"
window.close()
window.open(url)
</script>
</html>
登录后复制
注意事项:
1、crypto-js.js使用到了这个js,要记得引入,很多地方可以下载的,除了这里面能用到des加密,也可以从网上找其他的des加密脚本,但是因为des加密模式的问题,要注意调用函数时参数的使用,确定自己要使用的是哪种des加密方法。
2、因为这里实现的是自动登录,涉及到了url的处理,由于使用了加密,密文中会含有特殊字符,直接通过url转跳,要把url中含有的特殊字符进行UrlEncode转码。
3、注意这里des的加密方式,这样进行转跳,跳进去的网站是.net实现的,因为des的加密模式有几种,java,.net等默认的des加密模式有可能不一致,就会导致加密后的密文不一样,所以要确定自己使用哪种模式,或者直接输出加密密文来进行比较。
4、使用js比较方便的地方是因为我这里用的jsp页面,所以对处理的数据可以任意写,而且不会影响后台的使用,我觉得这是js的好处,特别是进行像这种进行类似单点登录,自己系统用的java实现,而别人用的.net,直接用脚本,可以节省时间,不会对自己系统造成什么影响。
5、有一个地方要注意,这里对url进行转码时,使用到了VB脚本的一些函数,这种脚本已经很少有人会用了,而且有些浏览器已经不支持了,百度显示ie11不支持,但是我自己的电脑就是ie11,可以使用,所以这个也不是绝对的,有可能和使用到的函数有关。
6、除了des加密,还有md5,单独的base64加密,这些常用的加密方式,都可以直接用js脚本实现。
7、这里只有des的一种加密模式,还有其他的,crypto-js.js中都有,可以百度下其他加密方法的使用!