java mysql 通用aes加密算法

 

通用的aes加密,使用场景,插入数据时,使用java进行加密数据,查询时,通过sql进行解密,不用取出再遍历解密

(更正:to_base64只适用mysql5.6之后的,之前的没有这个函数,不适用,可以使用HEX,UNHEX ,当然java要用对应的方法解密)

如下:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
 
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
 
/**
 * java使用AES加密解密 AES-128-ECB加密
 * 与mysql数据库aes加密算法通用
 * 数据库aes加密解密
 * -- 加密
 *    SELECT to_base64(AES_ENCRYPT('www.gowhere.so','jkl;POIU1234++=='));
 *    -- 解密
 *    SELECT AES_DECRYPT(from_base64('Oa1NPBSarXrPH8wqSRhh3g=='),'jkl;POIU1234++==');
 * @author 836508
 *
 */
public class MyAESUtil {
 
    // 加密
    public static String Encrypt(String sSrc, String sKey) throws Exception {
        if (sKey == null) {
            System.out.print("Key为空null");
            return null;
        }
        // 判断Key是否为16位
        if (sKey.length() != 16) {
            System.out.print("Key长度不是16位");
            return null;
        }
        byte[] raw = sKey.getBytes("utf-8");
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
        return new BASE64Encoder().encode(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。
    }
 
    // 解密
    public static String Decrypt(String sSrc, String sKey) throws Exception {
        try {
            // 判断Key是否正确
            if (sKey == null) {
                System.out.print("Key为空null");
                return null;
            }
            // 判断Key是否为16位
            if (sKey.length() != 16) {
                System.out.print("Key长度不是16位");
                return null;
            }
            byte[] raw = sKey.getBytes("utf-8");
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec);
            byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);//先用base64解密
            try {
                byte[] original = cipher.doFinal(encrypted1);
                String originalString = new String(original,"utf-8");
                return originalString;
            } catch (Exception e) {
                System.out.println(e.toString());
                return null;
            }
        } catch (Exception ex) {
            System.out.println(ex.toString());
            return null;
        }
    }
 
    public static void main(String[] args) throws Exception {
        /*
         * 此处使用AES-128-ECB加密模式,key需要为16位。
         */
        String cKey = "jkl;POIU1234++==";
        // 需要加密的字串
        String cSrc = "www.gowhere.so";
        System.out.println(cSrc);
        // 加密
        String enString = MyAESUtil.Encrypt(cSrc, cKey);
        System.out.println("加密后的字串是:" + enString);
 
        // 解密
        String DeString = MyAESUtil.Decrypt(enString, cKey);
        System.out.println("解密后的字串是:" + DeString);
    }
}


原文链接:https://blog.csdn.net/wddpwzzhao123/article/details/84831639

<think>嗯,用户想了解如何通过Java小程序实现与美团和抖音平台的核销券对接。我需要先整理现有的引用资料,看看里面有什么有用的信息。首先,引用1提到美团开放平台升级接口费用高昂,需要二级等保和安全产品,这对大部分开发者来说是个障碍。他们可能找到了低成本解决方案,但具体方法没有详细说明。引用2是关于Java抖音核销的代码案例,指出需要自行记录核销状态,而美团在第二次调用时会提示不能使用。引用3则展示了美团验券功能的Voucher类设计。 用户的需求集中在对接API的实现方案,可能需要分步骤的指导。首先,应该区分美团和抖音的不同要求。美团可能需要处理高安全要求,比如二级等保,这可能涉及到HTTPS、数据加密等措施。而抖音方面需要注意核销状态的自行管理,避免重复核销。需要结合引用中的代码示例,比如如何设计Voucher类,以及核销接口的调用方法。 接下来,我需要考虑如何整合这些信息,给出一个结构清晰的回答。可能需要分模块讲解,比如准备工作、美团对接、抖音对接、代码示例、注意事项等。同时,用户是小程序,可能需要提到如何在小程序中嵌入Java后端服务,处理核销逻辑,并保证安全性。 另外,用户可能关心如何低成本实现,尤其是针对美团的解决方案,因为引用1提到高昂费用的问题。可能需要建议使用第三方服务或中间件来降低成本和复杂度,同时确保符合安全要求。抖音方面则强调状态管理,代码中需要自行记录核销状态,防止重复调用。 还要注意引用中的代码示例,比如引用3中的Voucher类,可以作为核销券的数据结构参考。同时,引用2的抖音核销代码需要处理HTTP请求,可能需要使用OkHttp或类似的库,并在响应后更新核销状态。 最后,要确保回答符合系统级指令,使用正确的中文和LaTeX格式,生成相关问题,并在引用处添加标识。需要检查是否有遗漏的关键点,比如安全措施、状态管理、错误处理等,确保用户能全面了解实现方案。</think>### Java小程序实现美团/抖音核销券对接方案 #### 一、实现架构 1. 小程序前端:负责展示券码和触发核销动作 2. Java后端服务: - 实现$OAuth2.0$认证流程 - 封装美团/抖音开放平台接口 - 处理核销状态同步 3. 数据库:记录核销流水和状态(需满足$ACID$特性) #### 二、美团核销实现 1. 准备工作: - 申请企业资质(需二级等保认证) - 购买美团指定安全产品(如数字证书) - 开通开放平台`poi.prepare`权限[^1] 2. 核心代码示例: ```java // 美团核验服务类 public class MeituanVerificationService { private static final String API_URL = "https://openapi.meituan.com/verification"; public boolean verifyCoupon(String couponCode) { try { // 构造带签名的请求头 Map<String, String> headers = buildSignedHeaders(); // 发送核销请求 HttpResponse response = HttpRequest.post(API_URL) .addHeaders(headers) .body(buildRequestBody(couponCode)) .execute(); // 解析美团返回状态码 return parseResponse(response.body()); } catch (Exception e) { // 异常处理及重试机制 logger.error("美团核销异常", e); return false; } } private Map<String, String> buildSignedHeaders() { // 实现美团要求的签名算法 // 包含时间戳、随机字符串、SHA256签名等 } } ``` #### 三、抖音核销实现 1. 特殊要求: - 需自行维护核销状态(建议使用Redis分布式锁) - 支持幂等性处理(需实现$CAS$机制) 2. 状态管理方案: ```java // 抖音核销状态管理 public class DouyinCouponManager { @Autowired private RedisTemplate<String, String> redisTemplate; public boolean markAsUsed(String couponCode) { // 使用Redis的SETNX实现原子操作 Boolean result = redisTemplate.opsForValue() .setIfAbsent("coupon:" + couponCode, "USED", Duration.ofMinutes(30)); return Boolean.TRUE.equals(result); } } ``` #### 四、通用注意事项 1. 安全要求: - 必须启用$HTTPS$传输 - 敏感数据需使用$AES-256-GCM$加密 - 建议实现请求签名验证(如$HMAC-SHA256$) 2. 性能优化: - 使用连接池管理HTTP连接 - 对高频接口实施限流(令牌桶算法) - 异步记录核销日志 #### 五、成本控制方案 1. 使用云函数处理核销回调 2. 采用轻量级$MySQL$集群+读写分离 3. 利用CDN缓存静态资源 4. 通过网关服务统一管理接口(参考美团中间件方案)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值