패스워드 처리 로직...
- 작성자 :
- 김*주
- 작성일 :
- 2015-01-20 14:20:14
- 조회수 :
- 1,246
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
템플릿 Enterprise Business 를 설치하고 로그인을 하고 있는데요..
admin/1 은 잘 로그인이 됩니다.
user1/1 은 로그인이 안됩니다.
test 로 사용자를 만들어서 로그인을 해도 안됩니다.
그래서 뭐가 다른지 소스를 열어봤더니...
로그인을 할때는 아래 메소드를 사용합니다.
public static String encryptPassword(String password, String id) throws Exception {
if (password == null) {
return "";
}
byte[] hashValue = null; // 해쉬값
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.reset();
md.update(id.getBytes());
hashValue = md.digest(password.getBytes());
return new String(Base64.encodeBase64(hashValue));
}
가입할때나 암호변경 시에는 아래 메소드를 사용합니다.
public static String encryptPassword(String data) throws Exception {
if (data == null) {
return "";
}
byte[] plainText = null; // 평문
byte[] hashValue = null; // 해쉬값
plainText = data.getBytes();
MessageDigest md = MessageDigest.getInstance("SHA-256");
// 변경 시 기존 hash 값에 검증 불가.. => deprecated 시키고 유지
/*
// Random 방식의 salt 추가
SecureRandom ng = new SecureRandom();
byte[] randomBytes = new byte[16];
ng.nextBytes(randomBytes);
md.reset();
md.update(randomBytes);
*/
hashValue = md.digest(plainText);
/*
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(hashValue);
*/
return new String(Base64.encodeBase64(hashValue));
}
다른점을 살펴봤더니...
로그인 할때..
md.reset();
md.update(id.getBytes());
이 두줄을 더 실행합니다.
두번째 메소드에는 위 두줄이 주석처리 되어 있습니다.
이게 무슨 역할을 하는지 잘 모르겠지만...
위 로직이 맞는건지 확인해 주시면 감사합겠습니다.
로그인 할때 첫번째 메소드에서 admin/1 은 테이블안에 있는 데이터(패스워드)와 같은 값을 리턴하는데..
user1 과 새로만든 사용자 test 는 다른값을 리턴합니다. 그래서 로그인이 되지 않습니다.
만약 위 로직이 맞다면.. 로그인이 왜 안되는걸까요?
admin/1 은 잘 로그인이 됩니다.
user1/1 은 로그인이 안됩니다.
test 로 사용자를 만들어서 로그인을 해도 안됩니다.
그래서 뭐가 다른지 소스를 열어봤더니...
로그인을 할때는 아래 메소드를 사용합니다.
public static String encryptPassword(String password, String id) throws Exception {
if (password == null) {
return "";
}
byte[] hashValue = null; // 해쉬값
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.reset();
md.update(id.getBytes());
hashValue = md.digest(password.getBytes());
return new String(Base64.encodeBase64(hashValue));
}
가입할때나 암호변경 시에는 아래 메소드를 사용합니다.
public static String encryptPassword(String data) throws Exception {
if (data == null) {
return "";
}
byte[] plainText = null; // 평문
byte[] hashValue = null; // 해쉬값
plainText = data.getBytes();
MessageDigest md = MessageDigest.getInstance("SHA-256");
// 변경 시 기존 hash 값에 검증 불가.. => deprecated 시키고 유지
/*
// Random 방식의 salt 추가
SecureRandom ng = new SecureRandom();
byte[] randomBytes = new byte[16];
ng.nextBytes(randomBytes);
md.reset();
md.update(randomBytes);
*/
hashValue = md.digest(plainText);
/*
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(hashValue);
*/
return new String(Base64.encodeBase64(hashValue));
}
다른점을 살펴봤더니...
로그인 할때..
md.reset();
md.update(id.getBytes());
이 두줄을 더 실행합니다.
두번째 메소드에는 위 두줄이 주석처리 되어 있습니다.
이게 무슨 역할을 하는지 잘 모르겠지만...
위 로직이 맞는건지 확인해 주시면 감사합겠습니다.
로그인 할때 첫번째 메소드에서 admin/1 은 테이블안에 있는 데이터(패스워드)와 같은 값을 리턴하는데..
user1 과 새로만든 사용자 test 는 다른값을 리턴합니다. 그래서 로그인이 되지 않습니다.
만약 위 로직이 맞다면.. 로그인이 왜 안되는걸까요?
A
안녕하세요. 김명주님.
최근 보안 강화를 위하여 암호화 생성 처리 부분에 ID를 salt로 추가하는 작업이 있었습니다.
다만, 일부 부분에 적용이 되지 않아서 생성된 계정에 대하여 로그인이 처리되지 못하는 문제가 있었습니다.
(해당 부분은 현재 조치되어 정상 배포되어 있음)
이전에 개발환경을 받으신 경우에는 FAQ의 "템플릿 프로젝트 사용자 생성시 로그인이 안됩니다." 내용을 참조하셔서 수정해 주시면 됩니다.
차이가 나는 부분인
md.reset();
md.update(id.getBytes());
이 부분이 ID를 salt로 추가한 부분입니다.
그럼, 즐거운 하루되십시오.
감사합니다.
최근 보안 강화를 위하여 암호화 생성 처리 부분에 ID를 salt로 추가하는 작업이 있었습니다.
다만, 일부 부분에 적용이 되지 않아서 생성된 계정에 대하여 로그인이 처리되지 못하는 문제가 있었습니다.
(해당 부분은 현재 조치되어 정상 배포되어 있음)
이전에 개발환경을 받으신 경우에는 FAQ의 "템플릿 프로젝트 사용자 생성시 로그인이 안됩니다." 내용을 참조하셔서 수정해 주시면 됩니다.
차이가 나는 부분인
md.reset();
md.update(id.getBytes());
이 부분이 ID를 salt로 추가한 부분입니다.
그럼, 즐거운 하루되십시오.
감사합니다.