前端页面显示了签名的密钥怎么办

JavaScript016

前端页面显示了签名的密钥怎么办,第1张

1,首先引入前端需要用到的js:crypto-js,下载命令npm install crypto-js

将 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中都有,可以百度下其他加密方法的使用!