* @param 加密过的凭据字符串。
* @return 凭据对象。
* @throws Exception
*/
private EncryCredentialInfo parseEncryCredential(String credential) throws InvalidEncryCredentialException{
EncryCredentialInfo encryCredentialInfo = new EncryCredentialInfo();
try{
//先使用URL解码,再用BASE64进行解码。
credential = URLDecoder.decode(credential, "UTF-8");
credential = new String(Base64Coder.decryptBASE64(credential));
//问号分割字符串。
String[] items = credential.split("\\?");
//如果长度是2.
if(items.length==2){
//第2个字符串不为空,先解析第二个字符串。
if(items[1]!=null && items[1].length()>0){
//使用&分割字符。
String[] params = items[1].split("&");
for(int i=0; i<params.length; i++){
if(params[i]!=null){
//使用等号分割。
String[] values = params[i].split("=");
if(values!=null && values.length==2){
if("appId".equals(values[0])){
encryCredentialInfo.setAppId(values[1]);
}
else if("keyId".equals(values[0])){
encryCredentialInfo.setKeyId(values[1]);
}
}
}
}
}
else{
throw new InvalidEncryCredentialException();
}
//第1个字符串不为空
if(!StringUtils.isEmpty(items[0])){
//使用base64解码为源字符串。
byte[] data = Base64Coder.decryptBASE64(items[0]);
//查询键值。
Ki4soKey ki4soKey = keyService.findKeyByKeyId(encryCredentialInfo.getKeyId());
if(ki4soKey!=null){
//使用密钥进行解密。
byte[] origin = DESCoder.decrypt(data, ki4soKey.toSecurityKey());
//将byte数组转换为字符串。
String json = new String(origin);
@SuppressWarnings("rawtypes")
Map map = (Map)JSON.parse(json);
if(map!=null){
Object userId = map.get("userId");
Object createTime = map.get("createTime");
Object expiredTime = map.get("expiredTime");
encryCredentialInfo.setUserId(userId==null?null:userId.toString());
encryCredentialInfo.setCreateTime(createTime==null?null:new Date((Long.parseLong(createTime.toString()))));
encryCredentialInfo.setExpiredTime(expiredTime==null?null:new Date((Long.parseLong(expiredTime.toString()))));
}
}
}
else{
throw new InvalidEncryCredentialException();