//生成P加密参数:package com.paic.pad.info.common.utils;import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.Key;
import java.util.Arrays;
import java.util.Date;
import java.util.Random;import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;public class Aes128CbcUtils {protected final static Log logger = LogFactory.getLog(Aes128CbcUtils.class);// 算法名称final static String KEY_ALGORITHM = "AES";// 加解密算法/模式/填充方式final static String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";// 字符集final static String CHARSET_NAME = "UTF-8";// 填充矢量final static byte[] iv = {0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x36, 0x30, 0x37, 0x30, 0x38};//final static byte[] iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};private static Key getKey(byte[] keyBytes) {// 如果密钥不足16位,那么就补足int base = 16;if ((keyBytes.length % base) != 0) {int groups = (keyBytes.length / base) + ((keyBytes.length % base) != 0 ? 1 : 0);byte[] temp = new byte[groups * base];Arrays.fill(temp, (byte) 0);System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);keyBytes = temp;}// 转化成JAVA的密钥格式return new SecretKeySpec(keyBytes, KEY_ALGORITHM);}/*** 加密方法* * @param content 要加密的字符串* @param key 加密密钥* @return */public static String encrypt(String content, String key) {try {byte[] enc = encrypt(content.getBytes(CHARSET_NAME), key.getBytes(CHARSET_NAME));String base64Str = Base64.encodeBase64String(enc);return new String(base64Str.getBytes(), CHARSET_NAME);}catch (UnsupportedEncodingException e) {logger.error(" 加密密钥异常 " , e);}return null;}/*** 加密方法* * @param content 要加密的字符串* @param keyBytes 加密密钥* @return*/public static byte[] encrypt(byte[] content, byte[] keyBytes) {byte[] encryptedText = null;try {Key key = getKey(keyBytes);Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));encryptedText = cipher.doFinal(content);}catch (Exception e) {logger.error(" 加密密钥异常 " , e);}return encryptedText;}/*** 解密方法* * @param encryptedData 要解密的字符串* @param keyBytes 解密密钥* @return*/public static String decrypt(String encryptedData, String key) {try {byte[] enc = encryptedData.getBytes(CHARSET_NAME);enc = Base64.decodeBase64(enc);byte[] dec = decrypt(enc, key.getBytes(CHARSET_NAME));return new String(dec, CHARSET_NAME);}catch (UnsupportedEncodingException e) {logger.error(" 解密密钥异常 " , e);}return null;}/*** 解密方法* * @param encryptedData 要解密的字符串* @param keyBytes 解密密钥* @return*/public static byte[] decrypt(byte[] encryptedData, byte[] keyBytes) {byte[] encryptedText = null;try {Key key = getKey(keyBytes);Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));encryptedText = cipher.doFinal(encryptedData);}catch (Exception e) {logger.error(" 解密密钥异常 " , e);}return encryptedText;}public static void main(String[] args) throws Exception {/*//加解密 密钥byte[] keybytes = "paic1234".getBytes();String content = "a=1&b=2&c=3";// 加密字符串System.out.println("加密前的:" + content);System.out.println("加密密钥:" + new String(keybytes));// 加密方法byte[] enc = Aes128CbcUtils.encrypt(content.getBytes(), keybytes);System.out.println("加密后的内容:" + new String(Hex.encode(enc)));// 解密方法byte[] dec = Aes128CbcUtils.decrypt(enc, keybytes);System.out.println("解密后的内容:" + new String(dec));*/// 加解密 密钥String key = "83519aa6d30ecdc3";// "paic1234";long timestamp = new Date().getTime();long nonce = new Random().nextInt(100000);String toSign = timestamp+""+nonce;System.out.println("signature:" + toSign);String signature = HmacSHA1Utils.getSignature(toSign, key);String content = "timestamp="+timestamp+"&nonce="+nonce+"&signature="+signature+"&umId=LIUKAIHUA001";// 加密字符串System.out.println("加密前的:" + content);System.out.println("加密密钥:" + key);// 加密方法String enc = Aes128CbcUtils.encrypt(content, key);System.out.println("加密后的内容:" + enc);//URL encodeenc = URLEncoder.encode(enc, CHARSET_NAME);System.out.println("URL encode:" + enc);//URL decodeString dec = URLDecoder.decode(enc, CHARSET_NAME);System.out.println("URL decode:" + dec);// 解密方法dec = Aes128CbcUtils.decrypt(dec, key);System.out.println("解密后的内容:" + dec);}
}

  

