[java] Apache Shiro의 암호화된 데이터 저장

Apache Shiro는 Java 애플리케이션의 보안과 인증을 처리하기 위한 강력한 라이브러리입니다. 이 블로그 포스트에서는 Apache Shiro를 사용하여 암호화된 데이터를 안전하게 저장하는 방법에 대해 알아보겠습니다.

1. 의존성 추가

먼저, Apache Shiro를 사용하기 위해 프로젝트의 의존성에 Shiro 라이브러리를 추가해야 합니다. Maven을 사용하는 경우, pom.xml 파일에 다음과 같이 의존성을 추가합니다.

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.7.1</version>
</dependency>

Gradle을 사용하는 경우, build.gradle 파일에 다음과 같이 추가합니다.

dependencies {
    implementation 'org.apache.shiro:shiro-core:1.7.1'
}

2. 데이터 암호화

Apache Shiro는 암호화 및 해독을 위한 다양한 알고리즘을 지원합니다. 여기에서는 가장 일반적으로 사용되는 AES(Advanced Encryption Standard) 알고리즘을 사용하여 데이터를 암호화하는 방법을 살펴보겠습니다.

import org.apache.shiro.crypto.AesCipherService;
import org.apache.shiro.crypto.CipherService;
import org.apache.shiro.util.ByteSource;

public class EncryptionUtils {

    private static final String AES_SECRET_KEY = "yourSecretKey";

    public static String encrypt(String data) {
        CipherService cipherService = new AesCipherService();
        cipherService.setKeySize(128); // 사용할 키 크기를 설정하여 보안 수준을 조절할 수 있습니다.

        ByteSource encryptedData = cipherService.encrypt(data.getBytes(), AES_SECRET_KEY.getBytes());
        return encryptedData.toBase64(); // 결과를 Base64 형식으로 반환합니다.
    }

    public static String decrypt(String encryptedData) {
        CipherService cipherService = new AesCipherService();
        cipherService.setKeySize(128);

        ByteSource decryptedData = cipherService.decrypt(ByteSource.Util.bytes(encryptedData), AES_SECRET_KEY.getBytes());
        return new String(decryptedData.getBytes());
    }
}

위의 예제 코드에서는 EncryptionUtils 클래스를 만들어 암호화 및 해독 기능을 구현했습니다. encrypt 메소드는 주어진 데이터를 AES 알고리즘으로 암호화하여 Base64 형식으로 반환하고, decrypt 메소드는 암호화된 데이터를 해독하여 원본 데이터를 반환합니다.

3. 데이터 저장하기

이제 암호화된 데이터를 안전하게 저장하는 방법을 알아보겠습니다. 보통 데이터베이스에 암호화된 데이터를 저장하는 경우가 많으므로, 여기에서는 MySQL 데이터베이스를 예시로 사용하겠습니다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DataStorage {

    private static final String DB_URL = "jdbc:mysql://localhost:3306/mydatabase";
    private static final String DB_USERNAME = "username";
    private static final String DB_PASSWORD = "password";

    public void saveEncryptedData(String encryptedData) {
        try (Connection conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD)) {
            String insertQuery = "INSERT INTO encrypted_data (data) VALUES (?)";
            PreparedStatement statement = conn.prepareStatement(insertQuery);
            statement.setString(1, encryptedData);
            statement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

위의 예제 코드에서는 DataStorage 클래스를 만들어 saveEncryptedData 메소드를 구현했습니다. 이 메소드는 주어진 암호화된 데이터를 데이터베이스의 encrypted_data 테이블에 저장합니다.

결론

이렇게 Apache Shiro를 사용하여 암호화된 데이터를 안전하게 저장하는 방법을 살펴보았습니다. 데이터의 보안이 중요한 애플리케이션에서는 반드시 암호화를 고려해야 하며, Apache Shiro는 이를 간단하고 효과적으로 수행할 수 있는 도구입니다.

더 많은 정보를 원하시면 Apache Shiro 공식 문서를 참조해주세요.