Java 小程序开发中PKCS7填充解密数据方法的实现

小程序开发


浏览:1306 次

问题

最近,服务器需要将小程序的用户信息数据保存到数据库。getUserInfo小程序api返回的数据encryptedData将被解密

解密算法应为AES-128-CBC,数据应填充KCS7Padding。

在实际使用中,会抛出异常,解决方案需要使用BouncyCastle组件来实现。

解决过程

maven配置

<依赖关系>

org.bouncycastle

bcprov-jdk16

1.46

源代码

解密用户敏感数据以获取用户信息封装了一个方法,返回值是对象的用户信息

/**

*解密用户敏感数据以获取用户信息

*

*@作者免费砖

*@param encryptedData完整用户信息的加密数据,包括敏感数据

*@param sessionKey加密和签名数据的密钥

*@param iv加密算法的初始矢量

*@return JSONObject

*/

私有JSONObject getUserInfo(String encryptedData,String sessionKey,String iv){

//加密的数据

byte[]dataByte=Base64Utils.decodeFromString(加密数据);

//加密密钥

byte[]keyByte=Base64Utils.decodeFromString(sessionKey);

//偏移量

byte[]ivByte=Base64Utils.decodeFromString(iv);

尝试{

//如果密钥小于16位,则对其进行补充。If中的内容非常重要

整数基数=16;

如果(keyByte.length%base!=0){

int groups=keyByte。长度/基数+(keyByte.length%基数!=0?1:0);

byte[]temp=新字节[groups*base];

阵列。填充(温度,(字节)0);

系统arraycopy(keyByte,0,temp,0,keyByte.length);

keyByte=温度;

}

//初始化

安全addProvider(新BouncyCastleProvider);

Cipher-Cipher=Cipher.getInstance(“AES/CBC/PKCS7Padding”,“BC”);

SecretKeySpec规范=新的SecretKey规范(keyByte,“AES”);

AlgorithmParameters参数=AlgorithParameters.getInstance(“AES”);

参数。init(新的IvParameterSpec(ivByte));

cipher.init(cipher.DECRYPT_MODE,规范,参数);

byte[]resultByte=cipher.doFinal(数据字节);

如果(null!=resultByte&&resultByte.length>0){

字符串结果=新字符串(resultByte,“UTF-8”);

返回JSONUtil.parseObj(结果);

}

}catch(NoSuchAlgorithmException e){

log.error(e.getMessage(),e);

}catch(NoSuchPaddingException e){

log.error(e.getMessage(),e);

}catch(InvalidParameterSpecException e){

log.error(e.getMessage(),e);

}catch(IllegalBlockSizeException e){

log.error(e.getMessage(),e);

}catch(BadPaddingException e){

log.error(e.getMessage(),e);

}catch(不支持的EncodingException e){

log.error(e.getMessage(),e);

}catch(InvalidKeyException e){

log.error(e.getMessage(),e);

}catch(InvalidAlgorithmParameterException e){

log.error(e.getMessage(),e);

}catch(NoSuchProviderException e){

log.error(e.getMessage(),e);

}

返回null;

}