之前提到、会采用openresty作为网关进行加解密。在实践的过程中、第一步就要调整代码了。我们之前Java采用的是AES/CBC/PKCS5Padding的填充方式,而openresty的aes.lua里面采用的是openssl的、默认的填充方式是AES/CBC/PKCS7Padding的。而Java本身的加密包是不支持这种填充方式的。需要引入新的加密包bcprov-jdk18on(1.71这个版本对应jdk1.8),这个包能支持AES/CBC/PKCS7Padding的填充模式。

AesBouncycastleUtil

import java.security.Security;
import java.security.spec.AlgorithmParameterSpec;import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;/*** bouncycastle包AES加密*/
@Slf4j
public class AesBouncycastleUtil {private static final String CHARSET_NAME = "UTF-8";private static final String AES_NAME = "AES";// 加密模式public static final String AES_ALGORITHM = "AES/CBC/PKCS7Padding";static {// 指定使用bouncycastle包来加密Security.addProvider(new BouncyCastleProvider());}/*** 加密* @param text* @param key* @param iv* @return*/public String encrypt(String text,String key,String iv) {byte[] result = null;try {Cipher cipher = Cipher.getInstance(AES_ALGORITHM);SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(CHARSET_NAME), AES_NAME);AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv.getBytes());cipher.init(Cipher.ENCRYPT_MODE, keySpec, paramSpec);result = cipher.doFinal(text.getBytes(CHARSET_NAME));} catch (Exception e) {log.error("AESP7 加密错误:{}",e.toString());}return Base64.encodeBase64String(result);}/*** 解密* @param pass   密文* @param key    密钥* @param iv     向量* @return*/public String decrypt(String pass,String key,String iv) {try {Cipher cipher = Cipher.getInstance(AES_ALGORITHM);SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(CHARSET_NAME), AES_NAME);AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv.getBytes());cipher.init(Cipher.DECRYPT_MODE, keySpec, paramSpec);return new String(cipher.doFinal(Base64.decodeBase64(pass)), CHARSET_NAME);} catch (Exception e) {log.error("AESP7 解密错误:{}",e.toString());}return null;}public static void main(String[] args) {// 密钥String key = "16位字符串";// 向量String iv = "16位字符串";AesBouncycastleUtil aes = new AesBouncycastleUtil();String contents = "12d57406-28aa-41f5-818d-6521e44949bd@e086a63d-196c-4b3e-9aa4-768f7d51cf52";String encrypt = aes.encrypt(contents,key,iv);System.out.println("加密后:" + encrypt);String decrypt = aes.decrypt(encrypt,key,iv);System.out.println("解密后:" + decrypt);}
}

加密后:PGpgSf1e6ZfD8tzTnHUr4WO8JCNi6GeZE+WP9FfA/rdZRAeFp1Kan8FOVrf0D9FHLIQpMGfKY075EEichxlytedD4Y2zVE7xRJQL0ejnxj4=
解密后:12d57406-28aa-41f5-818d-6521e44949bd@e086a63d-196c-4b3e-9aa4-768f7d51cf52

上面的key跟iv都是随机生成的、只要是16位就好、还可以加上一些特殊字符。内容的话就是两个uuid。接下来我们将会在openresty中对上面的加密字符串进行解密。

nginx配置

server {listen 6378;location /redis {default_type text/html;content_by_lua_file lua/aesUtil.lua;}}

lua解密脚本

local headers = ngx.req.get_headers()
local key = "16位字符串"
local iv = "16位字符串"
local aes = require "resty.aes"
local str = require "resty.string"
local aes_128_cbc_with_iv = assert(aes:new(key,nil, aes.cipher(128,"cbc"), {iv=iv}))
-- AES 128 CBC with IV and no SALT
local encrypted = aes_128_cbc_with_iv:encrypt("12d57406-28aa-41f5-818d-6521e44949bd@e086a63d-196c-4b3e-9aa4-768f7d51cf52")
ngx.say("AES 128 CBC (WITH IV) encode_base64: ", ngx.encode_base64(encrypted))
ngx.say("token:",headers["token"])
local cipherBytes = ngx.decode_base64(headers["token"])
local text = aes_128_cbc_with_iv:decrypt(cipherBytes)
ngx.say("text:",text)

运行结果:

AES 128 CBC (WITH IV) encode_base64:PGpgSf1e6ZfD8tzTnHUr4WO8JCNi6GeZE+WP9FfA/rdZRAeFp1Kan8FOVrf0D9FHLIQpMGfKY075EEichxlytedD4Y2zVE7xRJQL0ejnxj4=
token:PGpgSf1e6ZfD8tzTnHUr4WO8JCNi6GeZE+WP9FfA/rdZRAeFp1Kan8FOVrf0D9FHLIQpMGfKY075EEichxlytedD4Y2zVE7xRJQL0ejnxj4=
text:12d57406-28aa-41f5-818d-6521e44949bd@e086a63d-196c-4b3e-9aa4-768f7d51cf52

