whycxzp
2022-03-08 d9f79b7f75f39b0c710a2d795876ed45f975c69a
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package com.whyc.service;
 
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.util.StringUtil;
import com.whyc.dto.Response;
import com.whyc.mapper.TableMapper;
import com.whyc.mapper.UserInfMapper;
import com.whyc.pojo.UserInf;
import com.whyc.util.AESUtil;
import com.whyc.util.RSAUtil;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;
 
@Service
public class PasswordResetService {
 
    @Resource
    private UserInfMapper userInfMapper;
 
    @Resource
    private TableMapper tableMapper;
 
    /*public Response<String> preCheck(String name) {
        Response<String> response = new Response<>();
        QueryWrapper<UserInf> queryWrapper = Wrappers.query();
        queryWrapper.select("uSnId as SNId").eq("uName",name).last(" limit 1");
        UserInf userInf = userInfMapper.selectOne(queryWrapper);
        //解析密码
        String password = parsePassword(userInf.getSNId());
        response.setData(password);
        response.setMsg(encryptType);
        return response;
    }*/
 
    @Transactional
    public void bakUserInfo(){
        QueryWrapper<UserInf> queryWrapper = Wrappers.query();
        queryWrapper.select("uId as id","uSnId as SNId","upassword as password","uName as name");
        List<UserInf> userInfList = userInfMapper.selectList(queryWrapper);
 
        tableMapper.createUserBak();
        tableMapper.insertRecordToUserBak(userInfList);
    }
 
    @Transactional
    public void passwordReset(){
        //uSnId 有两种情况,明文/AES加密/RSA
        QueryWrapper<UserInf> queryWrapper = Wrappers.query();
        queryWrapper.select("uId as id","uSnId as SNId");
        List<UserInf> userInfList = userInfMapper.selectList(queryWrapper);
        userInfList.stream().forEach(userInf->{
            /*if(userInf.getId() == 0){
                return;
            }*/
            //明文,需要判断获取
            String password = parsePassword(userInf.getSNId());
            password = password.trim();
            //将明文RSA加密回写到uSnId和upassword
            String passwordRSA = RSAUtil.encrypt(password, RSAUtil.getPublicKey());
            userInf.setSNId(passwordRSA);
            userInf.setPassword(passwordRSA);
            //userInfMapper.updateById(userInf);
        });
        userInfMapper.updateBatch(userInfList);
    }
 
    private String parsePassword(String passwordData){
        //明文,需要判断获取
        String password;
        password = AESUtil.desEncrypt(passwordData);
        if(StringUtil.isEmpty(password) || !verifyPassword(password.trim())){
            password = RSAUtil.decrypt(passwordData, RSAUtil.getPrivateKey());
            if(StringUtil.isEmpty(password) || !verifyPassword(password.trim())){
                password = passwordData;
            }
        }
        return password.trim();
    }
 
    private boolean verifyPassword(String password) {
        String pattern = "[0-9a-zA-Z!@#$%^&*()-_=+[{]}\\|;:'\",<.>]";
        char[] chars = password.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char char1 = chars[i];
            boolean matches = Pattern.matches(pattern, String.valueOf(char1));
            if(!matches){
                return false;
            }
        }
        return true;
    }
 
}