验证P参数:

           String p = request.getParameter("p");String reqUrl = request.getParameter("toUrl");String toUrl = reqUrl.replace(request.getContextPath(), "");HttpSession session = request.getSession();boolean hasSession = (session != null) && (session.getAttribute(SessionKeyConstant.SESSION_LOGIN_USER) != null);String dispatchUrl = "forward:" + toUrl;String key = PropertyUtils.getProperty("req.auth.key");//密钥String vaildTime =  PropertyUtils.getProperty("req.auth.requestVaildTime");//有效时间5000毫秒if(hasSession) {UserDTO user = (UserDTO) session.getAttribute(SessionKeyConstant.SESSION_LOGIN_USER);String currUmId = user.getUmId();//免登录请求if(StringUtils.isNotEmpty(p)) {try {//1. URL decode//p = URLDecoder.decode(p, "UTF-8");//2. 解密String nameValuePairs = Aes128CbcUtils.decrypt(p, key);//3. 请求验签 和 时效验证String timestamp = CommonUtils.getValueByKey(nameValuePairs, "timestamp");String nonce = CommonUtils.getValueByKey(nameValuePairs, "nonce");String toSign = timestamp+""+nonce;   String umId = CommonUtils.getValueByKey(nameValuePairs, "umId");String customerId = CommonUtils.getValueByKey(nameValuePairs, "customerId");String actualSign = HmacSHA1Utils.getSignature(toSign, key);String exceptedSign = CommonUtils.getValueByKey(nameValuePairs, "signature");boolean isSignatureVaild = StringUtils.equals(actualSign, exceptedSign);long requestVaildTime = Long.parseLong(vaildTime);long requestTimestamp = new Long(timestamp);long currTimestamp = new Date().getTime();boolean isRequestVaild = ((currTimestamp-requestTimestamp) < requestVaildTime);//验证session里用户的umId是否和传过来的umId一致。if(!StringUtils.equalsIgnoreCase(currUmId, umId)) {dispatchUrl = "redirect:/404.html";logger.info("有session用户umId不一致。p=" + p + "currUmId=" + currUmId + ",umId=" + umId);}else {                 //清除session里的customerIdif(StringUtils.isEmpty(customerId)){//SESSION_CONTACT_ID 对应的值是customerIdsession.removeAttribute(SessionKeyConstant.SESSION_CONTACT_ID);}//验证umId通过else {if(isSignatureVaild && isRequestVaild && StringUtils.isNotEmpty(umId)) {//SESSION_CONTACT_ID 对应的值是customerIdsession.setAttribute(SessionKeyConstant.SESSION_CONTACT_ID, customerId);}}}} catch (Exception e) {logger.warn("解密异常:" + p, e);dispatchUrl = "redirect:/404.html";}}session.setAttribute(SessionKeyConstant.SESSION_REQ_AUTH_SUCC, new Boolean(true));}

  

    /*** * 根据key取出解密后的参数值*  * @param context 解密后的内容* @param key 参数的key* @return*/public static String getValueByKey(String context, String key) {String result = "";if(StringUtils.isNotEmpty(context)){          String[] arr = context.split("&");for (int i = 0; i < arr.length; i++) {if(arr[i].indexOf("=") != -1) {String k = arr[i].substring(0, arr[i].indexOf("="));String value = arr[i].substring(arr[i].indexOf("=")+1, arr[i].length());if(key.equals(k)){result = value;break;}}}}return result;}

  

转载于:https://www.cnblogs.com/hailei/p/5443444.html

