페이지에서 입력한 암호와 데이터베이스에서의 암호 비교

5863 단어 수필.
문제 설명
  • 앞 페이지에서 입력한 비밀번호와 데이터베이스에 저장된 암호화된 비밀번호를 비교하여 검증하고 통과하면 사용자 페이지에 들어가고 검증이 통과하지 않으면 로그인 인터페이스에 들어간다
  • 원래 문제 코드
  •     public BaseReturnInfo androidLogin(@RequestParam String phoneNumber, @RequestParam String pwd) {
            BaseReturnInfo baseReturnInfo = new BaseReturnInfo();
            UserInfo userInfo = userInfoRepository.getUserByPhoneNumber(phoneNumber);
            if (userInfo == null) {
                baseReturnInfo.setMsg("         ");
                baseReturnInfo.setStatus(1);
                return baseReturnInfo;
            }
    
            if (pwd != userInfo.getPwd()) {
                baseReturnInfo.setMsg("         ");
                baseReturnInfo.setStatus(1);
                return baseReturnInfo;
            }
            baseReturnInfo.setMsg(userInfo.getCompanyName());
            baseReturnInfo.setStatus(0);
            return baseReturnInfo;
        }

    해결책
    public BaseReturnInfo androidLogin(@RequestParam String phoneNumber, @RequestParam String pwd) {
            BaseReturnInfo baseReturnInfo = new BaseReturnInfo();
            UserInfo userInfo = userInfoRepository.getUserByPhoneNumber(phoneNumber);
            if (userInfo == null) {
                baseReturnInfo.setMsg("         ");
                baseReturnInfo.setStatus(1);
                return baseReturnInfo;
            }
            BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();//  
            //         pwd            userInfo.getPwd()
            boolean glag = bCryptPasswordEncoder.matches(pwd, userInfo.getPwd());//  
            if(!glag) {
                baseReturnInfo.setMsg("         ");
                baseReturnInfo.setStatus(1);
                return baseReturnInfo;
            }
            baseReturnInfo.setMsg(userInfo.getCompanyName());
            baseReturnInfo.setStatus(0);
            return baseReturnInfo;
        }

    의 원리
    BCryptPasswordEncoder의 matches 방법
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
            if (encodedPassword == null || encodedPassword.length() == 0) {
                logger.warn("Empty encoded password");
                return false;
            }
    
            if (!BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
                logger.warn("Encoded password does not look like BCrypt");
                return false;
            }
    
            return BCrypt.checkpw(rawPassword.toString(), encodedPassword);
        }

    그리고 원본 코드에 의존해서 문제를 해결한다.
    public class BCryptPasswordEncoder implements PasswordEncoder {
        private Pattern BCRYPT_PATTERN = Pattern.compile("\\A\\$2a?\\$\\d\\d\\$[./0-9A-Za-z]{53}");
            ····
    }
    //   
    String regex = "\\b\\w{3}\\b";
    //           
    Pattern p = Pattern.compile(regex);
    //              
    Matcher m = p.matcher(s);
    //           
    //   find                
    // public boolean find()
    public class BCrypt {}
    
        public static boolean checkpw(String plaintext, String hashed) {
            return equalsNoEarlyReturn(hashed, hashpw(plaintext, hashed));
        }

    참고 문헌
  • https://blog.csdn.net/qq_35257397/article/details/52097647?fps=1&locationNum=6
  • https://www.cnblogs.com/liwendeboke/p/6054690.html
  • https://zhidao.baidu.com/question/276330953.html
  • https://blog.csdn.net/Adonis_D_Gogh/article/details/79975526

  • 비고
  • 원리를 연구하지 마라, 그렇지 않으면 갈수록 깊어진다
  • 상술한 문법에 따라 앞쪽 페이지에 입력한 비밀번호와 백엔드 데이터베이스에 있는 비밀번호를 비교하면 사용자 페이지에 들어갈 수 있다.
  • 약간 표절된 성분, 양해
  • 좋은 웹페이지 즐겨찾기