【方案】前后端数据传输加密实现方案 - 后端实现

[方案系列文章说明]: 该类型的文章是我在使用和学习中认为不错的解决办法,当然会有更好的方案,也一定会有, 所以文章具有一定的局限性, 请结合自己的思考辩证的看.

继续上代码

1, 加密工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/**
* 前后端请求加解密工具
*
* @Description
* @Author xingzhi.lv
* @Version 1.0
* @Date 2021/7/2 15:36
*/
public class RequestAESUtils {
private static final String ENCRYPT_TYPE = "AES";
private static final String CIPHER_MODEL = "AES/ECB/PKCS5Padding";

/**
* 初始化加密
*
* @return
* @throws Exception
*/
private static Cipher createAesCipher() throws Exception {
return Cipher.getInstance(CIPHER_MODEL);
}

/**
* AES方式加密
* Base64输出
*
* @param content
* @return
* @throws Exception
*/
public static String encryptByAES(String content, String key) throws Exception {
Cipher cipher = createAesCipher();
KeyGenerator keyGenerator = KeyGenerator.getInstance(ENCRYPT_TYPE);
keyGenerator.init(128, new SecureRandom(key.getBytes()));
SecretKeySpec secretKeySpec = new SecretKeySpec(Arrays.copyOf(key.getBytes(StandardCharsets.UTF_8), 16), ENCRYPT_TYPE);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] bytes = cipher.doFinal(content.getBytes());
// 对字节数组加密生成字符串
BASE64Encoder base64encoder = new BASE64Encoder();
String result = base64encoder.encode(bytes);
return result;
}

/**
* AES方式解密
* Base64输入
*
* @param content
* @return
* @throws Exception
*/
public static String decryptByAes(String content, String key) throws Exception {
// 对字符串解密形成数组-> 再转为对应编码字符串
BASE64Decoder dencode = new BASE64Decoder();//创建解码对象
byte[] bytes = dencode.decodeBuffer(content);//得到字节数组
Cipher cipher = createAesCipher();
KeyGenerator keyGenerator = KeyGenerator.getInstance(ENCRYPT_TYPE);
keyGenerator.init(128, new SecureRandom(key.getBytes()));
SecretKeySpec secretKeySpec = new SecretKeySpec(Arrays.copyOf(key.getBytes(StandardCharsets.UTF_8), 16), ENCRYPT_TYPE);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] resultDecryptByte = cipher.doFinal(bytes);
return new String(resultDecryptByte);
}

// public static void main(String[] args) throws Exception {
// String encryContent = RequestAESUtils.encryptByAES("138", "0000000000000000");
// System.out.println(encryContent);
// String content = RequestAESUtils.decryptByAes(encryContent, "0000000000000000");
// System.out.println(content);
// System.out.println(RequestAESUtils.decryptByAes("1BUqgKqSChvYM6xwB5wIzA==", "0000000000000000"));
// }

}

阅读更多

【方案】前后端数据传输加密实现方案 - 前端实现

[方案系列文章说明]: 该类型的文章是我在使用和学习中认为不错的解决办法,当然会有更好的方案,也一定会有, 所以文章具有一定的局限性, 请结合自己的思考辩证的看.

上代码

1, 引入加密工具包-CryptoJS

1
<script src="/layui/cryptojs/aes.js"></script><script src="/layui/cryptojs/mode-ecb-min.js"></script>

2, 加密方法

1
2
3
4
5
function encryptAesParam(content){
  const key = CryptoJS.enc.Utf8.parse("0000000000000000");
  var ciphertext = CryptoJS.AES.encrypt(content+"", key,{mode: CryptoJS.mode.ECB,    padding:CryptoJS.pad.Pkcs7  }).toString();
  return ciphertext;
}
阅读更多

【方案】前后端数据传输加密实现方案

[方案系列文章说明]: 该类型的文章是我在使用和学习中认为不错的解决办法,当然会有更好的方案,也一定会有, 所以文章具有一定的局限性, 请结合自己的思考辩证的看.

在处理前后端安全上,需要对数据进行加密增加安全性,这里列出我的方案

背景

前后端数据传输要求对敏感信息进行加密后传输, 后台统一进行解密后进入Controller

方案

1, 加密方式: AES/ECB/PKCS5Padding (PKCS5Padding,PKCS7Padding效果相同)
2, 生成的密文编码: UTF-8
3, 秘钥长度: 16位, 0000000000000000
4, 数据块长度: 128
5, header中设置加密开关,加密属性

|key |value |
|—- |—- |
|isEncrypt |true/false 解密/不解密 |
|decryptFields |user|age|id 需要解密的字段,以|分割 |

6, 支持请求方式: method支持GET/POST
7, 支持数据类型: contentType支持application/json,application/x-www-form-urlencoded

阅读更多

【方案】业务中MQ的使用方案分析

[方案系列文章说明]: 该类型的文章是我在使用和学习中认为不错的解决办法,当然会有更好的方案,也一定会有, 所以文章具有一定的局限性, 请结合自己的思考辩证的看.

业务中使用MQ遇到的常见问题,进行分析并给出一个合理的解决方案.

常见使用方式及问题

场景一

