자바 간이 로그 인 등록 기능 구현 코드 분석
해시 알고리즘 의 가장 중요 한 특징 은:
로그 인 에서 특정한 사용자 정보 가 존재 하 는 지 확인 하려 면 모든 사용자 정보 가 유일한 것 이기 때문에 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 ""; //
}
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.