JS前端加密JAVA后端解密详解最近有⼀个加解密的需求,其实没有什么难度,但是实践过程中踩了很多坑,把踩坑过程分享出来。
1、前端JS加密
/**
* 加密(需要先加载aes.min.js⽂件)
* @param word
* @returns {*}
*/
function aesMinEncrypt(word){
var _word = Utf8.parse(word),
_key = Utf8.parse("ihaierForTodoKey"),
_iv = Utf8.parse("ihaierForTodo_Iv");
js argumentsvar encrypted = pt(_word, _key, {
iv: _iv,
mode: de.CBC,
padding: CryptoJS.pad.Pkcs7
});
String();
}
key:⼗六位作为密钥(前后端必须⼀致)
iv:⼗六位作为密钥偏移量(前后端必须⼀致)
算法:AES/CBC/PKCS7Padding
注意点:JAVA本⾝不⽀持PKCS7,只⽀持PKCS5,但是通过实验,两者即使不⼀样,也可以进⾏解密
2、后端JAVA解密
需要导⼊的jar包(版本没要求):
dec.jar
org.apachemons.lang.jar
package p.util;
pto.Cipher;
pto.spec.IvParameterSpec;
pto.spec.SecretKeySpec;
import dec.binary.Base64;
import org.apachemons.lang.StringUtils;
public class AesUtil {
/
/密钥 (需要前端和后端保持⼀致)⼗六位作为密钥
private static final String KEY = "ihaierForTodoKey";
//密钥偏移量 (需要前端和后端保持⼀致)⼗六位作为密钥偏移量
private static final String IV = "ihaierForTodo_Iv";
//算法
private static final String ALGORITHMSTR = "AES/CBC/PKCS5Padding";
//SSO的TOKEN
private static final String token = "4AaWABnPB5/1Z2EIEXwSfigudpiM4kzLkmIrKQPmS9w=";
/**
* base 64 decode
* @param base64Code 待解码的base 64 code
* @return解码后的byte[]
* @throws Exception
*/
*/
public static byte[] base64Decode(String base64Code) throws Exception{
/**sun.misc.BASE64Decoder是java内部类,有时候会报错,
* ⽤dec.binary.Base64替代,效果⼀样。
*/
//Base64 base64 = new Base64();
//byte[] bytes = base64.decodeBase64(new String(base64Code).getBytes());
//new BASE64Decoder().decodeBuffer(base64Code);
return StringUtils.isEmpty(base64Code) ? null : new Base64().decodeBase64(new String(base64Code).getBytes());
}
/**
* AES解密
* @param encryptBytes 待解密的byte[]
* @return解密后的String
* @throws Exception
*/
public static String aesDecryptByBytes(byte[] encryptBytes) throws Exception {
Cipher cipher = Instance(ALGORITHMSTR);
byte[] temp = IV.getBytes("UTF-8");
IvParameterSpec iv = new IvParameterSpec(temp);
cipher.init(Cipher.DECRYPT_MODE, new Bytes(), "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 {
aesDecrypt(token);
}
}
密钥和密钥便宜量必须和前端⼀致
算法可以采⽤PKCS5(JAVA本⾝不⽀持PKCS7),如果想使⽤PKCS7,需要额外引⼊jar包。
附录:aes.min.js压缩⽂件
!
function(t,n){"object"==typeof ports=exports=n():"function"==typeof define&&define.amd?define([],n):t.CryptoJS=n()}(this,function() {var t=t||function(t,n){var ate||function(){function t(){}return function(n){var i;return t.prototype=n,i=new t,t.prototype=null,i}}(),e={},r=e.lib= {},o=r.Base=function(){return{extend:function(t){var n=i(this);return t&&n.mixIn(t),n.hasOwnProperty("init")&&this.init!==n.init||(n.init=function()
{n.$super.init.apply(this,arguments)}),n.init.prototype=n,n.$super=this,n},create:function(){var d();return
t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var n in t)t.hasOwnProperty(n)&&(this[n]=t[n]);t.hasOwnProperty("toString")&&
(String)},clone:function(){return this.d(this)}}}(),s=r.d({init:function(t,i){t=this.words=t||
[],i!=n?this.sigBytes=i:this.sigBytes=4*t.length},toString:function(t){return(t||c).stringify(this)},concat:function(t){var
n=this.words,i=t.words,e=this.sigBytes,r=t.sigBytes;if(this.clamp(),e%4)for(var o=0;o<r;o++){var s=i[o>>>2]>>>24-o%4*8&255;n[e+o>>>2]|=s<<24-
(e+o)%4*8}else for(var o=0;o<r;o+=4)n[e+o>>>2]=i[o>>>2];return this.sigBytes+=r,this},clamp:function(){var
n=this.words,i=this.sigBytes;n[i>>>2]&=4294967295<<32-i%4*8,n.il(i/4)},clone:function(){var t=o.clone.call(this);return
t.words=this.words.slice(0),t},random:function(n){for(var i,e=[],r=function(n){var n=n,i=987654321,e=4294967295;return function(){i=36969*(65535&i)+ (i>>16)&e,n=18e3*(65535&n)+(n>>16)&e;var r=(i<<16)+n&e;return r/=4294967296,r+=.5,r*(t.random()>.5?1:-1)}},o=0;o<n;o+=4){var a=r(4294967296* (i||t.random()));i=987654071*a(),e.push(4294967296*a()|0)}return new s.init(e,n)}}),={},c=a.Hex={stringify:function(t){for(var
n=t.words,i=t.sigBytes,e=[],r=0;r<i;r++){var o=n[r>>>2]>>>24-r%4*8&255;e.push((o>>>4).toString(16)),e.push((15&o).toString(16))}return
n=t.words,i=t.sigBytes,e=[],r=0;r<i;r++){var o=n[r>>>2]>>>24-r%4*8&255;e.push((o>>>4).toString(16)),e.push((15&o).toString(16))}return
e.join("")},parse:function(t){for(var n=t.length,i=[],e=0;e<n;e+=2)i[e>>>3]|=parseInt(t.substr(e,2),16)<<24-e%8*4;return new s.init(i,n/2)}},u=a.Latin1= {stringify:function(t){for(var n=t.words,i=t.sigBytes,e=[],r=0;r<i;r++){var o=n[r>>>2]>>>24-r%4*8&255;e.push(String.fromCharCode(o))}return
e.join("")},parse:function(t){for(var n=t.length,i=[],e=0;e<n;e++)i[e>>>2]|=(255&t.charCodeAt(e))<<24-e%4*8;return new s.init(i,n)}},f=a.Utf8= {stringify:function(t){try{return decodeURIComponent(escape(u.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return u.parse(unescape(encodeURIComponent(t)))}},h=r.d({reset:function(){this._data=new
s.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=f.parse(t)),this._at(t),this._nDataBytes+=t.sigBytes},_process:function(n) {var i=this._data,e=i.words,r=i.sigBytes,o=this.blockSize,a=4*o,c=r/a;c=il(c):t.max((0|c)-this._minBufferSize,0);var u=c*o,f=t.min(4*u,r);if(u){for(var h=0;h<u;h+=o)this._doProcessBlock(e,h);var p=e.splice(0,u);i.sigBytes-=f}return new s.init(p,f)},clone:function(){var t=o.clone.call(this);return
t._data=this._data.clone(),t},_minBufferSize:0}),p=(r.d({d(),init:function(t)
{this.cfg=d(t),set()},reset:function(){h.reset.call(this),this._doReset()},update:function(t){return
this._append(t),this._process(),this},finalize:function(t){t&&this._append(t);var n=this._doFinalize();return n},blockSize:16,_createHelper:function(t) {return function(n,i){return new t.init(i).finalize(n)}},_createHmacHelper:function(t){return function(n,i){return new p.HMAC.init(t,i).finalize(n)}}}),e.algo= {});return e}(Math);return t});
//# sourceMappingURL=core.min.js.map
!function(e,t,i){"object"==typeof ports=exports=t(require("./core.min"),require("./sha1.min"),require("./hmac.min")):"function"==typeof define&&define.amd?define(["./core.min","./sha1.min","./hmac.min"],t):t(e.CryptoJS)}(this,function(e){return function(){var
t=e,i=t.lib,r=i.Base,n=i.WordArray,o=t.algo,a=o.MD5,c=o.d({d({keySize:4,hasher:a,iterations:1}),init:function(e)
{this.cfg=d(e)},compute:function(e,t){for(var i=this.cfg,r=ate(),ate(),a
=o.words,c=i.keySize,f=i.iterations;a.length<c;)
{s&&r.update(s);var s=r.update(e).finalize(t);r.reset();for(var u=1;u<f;u++)s=r.finalize(s),r.reset();o.concat(s)}return
o.sigBytes=4*c,o}});t.EvpKDF=function(e,t,i){ate(i)pute(e,t)}}(),e.EvpKDF});
//# sourceMappingURL=evpkdf.min.js.map
!function(r,e){"object"==typeof ports=exports=e(require("./core.min")):"function"==typeof define&&define.amd?
define(["./core.min"],e):e(r.CryptoJS)}(this,function(r){return function(){function e(r,e,t){for(var n=[],i=0,o=0;o<e;o++)if(o%4){var f=t[r.charCodeAt(o-1)]
<<o%4*2,c=t[r.charCodeAt(o)]>>>6-o%4*2;n[i>>>2]|=(f|c)<<24-i%4*8,i++}ate(n,i)}var t=r,n=t.lib,a=n.WordArray,;i.Base64= {stringify:function(r){var e=r.words,t=r.sigBytes,n=this._map;r.clamp();for(var a=[],i=0;i<t;i+=3)for(var o=e[i>>>2]>>>24-i%4*8&255,f=e[i+1>>>2]>>>24-(i+1)%4*8&255,c=e[i+2>>>2]>>>24-(i+2)%4*8&255,s=o<<16|f<<8|c,h=0;h<4&&i+.75*h<t;h++)a.push(n.charAt(s>>>6*(3-h)&63));var
p=n.charAt(64);if(p)for(;a.length%4;)a.push(p);return a.join("")},parse:function(r){var t=r.length,n=this._map,a=this._reverseMap;if(!a)
{a=this._reverseMap=[];for(var i=0;i<n.length;i++)a[n.charCodeAt(i)]=i}var o=n.charAt(64);if(o){var f=r.indexOf(o);f!==-1&&(t=f)}return
e(r,t,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),r.enc.Base64});
//# sourceMappingURL=enc-base64.min.js.map
!function(e,t,r){"object"==typeof ports=exports=t(require("./core.min"),require("./evpkdf.min")):"function"==typeof define&&define.amd? define(["./core.min","./evpkdf.min"],t):t(e.CryptoJS)}(this,function(e){e.lib.Cipher||function(t){var
r=e,i=r.lib,n=i.Base,c=i.WordArray,o=i.BufferedBlockAlgorithm,,a=
(s.Utf8,s.Base64),f=r.algo,p=f.EvpKDF,d=i.d({d(),createEncryptor:function(e,t){return
{this.cfg=d(r),this._xformMode=e,this._key=set()},reset:function(){o.reset.call(this),this._doReset()},process:function(e){return this._append(e),this._process()},finalize:function(e){e&&this._append(e);var t=this._doFinalize();return
t},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function e(e){return"string"==typeof e?B:x}return function(t){return{encrypt:function(r,i,n){return e(i).encrypt(t,r,i,n)},decrypt:function(r,i,n){return e(i).decrypt(t,r,i,n)}}}}()}),h=
(i.d({_doFinalize:function(){var e=this._process(!0);return e},blockSize:1}),r.mode=
{}),u=i.d({createEncryptor:function(e,t){return ate(e,t)},createDecryptor:function(e,t){return
ate(e,t)},init:function(e,t){this._cipher=e,this._iv=t}}),l=h.CBC=function(){function e(e,r,i){var n=this._iv;if(n){var c=n;this._iv=t}else var
c=this._prevBlock;for(var o=0;o<i;o++)e[r+o]^=c[o]}var d();return r.d({processBlock:function(t,r){var
i=this._cipher,n=i.blockSize;e.call(this,t,r,n),i.encryptBlock(t,r),this._prevBlock=t.slice(r,r+n)}}),r.d({processBlock:function(t,r){var
i=this._cipher,n=i.blockSize,c=t.slice(r,r+n);i.decryptBlock(t,r),e.call(this,t,r,n),this._prevBlock=c}}),r}(),_=r.pad={},v=_.Pkcs7={pad:function(e,t){for(var
r=4*t,i=r-e.sigBytes%r,n=i<<24|i<<16|i<<8|i,o=[],s=0;s<i;s+=4)o.push(n);var ate(o,i);e.concat(a)},unpad:function(e){var t=255&e.words[e.sigBytes-1>>>2];e.sigBytes-=t}},y=(i.d({cfg:d({mode:l,padding:v}),reset:function(){d.reset.call(this);var
e=this.cfg,t=e.iv,de;if(this._xformMode==this._ENC_XFORM_MODE)var ateEncryptor;else{var
ateDecryptor;this._minBufferSize=1}this._mode&&this._mode.__creator==i?this._mode.init(this,t&&t.words):
(this._mode=i.call(r,this,t&&t.words),this._mode.__creator=i)},_doProcessBlock:function(e,t){this._mode.processBlock(e,t)},_doFinalize:function(){var
e=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){e.pad(this._data,this.blockSize);var t=this._process(!0)}else{var
t=this._process(!0);e.unpad(t)}return t},blockSize:4}),i.d({init:function(e){this.mixIn(e)},toString:function(e)
{return(e||this.formatter).stringify(this)}})),m=r.format={},k=m.OpenSSL={stringify:function(e){var t=e.ciphertext,r=e.salt;if(r)var
ate([1398893684,1701076831]).concat(r).concat(t);else var i=t;String(a)},parse:function(e){var
t=a.parse(e),r=t.words;if(1398893684==r[0]&&1701076831==r[1]){var ate(r.slice(2,4));r.splice(0,4),t.sigBytes-=16}return
ateEncryptor(r,i),c=n.finalize(t),o=n.cfg;return
{i=d(i),t=this._parse(t,i.format);var ateDecryptor(r,i).finalize(t.ciphertext);return n},_parse:function(e,t){return"string"==typeof e?
t.parse(e,this):e}}),g=r.kdf={},S=g.OpenSSL={execute:function(e,t,r,i){i||(i=c.random(8));var
ate({keySize:t+r})pute(e,i),ate(n.words.slice(t),4*r);return
n.sigBytes=4*ate({key:n,iv:o,salt:i})}},B=i.d({cfg:d({kdf:S}),encrypt:function(e,t,r,i){i=d(i);var n=ute(r,e.keySize,e.ivSize);i.iv=n.iv;var pt.call(this,e,t,n.key,i);return c.mixIn(n),c},decrypt:function(e,t,r,i)
{i=d(i),t=this._parse(t,i.format);var n=ute(r,e.keySize,e.ivSize,t.salt);i.iv=n.iv;var c=x.decrypt.call(this,e,t,n.key,i);return c}})}()});
//# sourceMappingURL=cipher-core.min.js.map
//# sourceMappingURL=cipher-core.min.js.map
!function(e,i){"object"==typeof ports=exports=i(require("./core.min")):"function"==typeof define&&define.amd?
define(["./core.min"],i):i(e.CryptoJS)}(this,function(e){!function(){var i=e,t=i.lib,n=t.Base,,r=s.Utf8,o=i.algo;o.d({init:function(e,i)
{e=this._hasher=new e.init,"string"==typeof i&&(i=r.parse(i));var t=e.blockSize,n=4*t;i.sigBytes>n&&(i=e.finalize(i)),i.clamp();for(var
s=this._oKey=i.clone(),o=this._iKey=i.clone(),a=s.words,f=o.words,c=0;c<t;c++)a[c]^=1549556828,f[c]^=909522486;s.sigBytes=o.sigBytes=set()}, reset:function(){var e=this._set(),e.update(this._iKey)},update:function(e){return this._hasher.update(e),this},finalize:function(e){var
i=this._hasher,t=i.finalize(e);i.reset();var n=i.finalize(this._oKey.clone().concat(t));return n}})}()});
//# sourceMappingURL=hmac.min.js.map
!function(e,o,r){"object"==typeof ports=exports=o(require("./core.min"),require("./cipher-core.min")):"function"==typeof
define&&define.amd?define(["./core.min","./cipher-core.min"],o):o(e.CryptoJS)}(this,function(e){de.ECB=function(){var
o=e.d();return o.d({processBlock:function(e,o)
{this._ptBlock(e,o)}}),o.d({processBlock:function(e,o){this._cipher.decryptBlock(e,o)}}),o}(),e.mode.ECB});
//# sourceMappingURL=mode-ecb.min.js.map
!function(e,r,i){"object"==typeof ports=exports=r(require("./core.min"),require("./cipher-core.min")):"function"==typeof
define&&define.amd?define(["./core.min","./cipher-core.min"],r):r(e.CryptoJS)}(this,function(e){return e.pad.Pkcs7});
//# sourceMappingURL=pad-pkcs7.min.js.map
!function(e,r,i){"object"==typeof ports=exports=r(require("./core.min"),require("./enc-
base64.min"),require("./md5.min"),require("./evpkdf.min"),require("./cipher-core.min")):"function"==typeof define&&define.amd?
define(["./core.min","./enc-base64.min","./md5.min","./evpkdf.min","./cipher-core.min"],r):r(e.CryptoJS)}(this,function(e){return function(){var
r=e,i=r.lib,n=i.BlockCipher,o=r.algo,t=[],c=[],s=[],f=[],a=[],d=[],u=[],v=[],h=[],y=[];!function(){for(var e=[],r=0;r<256;r++)r<128?
e[r]=r<<1:e[r]=r<<1^283;for(var i=0,n=0,r=0;r<256;r++){var o=n^n<<1^n<<2^n<<3^n<<4;o=o>>>8^255&o^99,t[i]=o,c[o]=i;var
p=e[i],l=e[p],_=e[l],k=257*e[o]^16843008*o;s[i]=k<<24|k>>>8,f[i]=k<<16|k>>>16,a[i]=k<<8|k>>>24,d[i]=k;var
k=16843009*_^65537*l^257*p^16843008*i;u[o]=k<<24|k>>>8,v[o]=k<<16|k>>>16,h[o]=k<<8|k>>>24,y[o]=k,i?(i=p^e[e[e[_^p]]],n^=e[e[n]]):i=n=1}}();var
p=[0,1,2,4,8,16,32,64,128,27,54],l=o.d({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var
e=this._keyPriorReset=this._key,r=e.words,i=e.sigBytes/4,n=this._nRounds=i+6,o=4*(n+1),c=this._keySchedule=[],s=0;s<o;s++)if(s<i)c[s]=r[s];else{var f=c[s-1];s%i?i>6&&s%i==4&&(f=t[f>>>24]<<24|t[f>>>16&255]<<16|t[f>>>8&255]<<8|t[255&f]):(f=f<<8|f>>>24,f=t[f>>>24]<<24|t[f>>>16&255]
<<16|t[f>>>8&255]<<8|t[255&f],f^=p[s/i|0]<<24),c[s]=c[s-i]^f}for(var a=this._invKeySchedule=[],d=0;d<o;d++){var s=o-d;if(d%4)var f=c[s];else var f=c[s-4];d<4||s<=4?a[d]=f:a[d]=u[t[f>>>24]]^v[t[f>>>16&255]]^h[t[f>>>8&255]]^y[t[255&f]]}}},encryptBlock:function(e,r)
{this._doCryptBlock(e,r,this._keySchedule,s,f,a,d,t)},decryptBlock:function(e,r){var
i=e[r+1];e[r+1]=e[r+3],e[r+3]=i,this._doCryptBlock(e,r,this._invKeySchedule,u,v,h,y,c);var
i=e[r+1];e[r+1]=e[r+3],e[r+3]=i},_doCryptBlock:function(e,r,i,n,o,t,c,s){for(var
f=this._nRounds,a=e[r]^i[0],d=e[r+1]^i[1],u=e[r+2]^i[2],v=e[r+3]^i[3],h=4,y=1;y<f;y++){var
p=n[a>>>24]^o[d>>>16&255]^t[u>>>8&255]^c[255&v]^i[h++],l=n[d>>>24]^o[u>>>16&255]^t[v>>>8&255]^c[255&a]^i[h++],_=n[u>>>24]^o[v>>>16&255]^t[ a>>>8&255]^c[255&d]^i[h++],k=n[v>>>24]^o[a>>>16&255]^t[d>>>8&255]^c[255&u]^i[h++];a=p,d=l,u=_,v=k}var p=(s[a>>>24]<<24|s[d>>>16&255]
<<16|s[u>>>8&255]<<8|s[255&v])^i[h++],l=(s[d>>>24]<<24|s[u>>>16&255]<<16|s[v>>>8&255]<<8|s[255&a])^i[h++],_=(s[u>>>24]<<24|s[v>>>16&255]
<<16|s[a>>>8&255]<<8|s[255&d])^i[h++],k=(s[v>>>24]<<24|s[a>>>16&255]<<16|s[d>>>8&255]
<<8|s[255&u])^i[h++];e[r]=p,e[r+1]=l,e[r+2]=_,e[r+3]=k},keySize:8});r.AES=n._createHelper(l)}(),e.AES});
//# sourceMappingURL=aes.min.js.map
!function(e,n){"object"==typeof ports=exports=n(require("./core.min")):"function"==typeof define&&define.amd?
define(["./core.min"],n):n(e.CryptoJS)}(this,function(e){Utf8});
//# sourceMappingURL=enc-utf8.min.js.map

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。