Java 프레임워크 만들기 - JSP

자바 데이터베이스 매니저 패스워드 암호화 2 - Java Database Manager Password Encryption SHA-256 + Salt, 이클립스(Eclipse)

carrotweb 2021. 6. 13. 19:38
728x90
반응형

이전 "자바 어노테이션으로 데이터 액세스 객체 만들기"를 통해 로그인 관련 Controller, Service, DAO를 만들었습니다. 이번에는 암호화 메소드를 이용하여 데이터베이스의 사용자 패스워드를 암호화하여 적용 처리하겠습니다.

데이터베이스의 사용자 로그인 테이블("MBR_ACCOUNT_TB")의 패스워드 필드("MBR_PWD")가 암호화되어 잊지 않고 패스워드 솔트 필드("MBR_PWD_SALT")가 비어있습니다. 이전에 만든 암호화 메소드를 이용하여 패스워드 필드("MBR_PWD")와 솔트 필드("MBR_PWD_SALT")에 암호화된 정보를 적용하겠습니다.

디비버 데이터베이스 테이블 생성(https://carrotweb.tistory.com/72)를 참조하세요.

3. "TestLoginService.java"의 "doLogin"메소드에 사용자가 입력한 패스워드를 암호화 해시 알고리즘인 SHA-256과 Salt(솔트)를 이용해서 암호화합니다.

"KeyGenerateUtil.java"의 "getSalt()"메소드를 이용하여 Salt(솔트)를 생성합니다.

String salt = KeyGenerateUtil.getSalt();

"MessageDigestHelper.java"의 "getSHA256AsBase64()"메소드를 이용하여 사용자가 입력한 패스워드와 Salt(솔트), 암호화 반복 횟수로 암호화합니다.

String encryptionPassword = MessageDigestHelper.getSHA256AsBase64(userPassword, salt, 10);

Salt(솔트)와 암호화된 패스워드를 출력합니다.

System.out.println("salt : " + salt + ", encryptionPassword : " + encryptionPassword);

 

4. "Servers"탭에서 "tomcat8"를 선택하고 "start"버튼(start the server)을 클릭합니다. 웹 브라우저에서 "http://localhost:8080/test2/testform.do"를 입력합니다. 아이디에는 "testid"를 패스워드에는 "testpwd"를 입력하고 "로그인"버튼을 클릭합니다.

"Console"탭을 보면 Salt(솔트)와 암호화된 패스워드(encryptionPassword)가 출력됩니다.

[Console]

id : testid, password : testpwd
salt : 84ebf8ab23c440a8a7cfa895f5a545f5, encryptionPassword : Ti7Fm5LAk+aDnhB2BsrzINyW4c61perNa7NWLuFb2iM=

 

5. 디비버(DBeaver) 툴을 실행하여 사용자 로그인 테이블("MBR_ACCOUNT_TB")의 패스워드 필드("MBR_PWD")와 패스워드 솔트 필드("MBR_PWD_SALT")를 출력된 정보로 입력하고 "Save"버튼을 클릭하여 업데이트합니다.

또는 "Script"버튼을 클릭하면 생성된 쿼리문를 확인할 수 있고 "Persist"버튼을 통해 실행할 수 있습니다.

--  Auto-generated SQL script #202106121730
UPDATE test.MBR_ACCOUNT_TB
	SET MBR_PWD_SALT='84ebf8ab23c440a8a7cfa895f5a545f5',MBR_PWD='Ti7Fm5LAk+aDnhB2BsrzINyW4c61perNa7NWLuFb2iM='
	WHERE MBR_SEQ=1;

 

암호화된 정보를 얻어 업데이트하였으니 주석처리합니다.

//String salt = KeyGenerateUtil.getSalt();
//String encryptionPassword = MessageDigestHelper.getSHA256AsBase64(userPassword, slat, 10);
//System.out.println("salt : " + salt + ", encryptionPassword : " + encryptionPassword);

 

 

6. 데이터베이스로 부터 쿼리해온 사용자 정보에서

UserVO selectUserVO = testLoginDao.selectMember(userVO);

패스워드 솔트 필드("MBR_PWD_SALT")를 가져와 사용자가 입려한 패스워드를 암호화합니다.

String salt = selectUserVO.getPasswordSalt();
String encryptionPassword = MessageDigestHelper.getSHA256AsBase64(userVO.getPassword(), salt, 10);

기존의 사용자 아이디와 패스워드를 비교한 부분은 주석처리하고

//if (selectUserVO.getId().equals(userVO.getId()) && selectUserVO.getPassword().equals(userVO.getPassword())) {

암화된 패스워드로 비교하게 수정합니다.

if (selectUserVO.getId().equals(userVO.getId()) && selectUserVO.getPassword().equals(encryptionPassword)) {

정상적으로 작동하는지 출력합니다.

System.out.println("input password : " + userPassword + ", salt : " + salt + ", encryptionPassword : " + encryptionPassword);
System.out.println("selectUser password : " + selectUserVO.getPassword());

 

7. 다시 "Servers"탭에서 "tomcat8"를 선택하고 "start"버튼(start the server)을 클릭합니다. 웹 브라우저에서 "http://localhost:8080/test2/testform.do"를 입력합니다. 아이디에는 "testid"를 패스워드에는 "testpwd"를 입력하고 "로그인"버튼을 클릭합니다.

"Console"탭을 보면 입력된 사용자 패스워가 암호화되고 데이터베이스로부터 쿼리된 사용자의 암호화된 패스워가 동일한 것을 확인할 수 있습니다.

[Console]

input password : testpwd, salt : 84ebf8ab23c440a8a7cfa895f5a545f5, encryptionPassword : Ti7Fm5LAk+aDnhB2BsrzINyW4c61perNa7NWLuFb2iM=
selectUser password : Ti7Fm5LAk+aDnhB2BsrzINyW4c61perNa7NWLuFb2iM=

 

데이터베이스의 사용자 패스워드가 암호화되어 데이터베이스 해킹 및 사용자 정보가 유출이되어도 로그인을 위한 패스워드를 유추할 수 없기 때문에 보안의 취약점이 낮아졌습니다. 물론 시스템 해킹 및 정보 유출이 되지 않게 보안 및 관리해야 합니다. 안전하고 높은 보안을 위해 데이터베이스 암호화 솔루션을 이용해 암호화해야 합니다.

728x90
반응형