猫和路由器一体-c 委托

小程序微信认证
2023年4月3日发(作者:开机不自检)

微信⼩程序⽤户数据的签名验证和加解密

1有问题的加我QQ(1051521493)

⾸先是签名验证:

在⽹上搜索⼀个sha算法,放到⾃⼰的项⽬中,我的是放到⼀个这个解密⽅法类中了,后⾯会有说到。

//sha1签名认证

publicstaticStringgetSha1(Stringstr){

if(str==null||()==0){

returnnull;

}

charhexDigits[]={‘0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,

‘a’,’b’,’c’,’d’,’e’,’f’};

try{

MessageDigestmdTemp=tance(“SHA1”);

(es(“UTF-8”));

byte[]md=();

intj=;

charbuf[]=newchar[j*2];

intk=0;

for(inti=0;i

bytebyte0=md[i];

buf[k++]=hexDigits[byte0>>>4&0xf];

buf[k++]=hexDigits[byte0&0xf];

}

returnnewString(buf);

}catch(Exceptione){

//TODO:handleexception

returnnull;

}

}

验证签名:⾸先接收到signaturerawDatasession_key,调⽤这个上⾯的⽅法就⾏了signature1和signature⽐较,签名认证完成。

Stringsignature=ameter(“signature”);

StringrawData=ameter(“rawData”);

Stringsession_key=ameter(“session_key”);

Stringsha1=rawData+session_key;

Stringsignature1=1(sha1);

//进⾏签名认证

if((signature1)){

n("签名认证成功");

}

下⾯是解密:

调⽤⼀个类直接复制类名为AESUtil

需要注意的是:

CastleProvider;

放到项⽬中会报红:需要下载jar在lib加⼊了⼀个castle的jar,⽹上⾃⼰下放进去就⾏了。

CastleProvider;

dingException;

;

lBlockSizeException;

PaddingException;

meterSpec;

KeySpec;

ty.*;

/**

*

Title:AES解密类

*

Description:在lib加⼊了⼀个castle的jar

*@authorshaoyangzhang

*@data2017年3⽉15⽇

*/

publicclassAESUtil{

publicstaticfinalAESUtilinstance=newAESUtil();

publicstaticbooleaninitialized=false;

/**

*AES解密

*@paramcontent密⽂

*@return

*@throwsInvalidAlgorithmParameterException

*@throwsNoSuchProviderException

*/

publicbyte[]decrypt(byte[]content,byte[]keyByte,byte[]ivByte)throwsInvalidAlgorithmParameterException{

initialize();

try{

Ciphercipher=tance(“AES/CBC/PKCS7Padding”);

KeysKeySpec=newSecretKeySpec(keyByte,“AES”);

(T_MODE,sKeySpec,generateIV(ivByte));//初始化

byte[]result=l(content);

returnresult;

}catch(NoSuchAlgorithmExceptione){

tackTrace();

}catch(NoSuchPaddingExceptione){

tackTrace();

}catch(InvalidKeyExceptione){

tackTrace();

}catch(IllegalBlockSizeExceptione){

tackTrace();

}catch(BadPaddingExceptione){

tackTrace();

}catch(NoSuchProviderExceptione){

//TODOAuto-generatedcatchblock

tackTrace();

}catch(Exceptione){

//TODOAuto-generatedcatchblock

tackTrace();

}

returnnull;

}

publicstaticvoidinitialize(){

if(initialized)return;

vider(newBouncyCastleProvider());

initialized=true;

}

//⽣成iv

publicstaticAlgorithmParametersgenerateIV(byte[]iv)throwsException{

AlgorithmParametersparams=tance(“AES”);

(newIvParameterSpec(iv));

returnparams;

}

//sha1签名认证

publicstaticStringgetSha1(Stringstr){

if(str==null||()==0){

returnnull;

}

charhexDigits[]={‘0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,

‘a’,’b’,’c’,’d’,’e’,’f’};

try{

MessageDigestmdTemp=tance(“SHA1”);

(es(“UTF-8”));

byte[]md=();

intj=;

charbuf[]=newchar[j*2];

intk=0;

for(inti=0;i

bytebyte0=md[i];

buf[k++]=hexDigits[byte0>>>4&0xf];

buf[k++]=hexDigits[byte0&0xf];

}

returnnewString(buf);

}catch(Exceptione){

//TODO:handleexception

returnnull;

}

}

}

下⾯是对上⾯的类的调⽤:

需要说明的是session_key我们⽬前没有做缓存,我直接传到前台了,存到前台缓存了,等有了缓存redis再放到⾥⾯,直接拿出来,现

在是通过前台得到的。

publicvoiddecodeUserInfo(HttpServletRequestrequest){

StringencryptedData=ameter("encryptedData");

Stringiv=ameter("iv");

StringsessionId=ameter("rd_session");

Stringsignature=ameter("signature");

StringrawData=ameter("rawData");

Stringsession_key=ameter("session_key");

Stringsha1=rawData+session_key;

Stringsignature1=1(sha1);

//进⾏签名认证

if((signature1)){

n("签名认证成功");

}else{

return;

}

try{

byte[]resultByte=t(Base64(encryptedData),Base64(session_key),Base64(i

v));

if(null!=resultByte&&>0){

StringuserInfo=newString(resultByte,"UTF-8");

JSONObjectjson=ject(userInfo);//将字符串{“id”:1}

n(json);

}

}catch(InvalidAlgorithmParameterExceptione){

tackTrace();

}catch(UnsupportedEncodingExceptione){

tackTrace();

}

}

更多推荐

小程序微信认证