AES加密,加签验签相关推荐

  1. SpringBoot 系列教程(八十五):Spring Boot使用MD5加盐验签Api接口之前后端分离架构设计

    加密算法参考: 浅谈常见的七种加密算法及实现 加密算法参考: 加密算法(DES,AES,RSA,MD5,SHA1,Base64)比较和项目应用 目的: 通过对API接口请求报文签名,后端进行验签处理, ...

  2. RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密

    RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密 原文:RSACryptoServiceProvider加密解密签名验签和DES ...

  3. java rsa加密 加签_RSA加密解密与加签验签

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年7月首次在美国公布 ...

  4. 利用md5加密实现API接口的加签验签

    1.背景 我现在有几个公开的接口需要开放给第三方厂商,第三方厂商通过调用我的接口获取数据,由于这些接口放开了登录的拦截,而且是直接暴露在公网上的,因此想给这几个接口加上权限的验证,即加签验签. 2.技 ...

  5. java支付宝rsa2签名,使用支付宝SDK进行RSAj加签验签以及加密解密

    /** * 支付宝 sdk 加签验签测试 * * @author 码农猿 */ public class SignDemo { /** * 公钥 */ private static final Str ...

  6. 聊一聊关于加解密、加签验签的那些事

    面对MD5.SHA.DES.AES.RSA等等这些名词你是否有很多问号?这些名词都是什么?还有什么公钥加密.私钥解密.私钥加签.公钥验签.这些都什么鬼?或许在你日常工作没有听说过这些名词,但是一旦你要 ...

  7. 速看: 加解密、加签验签,你想要的都在这了

    点击蓝色"java大数据修炼之道"关注我哟加个"星标",每晚21:00,一起学技术 来源: jianshu.com/p/5e9fe1fff6a3 作者: 不学无 ...

  8. 前后端RSA互相加解密、加签验签、密钥对生成(Java)

    目录 一.序言 二.关于PKCS#1和PKCS#8格式密钥 1.简介 2.区别 二.关于JSEncrypt 三.关于jsrsasign 四.前端RSA加解密.加验签示例 1.相关依赖 2.crypto ...

  9. 安全对外的接口--加签验签

    前言 我们在求职面试中,经常会被问到,如何设计一个安全对外的接口呢? 其实可以回答这一点,加签和验签,这将让你的接口更加有安全.接下来,本文将和大家一起来学习加签和验签.从理论到实战,加油哦~ 密码学 ...

  10. 关于加解密、加签验签的那些事

    来源:r6d.cn/acJae 面对MD5.SHA.DES.AES.RSA等等这些名词你是否有很多问号?这些名词都是什么?还有什么公钥加密.私钥解密.私钥加签.公钥验签.这些都什么鬼?或许在你日常工作 ...

最新文章

  1. DeFi 史上最大盗窃案:一个漏洞盗走价值 6 亿美元资产?现已归还近一半
  2. 数据类型_插入数据_选取数据_修改数据——删除行
  3. 自己常用的Linux命令总结
  4. java for循环前面label_Java 实例
  5. python初学者经验总结_Python 初学者的经验总结
  6. PageAdmin建站系统模板制作教程1:Razor简介
  7. Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
  8. CREATE TABLE TEST_A AS SELECT * FROM TEST_B
  9. 【区块链】区块链技术指南
  10. 聊聊docker的使用心得
  11. Unity3D:TCPSocket模块
  12. PXC pxc_strict_mode
  13. Unity3D之太空大战一
  14. 【WPS自动签到】利用云函数实现WPS自动签到获得WPS免费会员
  15. linux:awk之RS、ORS与FS、OFS
  16. 【kali】kali2020.2安装 超级详细教程
  17. 设计师必备的导航网站
  18. LVM挂盘的详细操作
  19. codeforces 332B B. Maximum Absurdity(rmq)
  20. Cannot use JSX unless the ‘--jsx‘ flag is provided.

热门文章

  1. 分析:合格的UTM设备评判与选择
  2. Configured broker.id 2 doesn‘t match stored broker.id 3 in meta.properties
  3. navicat设置数据表的外键
  4. springboot连接SQL数据库配置application
  5. 自定义myeclipse中的servlet模板文件
  6. Coding and Paper Letter(三十九)
  7. 搭建Vue.js环境,建立一个简单的Vue项目
  8. Mac Apache WebDav 服务器配置
  9. mysql修改密码后phpmyadmin 出现#1045
  10. 笨办法学C 练习6:变量类型