[java] Jasypt를 활용한 자바 애플리케이션에서의 암호화된 파일 전송 방법

암호화된 파일을 안전하게 전송하려면 Jasypt 라이브러리를 활용할 수 있습니다. Jasypt는 자바로 암호화와 복호화 기능을 제공하는 간단하고 강력한 도구입니다. 이 블로그 포스트에서는 Jasypt를 사용하여 자바 애플리케이션에서 암호화된 파일을 전송하는 방법에 대해 알아보겠습니다.

Jasypt 라이브러리 추가

먼저, Jasypt를 사용하기 위해 프로젝트에 해당 라이브러리를 추가해야 합니다. 다음 Maven 의존성을 사용하여 Jasypt를 프로젝트에 추가할 수 있습니다.

<dependency>
    <groupId>org.jasypt</groupId>
    <artifactId>jasypt</artifactId>
    <version>1.9.3</version>
</dependency>

이렇게 추가하면 Jasypt를 사용할 준비가 끝납니다.

파일 암호화

암호화된 파일을 생성하기 위해서는 암호화 알고리즘과 비밀키가 필요합니다. 아래의 코드는 Jasypt를 사용하여 파일을 암호화하는 방법을 보여줍니다.

import org.jasypt.util.text.BasicTextEncryptor;

public class FileEncryptionUtils {

    private static final String SECRET_KEY = "mySecretKey"; // 암호화에 사용할 비밀키
    
    public static void encryptFile(String inputFilePath, String outputFilePath) {
        BasicTextEncryptor encryptor = new BasicTextEncryptor();
        encryptor.setPassword(SECRET_KEY);

        try (FileInputStream inputFile = new FileInputStream(inputFilePath);
             FileOutputStream outputFile = new FileOutputStream(outputFilePath)) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputFile.read(buffer)) != -1) {
                byte[] encryptedBytes = encryptor.encrypt(buffer.toString()).getBytes();
                outputFile.write(encryptedBytes, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위의 코드에서 inputFilePath는 암호화할 파일의 경로를 나타내고, outputFilePath는 암호화된 파일의 저장 경로를 나타냅니다. SECRET_KEY 변수에는 암호화에 사용할 비밀키를 설정해야 합니다.

파일 전송

이제 암호화된 파일을 안전하게 전송해야 합니다. 파일 전송에는 여러 가지 방법이 있지만, 여기서는 SFTP(Secure File Transfer Protocol)를 사용하는 방법을 알아보겠습니다.

import com.jcraft.jsch.*;

public class FileTransferUtils {

    private static final String SFTP_HOST = "sftp.example.com"; // SFTP 호스트
    private static final int SFTP_PORT = 22; // SFTP 포트
    private static final String SFTP_USERNAME = "username"; // SFTP 계정
    private static final String SFTP_PASSWORD = "password"; // SFTP 비밀번호
    
    public static void transferFile(String inputFilePath, String outputFilePath) {
        JSch jsch = new JSch();
        Session session = null;
        ChannelSftp channelSftp = null;

        try {
            session = jsch.getSession(SFTP_USERNAME, SFTP_HOST, SFTP_PORT);
            session.setPassword(SFTP_PASSWORD);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();

            channelSftp = (ChannelSftp) session.openChannel("sftp");
            channelSftp.connect();

            channelSftp.put(inputFilePath, outputFilePath);
        } catch (JSchException | SftpException e) {
            e.printStackTrace();
        } finally {
            if (channelSftp != null) {
                channelSftp.exit();
            }
            if (session != null) {
                session.disconnect();
            }
        }
    }
}

위의 코드에서 inputFilePath는 암호화된 파일의 경로, outputFilePath는 전송할 파일의 저장 경로를 나타냅니다. SFTP_HOST, SFTP_PORT, SFTP_USERNAME, SFTP_PASSWORD는 각각 SFTP 서버의 호스트, 포트, 계정, 비밀번호를 나타냅니다.

완성된 코드

아래의 코드는 앞서 소개한 파일 암호화 및 전송 기능을 하나의 클래스로 묶은 완성된 코드입니다.

public class FileSecurityUtils {

    private static final String SECRET_KEY = "mySecretKey"; // 암호화에 사용할 비밀키
    private static final String SFTP_HOST = "sftp.example.com"; // SFTP 호스트
    private static final int SFTP_PORT = 22; // SFTP 포트
    private static final String SFTP_USERNAME = "username"; // SFTP 계정
    private static final String SFTP_PASSWORD = "password"; // SFTP 비밀번호
    
    public void encryptAndTransferFile(String inputFilePath, String outputFilePath) {
        BasicTextEncryptor encryptor = new BasicTextEncryptor();
        encryptor.setPassword(SECRET_KEY);

        try (FileInputStream inputFile = new FileInputStream(inputFilePath);
             FileOutputStream outputFile = new FileOutputStream(outputFilePath)) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputFile.read(buffer)) != -1) {
                byte[] encryptedBytes = encryptor.encrypt(buffer.toString()).getBytes();
                outputFile.write(encryptedBytes, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        JSch jsch = new JSch();
        Session session = null;
        ChannelSftp channelSftp = null;

        try {
            session = jsch.getSession(SFTP_USERNAME, SFTP_HOST, SFTP_PORT);
            session.setPassword(SFTP_PASSWORD);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();

            channelSftp = (ChannelSftp) session.openChannel("sftp");
            channelSftp.connect();

            channelSftp.put(inputFilePath, outputFilePath);
        } catch (JSchException | SftpException e) {
            e.printStackTrace();
        } finally {
            if (channelSftp != null) {
                channelSftp.exit();
            }
            if (session != null) {
                session.disconnect();
            }
        }
    }
}

이제 위의 코드를 사용하여 암호화된 파일을 안전하게 전송할 수 있습니다.

Jasypt의 강력한 암호화 기능을 활용하면 자바 애플리케이션에서 파일을 안전하게 전송할 수 있습니다. 파일 암호화와 SFTP를 이용한 파일 전송 기능을 조합하면 보안적인 측면에서 안전한 파일 전송이 가능해집니다. Jasypt와 SFTP를 활용하여 데이터 보안을 강화하세요.

참고 문서: