1-3. 회원가입 - 비밀번호 암호화(Jasypt Encryption)

2021. 3. 24. 20:02프로젝트/Salle(살래) 중고거래 웹


프로젝트를 배포까지 성공시켰지만 코드 리뷰가 필요한 부분들이 남아있습니다. 이력서와 포트폴리오를 작성하면서 코드 수정도 하고 있습니다. 프로젝트를 하면서, 필요한 기능들을 빨리 찾아 적용시키고 후속 공부를 하지 않았습니다. 시간을 단축시키려구요. 그런데 기업에서 원하는 개발자 상은 문제가 생겼을 때 해당 라이브러리나 API를 깊게 공부해 내 지식으로 습득할 수 있는 사람인 것 같습니다. '학습'을 해야할 것 같습니다. 그렇다고 입사지원을 늦추거나 하진 않을 겁니다. 계속 이력서도 보완하고 학습하면서 꾸준히 문을 두드려보겠습니다.


회원가입 비밀번호 암호화


기능 : 회원가입 시 입력한 비밀번호를 암호화해 DB 저장합니다. 반대로 DB 저장된 비밀번호를 로그인 시 입력한 비밀번호와 비교해 처리해줍니다. Jasypt(Java Simplified Encryption) Encryption을 쉽게 도와주는 Java 라이브러리를 사용해주었습니다.


간단한 Encryption - Decryption 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public class JasyptEncrypt {
        String password;
 
        public JasyptEncrypt(String password) {
            this.password = password;
        }
    }
 
    @Test
    public void verifyPassword() {
        JasyptEncrypt jasyptEncrypt = new JasyptEncrypt("1234");
        BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
        textEncryptor.setPassword("test");
        String encryptPwd = textEncryptor.encrypt(jasyptEncrypt.password);
        assertNotEquals(jasyptEncrypt.password, encryptPwd);
    }
cs

 

BasicTextEncrptor : setPassword()와 setPasswordCharArray() 파라미터로 암복호화를 해줍니다. 저는 "test"로 설정했습니다. 인스턴스로 encrypt()를 실행해 암호화 해줍니다. 실제 비밀번호는 "1234"인데 테스트 해보면 encrptyPwd와 다르게 나옵니다.(정상작동 확인) 복호화는 decrypt() 메서드를 사용하면 됩니다.


프로젝트에 사용한 one-way Encrpytion 예제

1
2
3
4
5
6
7
    @Test
    public void verifyPasswordOneWayEncryption() {
        BasicPasswordEncryptor basicEncrypt = new BasicPasswordEncryptor();
        String encryptPwd = basicEncrypt.encryptPassword(jasyptEncrypt.password);
        boolean checkPwd = basicEncrypt.checkPassword(jasyptEncrypt.password, encryptPwd);
        assertTrue(checkPwd);
    }
cs

BasicPasswordEncryptor : one-way여서 복호화(decrypt)가 필요하지 않는 경우 적합합니다. DB에 비밀번호를 저장하고 로그인 시 검증할 때 굳이 복호화가 필요없습니다. BasicTextEncryptor와 달리 setPassword() 과정이 생략되었고checkPassword()를 사용해 암호화된 정보와 입력된 raw 값을 바로 검증할 수 있습니다.

 

실제 프로젝트 사용한 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    @Override
    public void insertMember(Member member) {
        String rawPwd = member.getPassword();
        String encryptedPwd = encryptor.encryptPassword(rawPwd);
        member.setPassword(encryptedPwd);
        memberMapper.insertMember(member);
    }
 
     public Login loginMember(Login login) {
    
            Member memberInfo = memberMapper.memberInfo(login.getEmail());
            boolean checkPwd = encryptor.checkPassword(memberInfo.getPassword(), login.getPassword());
                
            if (memberInfo == null) {
                throw new UnregisteredMemberException();
            } else {
                if (!checkPwd)
                    throw new IncorrectPasswordException();
       }
cs

 

참고자료 :

Baeldung - Intro to Jasypt

Baeldung - Spring boot Config, Jasypt