스프링 시큐리티 간소화 hash관련 질문
- 작성자 :
- 이*형
- 작성일 :
- 2016-04-24 17:02:15
- 조회수 :
- 1,232
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
안녕하세요
전자정부 프레임워크 묻고 답하기에 항상 의지하며 도움을 많이 받고 있습니다. ^^
포탈사이트 템플릿에
스프링 시큐리티 간소화 기능의 설정값중에
다음과 같은 최초설치에 설정되어 있더군요.
hash = "plaintext"
hashBase64="false"
이 값을
hash = "sha-256"
hashBase64 = "true"
으로 변경하니까 로그인이 안되고 있습니다.
egovframework 회원가입페이지를 살펴봤더니 회원가입시 패스워드를 sha-256에 사용자 id를 salt로 사용하고 있는것같더군요.
질문1) 간소화서비스에서 hash="plaintext'와 hashBase64="false"로 고정하고 사용하여야 하는 건가요?
질문2) 질문1)에서 hash값과 hashBase64를 변경가능하다면 왜 portal site templete의 기본설치값에서 변경했을때 password를 validation하는 과정에서 에러가 발생되는 것인가요? 그리고 정확한 사용법은 어떻게 되는 지요?
질문3) 회원등록등의 코드에서 실행중인 sha-256, 사용자 id salt로 패스워드를 DB에 등록하는 것과 간소화기능의 xml에 설정값(hash,hashBase64)와는 어떠한 관계가 있는 것인지 궁금합니다.
질문4) xml상에 hash="plaintext'와 hashBase64="false"를 개발중이 아닌 실제 서버에 적용을 하여도 보안상의 큰 차이가 없는 것인지도 궁금합니다.
지식이 짧아 질문자체가 성립되는 지도 잘 모르는 초보입니다. 너그럽게 양해바랍니다.
전자정부 프레임워크 묻고 답하기에 항상 의지하며 도움을 많이 받고 있습니다. ^^
포탈사이트 템플릿에
스프링 시큐리티 간소화 기능의 설정값중에
다음과 같은 최초설치에 설정되어 있더군요.
hash = "plaintext"
hashBase64="false"
이 값을
hash = "sha-256"
hashBase64 = "true"
으로 변경하니까 로그인이 안되고 있습니다.
egovframework 회원가입페이지를 살펴봤더니 회원가입시 패스워드를 sha-256에 사용자 id를 salt로 사용하고 있는것같더군요.
질문1) 간소화서비스에서 hash="plaintext'와 hashBase64="false"로 고정하고 사용하여야 하는 건가요?
질문2) 질문1)에서 hash값과 hashBase64를 변경가능하다면 왜 portal site templete의 기본설치값에서 변경했을때 password를 validation하는 과정에서 에러가 발생되는 것인가요? 그리고 정확한 사용법은 어떻게 되는 지요?
질문3) 회원등록등의 코드에서 실행중인 sha-256, 사용자 id salt로 패스워드를 DB에 등록하는 것과 간소화기능의 xml에 설정값(hash,hashBase64)와는 어떠한 관계가 있는 것인지 궁금합니다.
질문4) xml상에 hash="plaintext'와 hashBase64="false"를 개발중이 아닌 실제 서버에 적용을 하여도 보안상의 큰 차이가 없는 것인지도 궁금합니다.
지식이 짧아 질문자체가 성립되는 지도 잘 모르는 초보입니다. 너그럽게 양해바랍니다.
A
안녕하세요. 표준프레임워크센터입니다.
질문1)
//현재 저희가 제공해드리는 것은 기본적으로 default로 제공해드리는 것입니다. 설정에 따라 변경하셔도 상관없습니다.
※ 간소화 설정 기준으로 hashBase64옵션은 세팅하지 않을경우 Defualt로 "true"로 세팅이 됩니다.
질문2)
// 템플릿에서 제공하는 것은 현재 두번 체크를 하게 되어있습니다.
첫째, EgovLoginController.actionSecurityLogin()을 통해 입력한 패스워드 값을 sha-256로 인코딩하여 디비상에 저장된 패스워드와 값을 비교
둘째, 스프링 시큐리티 내에서 검증하는 것으로 ProviderManager 내에서 authenticate부분 내에 검증하는 부분이 있습니다.
context-security.xml 파일내 hash 값 설정을 바꾸실 경우 에러가 발생되는 부분은 여기의 부분으로 사료됩니다.
원인은 스프링 시큐리티 내에서 검증시 내부에서도 입력된 패스워드와 userDetails내의 패스워드의 값을 비교를 진행하는데, userDetails내의 패스워드를 설정된 hash값으로 한번 더 인코딩하여 값을 비교하기 때문에, 패스워드가 같지 않아 통과가 되지 않고 에러가 발생하게 됩니다.
따라서 hash값을 변경하여 사용하실 경우 EgovUserDetails 내의 password값을 세팅할 때 해당 값을 평문에서 sha-256으로 인코딩하여 입력하시면 됩니다.간소화기능을 사용하시는 경우 간소화 기능내의 "jdbcMapClass" 속성에서 지정된 클래스내에 UserDetails을 설정하는 부분에서 패스워드 값을 수정하시면 됩니다.
ex1) 템플릿 기준으로
egovframework.let.uat.uia.service.impl.EgovSessionMapping클래스의 mapRow() 메소드 내부에 return 부분인
>> return new EgovUserDetails(strUserId, strPassWord, strEnabled, loginVO); 내의 인자 strPassWord를 인코딩하여 전달
ex2) 인코딩 방법
String enpassword = EgovFileScrty.encryptPassword(strPassWord, ""); //해당 메소드는 SHA-256 인코딩 방식 적용)
...
return new EgovUserDetails(strUserId, enpassword, strEnabled, loginVO);
참조1)
ProviderManager.authenticate(authentication)
> AbstractUserDetailsAuthenticationProvider.(Authentication authentication) 내의
additionalAuthenticationChecks(user, (UsernamePasswordAuthenticationToken) authentication); 부분 [UsernamePasswordAuthenticationToken 체크]
> DaoAuthenticationProvider.additionalAuthenticationChecks(UserDetails userDetails,UsernamePasswordAuthenticationToken authentication) 내의
조건문(해당 부분에서 userDetails내의 패스워드와 전달된 패스워드 비교)
if (!passwordEncoder.isPasswordValid(userDetails.getPassword(), presentedPassword, salt)) {
> org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder 클래스의
isPasswordValid(String encPass, String rawPass, Object salt) 메소드로 패스워드 검증
참조2) 프레임워크에서는 시큐리티 사용 시 j_password값을 실제 패스워드로 사용하지 않고, UniqID값을 사용합니다.(ex)resultVO.getUniqId())
ex) 템플릿 기준 EgovLoginController.actionSecurityLogin() 참조
질문3)
//직접적인 관계는 있지 않으며, 저희가 plaintext로 설정하여 제공해 드리는 방법의 경우 사용자가 시큐리티 설정을 직접적으로 건드리지 않고 사용할 수 있도록 제공하는 부분입니다.
질문4)
// 현재까지 보안상의 큰 이슈는 없습니다.
감사합니다.
p.s. 외부링크 내용을 참조하시길 바랍니다.
http://zgundam.tistory.com/54
질문1)
//현재 저희가 제공해드리는 것은 기본적으로 default로 제공해드리는 것입니다. 설정에 따라 변경하셔도 상관없습니다.
※ 간소화 설정 기준으로 hashBase64옵션은 세팅하지 않을경우 Defualt로 "true"로 세팅이 됩니다.
질문2)
// 템플릿에서 제공하는 것은 현재 두번 체크를 하게 되어있습니다.
첫째, EgovLoginController.actionSecurityLogin()을 통해 입력한 패스워드 값을 sha-256로 인코딩하여 디비상에 저장된 패스워드와 값을 비교
둘째, 스프링 시큐리티 내에서 검증하는 것으로 ProviderManager 내에서 authenticate부분 내에 검증하는 부분이 있습니다.
context-security.xml 파일내 hash 값 설정을 바꾸실 경우 에러가 발생되는 부분은 여기의 부분으로 사료됩니다.
원인은 스프링 시큐리티 내에서 검증시 내부에서도 입력된 패스워드와 userDetails내의 패스워드의 값을 비교를 진행하는데, userDetails내의 패스워드를 설정된 hash값으로 한번 더 인코딩하여 값을 비교하기 때문에, 패스워드가 같지 않아 통과가 되지 않고 에러가 발생하게 됩니다.
따라서 hash값을 변경하여 사용하실 경우 EgovUserDetails 내의 password값을 세팅할 때 해당 값을 평문에서 sha-256으로 인코딩하여 입력하시면 됩니다.간소화기능을 사용하시는 경우 간소화 기능내의 "jdbcMapClass" 속성에서 지정된 클래스내에 UserDetails을 설정하는 부분에서 패스워드 값을 수정하시면 됩니다.
ex1) 템플릿 기준으로
egovframework.let.uat.uia.service.impl.EgovSessionMapping클래스의 mapRow() 메소드 내부에 return 부분인
>> return new EgovUserDetails(strUserId, strPassWord, strEnabled, loginVO); 내의 인자 strPassWord를 인코딩하여 전달
ex2) 인코딩 방법
String enpassword = EgovFileScrty.encryptPassword(strPassWord, ""); //해당 메소드는 SHA-256 인코딩 방식 적용)
...
return new EgovUserDetails(strUserId, enpassword, strEnabled, loginVO);
참조1)
ProviderManager.authenticate(authentication)
> AbstractUserDetailsAuthenticationProvider.(Authentication authentication) 내의
additionalAuthenticationChecks(user, (UsernamePasswordAuthenticationToken) authentication); 부분 [UsernamePasswordAuthenticationToken 체크]
> DaoAuthenticationProvider.additionalAuthenticationChecks(UserDetails userDetails,UsernamePasswordAuthenticationToken authentication) 내의
조건문(해당 부분에서 userDetails내의 패스워드와 전달된 패스워드 비교)
if (!passwordEncoder.isPasswordValid(userDetails.getPassword(), presentedPassword, salt)) {
> org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder 클래스의
isPasswordValid(String encPass, String rawPass, Object salt) 메소드로 패스워드 검증
참조2) 프레임워크에서는 시큐리티 사용 시 j_password값을 실제 패스워드로 사용하지 않고, UniqID값을 사용합니다.(ex)resultVO.getUniqId())
ex) 템플릿 기준 EgovLoginController.actionSecurityLogin() 참조
질문3)
//직접적인 관계는 있지 않으며, 저희가 plaintext로 설정하여 제공해 드리는 방법의 경우 사용자가 시큐리티 설정을 직접적으로 건드리지 않고 사용할 수 있도록 제공하는 부분입니다.
질문4)
// 현재까지 보안상의 큰 이슈는 없습니다.
감사합니다.
p.s. 외부링크 내용을 참조하시길 바랍니다.
http://zgundam.tistory.com/54