Seeeni Tech Diary

[Java][BE] Bcrypt로 비밀번호 암호화 하기(feat. 쌩자바 백엔드) 본문

컴퓨터 언어/Java

[Java][BE] Bcrypt로 비밀번호 암호화 하기(feat. 쌩자바 백엔드)

seyeon0207 2024. 4. 8. 00:04

스프링없이 백엔드를 구현하라는 지시를 받아서 요즘 계속 쌩자바로만 백엔드를 구현하고 있다. 저번 프로젝트 기간동안 로그인 기능을 구현했었는데, 그때는 회원가입을 하면 입력한 회원정보가 단순히 데이터 베이스에 저장되는 것이었다. 사실 이렇게 하면 보안에 매우 취약하므로 비밀번호 암호화를 해주어야 한다. 그래서 BCrypt를 사용하여 암호화한 비밀번호를 데이터 베이스에 저장해주었다.

1. BCrypt

bcrypt는 블로피시 암호에 기반을 둔 암호화 해시 함수다. Bcrypt는 패스워드를 해싱할 때 내부적으로 랜덤한 솔트를 생성한다고 한다. 이때 만든 문자열의 길이는 60이다.

그래서 가장 먼저 암호화된 문자열을 그대로 저장할 수 있도록 테이블의 password 의 최대 길이를 70으로 설정해주었다.

2. pom.xml

Bcrypt를 프로젝트에서 사용하려면, dependency를 추가해주어야 한다. 이때 추가해야할 부분은 아래의 사이트를 접속하여 찾을 수 있다.

https://mvnrepository.com/

maven repository 관련한 정보를 볼 수 있는 해당 사이트에서 JBCrypt를 검색하면 된다.

 

한 번도 공격받지 않은 0.4버전을 들어가서 maven에서 아래 코드를 카피할 수 있다.

<!-- https://mvnrepository.com/artifact/org.mindrot/jbcrypt -->
<dependency>
    <groupId>org.mindrot</groupId>
    <artifactId>jbcrypt</artifactId>
    <version>0.4</version>
</dependency>

이 코드를 그대로 pom.xml의 dependencies 에 추가하면 된다.

 

 

3. 회원가입 (join)

@Override
public boolean join(Member member) {
    String encryptPassword = BCrypt.hashpw(member.getUserPassword(), BCrypt.gensalt());
    member.setUserPassword(encryptPassword);
    return dao.join(member);
}

 

기존의 신규 멤버가 입력한 비밀번호를 Bcrypt.hashpw 메소드를 사용하여 암호화한 문자열로 바꿀 수 있다.

이것을 그대로 다시 멤버의 비밀번호로 셋팅해주고 기존의 가입 메소드를 사용하였다.

 

 

4. 로그인(login)

@Override
public boolean login(String userId, String userPassword) throws Exception {
    Member member = dao.loginCheck(userId);

    if (BCrypt.checkpw(userPassword, member.getUserPassword()))
        return true;

    return false;
}

 

로그인 시 아이디와 비밀번호를 입력받고, Bcrypt.checkpw메소드로 직접 우리가 복호화하는 작업 없이 메소드만을 이용해 저장된 패스워드와 일치하는 지를 확인할 수 있다.

 

이를 이용해 update까지 진행해주었다.

'컴퓨터 언어 > Java' 카테고리의 다른 글

[Java][BE] MVC 패턴 구현  (3) 2024.03.24
[Java] 추상 클래스 & 인터페이스  (0) 2024.02.18
Comments