openresty Aes解密 Java 加密相关推荐

  1. RSA node解密 java 加密的注意事项

    java 代码 Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding"); 代替 Cipher.getInstance(&q ...

  2. java url加密解密,Java加密解密 -Jasypt

    1. download url http://www.jasypt.org/download.html 2. 依赖 jar jasypt-1.9.0.jar 3. 加密 // 默认加密/解密算法是 P ...

  3. Java 加密解密之对称加密算法PBE

    JAVA  加密解密系列 Java 加密解密基础 Java byte数组与十六进制字符串互转 Java BASE64加密解密 Java 加密解密之消息摘要算法(MD5 SHA MAC) Java 加密 ...

  4. 国密SM4,layui前端 和.net core后台 加密解密 .net加密解密

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.本文做用?? 二.SM4介绍 三.使用步骤 1.前台实现加密 2.后台实现解密 四 总结 前言 第一次分享,我是个 ...

  5. Android采用AES+RSA的加密机制对http请求进行加密

    前言 最近维护公司APP应用的登录模块,由于测试人员用Fiddler抓包工具抓取到了公司关于登录时候的明文登录信息.虽然使用的是HTTPS的方式进行http请求的,但还是被Fiddler抓到了明文内容 ...

  6. Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA

    [最简单的加密] 1.简单的概念 明文:加密前的信息 密文:机密后的信息 算法:加密或解密的算法 密钥:算法使用的钥匙(读作miyao,正确应该是miyue,但是大家都读miyao) 2.简单的例子 ...

  7. vue java 使用AES 前后端加密解密

    最近在项目中需要针对重要数据进行加密传输 在网上找了一大推加密方式 最终采用AES 加密 1.java端 package com.zk.web.util;/*** AES 128bit 加密解密工具类 ...

  8. angular和JAVA实现aes、rsa加密解密,前后端交互,前端加解密和后端JAVA加解密实现

    今天实现了下AES和RSA加密解密,主要的功能是对前后端交互数据进行加密解密,为什么要用到两个算法呢,首先RSA默认的话加密长度是有限的100多个byte吧大约,并且需要公钥私钥,而AES加密没有限制 ...

  9. java android aes加密解密_AES加密解密在JAVA和ANDROID下互通

    昨天外包安卓的那个人说AES的加解密结果不一样.于是百度搜索发现还真是! 贴上AES加密核心: Cipher cipher = Cipher.getInstance("AES/CBC/PKC ...

最新文章

  1. 大厂首发!尚硅谷docker高级
  2. 统计学习方法|逻辑斯蒂原理剖析及实现
  3. 计算机软件记不住设置,想知道电脑密码记不住了怎么办
  4. ollydbg,ring3级别的调试软件
  5. SBUS2,一个增强型的SBUS协议,可实现双向通讯功能。SBUS2和SBUS区别到底在哪呢?
  6. matlab与maple互联,编程语言与Maple联合使用教程
  7. javascript爱心特效
  8. 网易云音乐自动获取前三首歌曲名称
  9. 微信自动回复 html 点击文字,常见微信自动回复经典语录
  10. 布隆过滤器与布谷鸟过滤器(经典版)
  11. SharePoint - 如何查询SharePoint ID?
  12. 鸿蒙os下载到电脑上,华为鸿蒙os系统官网
  13. IC设计之CDC(跨时钟域)问题
  14. ELSEVIER期刊论文投稿全流程实例讲解
  15. css 更换图片颜色
  16. C语言strlen()函数用法
  17. 【南風-视觉】Ubuntu命令行安装QT
  18. 女生学计算机还是电气,工科行业基本都歧视女性
  19. 聊一聊SLAP:单一抽象层级原则
  20. c#时分秒毫秒微妙_C# 日期格式精确到毫秒 【转】

热门文章

  1. Linux设备树的概念
  2. MySQL环境配置问题-could not acquire management access for administration
  3. 前端基础CSS3-(3D动画)
  4. MOELLER NZMH3-AE630-S1 + M22-K10 塑壳断路器
  5. 电商项目数据库设计 | 第三篇:库存相关表结构
  6. 修复Vmware虚拟网卡异常并远程连接Linux
  7. Python基础数据类型补充及深浅拷贝
  8. 分享一些提升效率的小工具
  9. 微服务之间的服务治理 方案
  10. android 点击图片旋转90度,Android UI之ImageView实现图片旋转和缩放