1
2
3
4
S1: open Transaction
S2: 处理业务
S3: 发送MQ消息
S4: commit Transaction

问题
1, 当S3失败,大量阻塞业务,可能造成整个业务线雪崩
2, 当S4失败,造成业务数据回滚, MQ消息发送成功,产生异常数据

场景二

1
2
3
4
S1: open Transaction
S2: 处理业务
S3: commit Transaction
S4: 发送MQ消息

问题
1,当S4失败, 造成MQ未正常发送,产生消费业务线产生异常数据

阅读更多

【方案】Redis+数据库双写问题

[方案系列文章说明]: 该类型的文章是我在使用和学习中认为不错的解决办法,当然会有更好的方案,也一定会有, 所以文章具有一定的局限性, 请结合自己的思考辩证的看.

业务中使用Redis进行数据缓存,通常会遇到数据一致性问题,这里进行分析和讨论几种方案.

常见使用方式及问题

场景一

1
2
3
4
S1: update/delete redis
S2: open Transaction
S3: 处理业务
S4: commit Transaction

问题
1, 并发时, 缓存删除后事务执行期间,其他线程的读将造成缓存脏数据
结论
脏数据的概率非常大,方案淘汰

阅读更多

【方案】JDK实现DB连接池管理

[方案系列文章说明]: 该类型的文章是我在使用和学习中认为不错的解决办法,当然会有更好的方案,也一定会有, 所以文章具有一定的局限性, 请结合自己的思考辩证的看.

1,连接池接口定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package dbsource;

import java.sql.Connection;
import java.sql.SQLException;

/**
* 连接池接口
* @author lxz
*
*/
public interface DBSource {

Connection getConnection() throws SQLException;

void closeConnection(Connection con) throws SQLException;
}
阅读更多

【方案】Oracle物化视图使用

[方案系列文章说明]: 该类型的文章是我在使用和学习中认为不错的解决办法,当然会有更好的方案,也一定会有, 所以文章具有一定的局限性, 请结合自己的思考辩证的看.

使用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
----删除
TRUNCATE TABLE mlog$_xxx_lxz_tmp;
DROP MATERIALIZED VIEW LOG ON xxx_lxz_tmp;

drop materialized view mv_xxx_lxz_tmp

----原表创建增量刷新日志
CREATE MATERIALIZED VIEW LOG ON xxx_lxz_tmp WITH PRIMARY KEY INCLUDING NEW VALUES;

----创建物化视图
CREATE MATERIALIZED VIEW mv_xxx_lxz_tmp
Build immediate //默认方式 创建即刷新 DEFERRED 下次刷新填入数据
REFRESH fast START WITH SYSDATE + 2/24 // fast刷新 开始时间 凌晨两点
NEXT round(sysdate+1) + 2/24 //下次刷新 明天两点
AS SELECT * FROM xxx_lxz_tmp; //语句

物化视图刷新

需创建定时任务

1
2
3
4
declare joblxz NUMBER;
begin
dbms_job.submit(job=>joblxz,what=>'mv_xxx_lxz_tmp;',next_date=>to_date('20191120 21:30:00','yyyyMMdd hh24:mi:ss'),interval=>'sysdate+1+30/(24*60)',no_parse=>false);
end;

启动

1
2
3
4
5
6
7
8
9
BEGIN
DBMS_JOB.RUN(23);
commit;
END;

23 就是定时器得索引 可根据下面方式查出
select * from user_jobs;——查看调度任务
select * from dba_jobs_running;——查看正在执行的调度任务
select * from dba_jobs;——查看执行完的调度任务
阅读更多

【方案】JDK实现线程池管理

[方案系列文章说明]: 该类型的文章是我在使用和学习中认为不错的解决办法,当然会有更好的方案,也一定会有, 所以文章具有一定的局限性, 请结合自己的思考辩证的看.

线程池的特点

  1. 迅速响应.
  2. 线程之间无优先级.
  3. 线程执行时间短,不阻塞其他任务.
  4. 线程不可绑定操作,不可被跟踪.

优点

  1. 对象线程不用重复的创建与销毁,节省时间,资源.
  2. 可以对线程的数量进行控制.

CODE

阅读更多

【方案】接口+抽象类+实现类的三层设计模型

[方案系列文章说明]: 该类型的文章是我在使用和学习中认为不错的解决办法,当然会有更好的方案,也一定会有, 所以文章具有一定的局限性, 请结合自己的思考辩证的看.

结构模型

应用情景

  1. 访问入口是统一的
  2. 具体实现有多种变化

模拟情景

1,蛋糕店有一台生产蛋糕的机器(接口),机器有磨具插槽(定义入口)
2,机器需要有不同的蛋糕磨具才能塑形(抽象类),磨具与机器之间有相匹配的型号(入口实现)
3,磨具又规定了蛋糕的大小,但是蛋糕材料没有固定(差异化定义)
4,果仁蛋糕磨具中放入果仁,鸡蛋蛋糕磨具中放入鸡蛋(差异化实现)
(1),机器是接口 (2),磨具是抽象类 (3),磨具+材料是具体实现

抽象类对接口进行了统一入口的实现,并且约束了具体实现类的定义