자바 간이 로그 인 등록 기능 구현 코드 분석

해시 알고리즘(Hash)은 요약 알고리즘(Digest)이 라 고도 부 릅 니 다.임의의 입력 데 이 터 를 계산 하여 고정된 길이 의 출력 요약 을 얻 는 역할 을 합 니 다.
해시 알고리즘 의 가장 중요 한 특징 은:
  • 같은 입력 은 반드시 같은 출력 을 얻 을 수 있다.
  • 서로 다른 입력 률 은 서로 다른 출력 을 얻 을 수 있다.
  • 해시 알고리즘 의 목적 은 원시 데이터 가 변경 되 었 는 지 검증 하기 위 한 것 이다.
  • 사용자 등록 과 로그 인 에 사용 되 는 가장 기본 적 인 기능 을 간단하게 실현 합 니 다.
    로그 인 에서 특정한 사용자 정보 가 존재 하 는 지 확인 하려 면 모든 사용자 정보 가 유일한 것 이기 때문에 Set 의 특성 을 통 해 사용자 정보의 저장 을 조작 할 수 있 습 니 다.
    등록 에서 사용자 이름 이 이미 등록 되 었 는 지 확인 해 야 하고 모든 사용자 이름 도 유일한 것 이기 때문에 여기 서도 Set 을 이용 하여 사용자 이름 의 저장 을 조작 합 니 다.
    물론 사용자 이름과 사용자 비밀 번 호 를 맵 으로 저장 하고,K 는 사용자 이름 을 저장 하고,대응 하 는 V 는 비밀 번 호 를 저장 할 수도 있다.그러나 사용자 이름과 비밀번호 의 연관 성 을 최대한 작 게 하기 위해 두 개의 Set 을 이용 하여 사용자 이름과 사용자 정 보 를 각각 저장 합 니 다.
    Set 은 무질서 하기 때문에 해커 가 이 두 데이터 파일 을 가 져 올 때 도 사용자 이름 을 해당 하 는 사용자 정보 에 대응 하기 어렵다.
    이 사용자 정 보 는 사용자 이름과 비밀 번 호 를 혼합 한 정 보 를 말 합 니 다.예 를 들 어 한 사용자 의 정 보 는'admin'이 고 비밀 번 호 는'password'입 니 다.그러면 이 두 필드 를 혼합 하여 정 보 량 을 늘 리 는 목적 을 달성 할 수 있 습 니 다.
    물론 안전성 을 높이 기 위해 서 는 특정한 배열 조합 을 이용 하여 두 문자열 을 혼합 할 수 있 습 니 다.예 를 들 어 두 문자열 을 문자 배열 로 분해 하고 배열 아래 표 시 된 짝수 에 따라 두 문자열 을 배열 할 수 있 습 니 다.
    예 를 들 어'admin'의 길 이 는'password'보다 작 기 때문에'admin'을 기준 으로'a'를 시작 으로'admin'은 홀수 위 를 차지 하고'passw'는 짝수 위 를 차지 하 며 나머지 문 자 는 생 성 필드 에 연 결 된 후에'apdamsisnword'는 사용자 이름 을 암호 에 삽입 한 것 과 같다.
    생 성 된 모든 사용자 정보 에 무 작위 문 자 를 추가 하 는 방법 도 있 는데 이 방법 은'소금 넣 기'라 고 불 린 다.
    예 를 들 어 사용자 이름과 비밀 번 호 는 여전히'admin'과'password'입 니 다.우 리 는 무 작위 salt='aRandomSalt'를 설정 한 다음 에 이 salt 를 사용자 이름과 비밀번호 에 넣 습 니 다.예 를 들 어'admin'+salt+'password',salt+'admin'+'password'또는 다른 복잡 한 조합 입 니 다.
    다음 코드 에 서 는 사용자 이름과 비밀 번 호 를 간단하게 연결 합 니 다.즉,"adminpassword"입 니 다.
    
    package service;
    
    import java.math.BigInteger;
    import java.security.MessageDigest;
    import java.util.HashSet;
    import java.util.Set;
    
    import dao.Dao; //         
    import dao.UserInfoDao; //          
    import entity.UserInfo; //        ,         userName userPassword,       
    
    public class UserInfoService extends Dao {
    	private String userInfoPath; //            
    	private String userNamePath; //           
    	private UserInfoDao dao = new UserInfoDao();
    
    	public UserInfoService() {
    		super();
    		userInfoPath = super.getResource().getString("userInfo");
    		userNamePath = super.getResource().getString("userName");
    	}
    
    	/**
    	 *     。       ,     ;        ,     
    	 * 
    	 * @param userInfo
    	 * @return     
    	 */
    	public String userSignIn(UserInfo userInfo) {
    		Set<String> userInfoSet = null;
    		String tips;
    		userInfoSet = dao.readInfo(userInfoPath); //             
    		if (userInfoSet == null) { //        , new HashSet<String>(),  NullPointerException
    			userInfoSet = new HashSet<String>();
    		}
    		if (userInfoSet.contains(getUserInfoHashCode(userInfo))) { //             
    			tips = "    !";
    		} else {
    			tips = "    !         ";
    		}
    		return tips;
    	}
    
    	/**
    	 *     。       ,     ;      ,     
    	 * 
    	 * @param userInfo
    	 * @return     
    	 */
    	public String userSignUp(UserInfo userInfo) {
    		Set<String> userInfoSet = null;
    		Set<String> userNameSet = null;
    		String tips;
    		userInfoSet = dao.readInfo(userInfoPath); //             
    		userNameSet = dao.readInfo(userNamePath); //            
    		if (userInfoSet == null) { //        , new HashSet<String>(),  NullPointerException
    			userInfoSet = new HashSet<String>();
    		}
    		if (userNameSet == null) { //        , new HashSet<String>(),  NullPointerException
    			userNameSet = new HashSet<String>();
    		}
    		if (userNameSet.add(userInfo.getUserName())) { //           
    			userInfoSet.add(getUserInfoHashCode(userInfo)); //        ,         Set 
    			dao.saveInfo(userInfoSet, userInfoPath); //            
    			dao.saveInfo(userNameSet, userNamePath); //           
    			tips = "    !";
    		} else {
    			tips = "    !     ";
    		}
    		return tips;
    	}
    
    	/**
    	 *      SHA-1        ,     36   
    	 * 
    	 * @param userInfo
    	 * @return         
    	 */
    	public String getUserInfoHashCode(UserInfo userInfo) {
    		return getUserInfoHashCode(userInfo, "SHA-1", 36); //  SHA-1          ,   36  
    	}
    
    	/**
    	 *      algorithm        ,     radix    
    	 * 
    	 * @param userInfo
    	 * @param algorithm
    	 * @param radix
    	 * @return         
    	 */
    	public String getUserInfoHashCode(UserInfo userInfo, String algorithm, int radix) {
    		try {
    			MessageDigest md = MessageDigest.getInstance(algorithm); //      algorithm    MessageDigest  
    			md.update((userInfo.getUserName() + userInfo.getUserPassword()).getBytes("UTF-8")); //          ,  update()    
    			byte[] res = md.digest(); //       byte[] 
    			return new BigInteger(1, res).toString(radix); //            radix    
    		} catch (Exception e) {
    			e.printStackTrace();
    			return ""; //           
    		}
    	}
    }
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기