SW/Java

Java : ZIP 파일 추출 및 암호 보호 제거 방법

얇은생각 2023. 9. 8. 07:30
반응형

두 개의 API를 사용하여 실행 준비가 된 Java 코드 예제를 사용하여 Java에서 ZIP 파일 추출을 자동화하는 방법에 대해 알아봅니다.

ZIP 파일을 만드는 것은 설계상 간단하고 매우 직관적인 과정입니다. 주요 운영 체제(Windows, Linux, Mac )의 사용자는 부피가 큰 파일로 가득한 수많은 폴더를 몇 번의 클릭만으로 결합할 수 있으므로 문서 묶음을 즉시 관리 가능한 압축 보관소로 줄일 수 있으므로 해당 내용을 저장하고 공유하는 부담이 훨씬 줄어듭니다. ZIP 파일을 여는 것도 마찬가지로 쉽습니다. ZIP 파일을 다운받는 다운스트림 수신자는 파일의 내용을 다운로드하여 추출(또는 압축 해제)하면 안에 포함된 내용에 액세스할 수 있습니다. 암호 보호는 금상첨화입니다. 누구나 개인화된 암호로 ZIP 보관소를 신속하게 보호할 수 있으므로 정확한 권한을 가진 사용자만 보관소의 내용에 액세스할 수 있습니다.

이러한 사용 편의성 덕분에 .zip은 제한된 파일 공유 시나리오와 대규모 파일 공유 시나리오 모두에서 매우 일반적인 솔루션이 되었습니다. 한 사람은 동료와 공유해야 하는 10개의 파일로 단일 ZIP 아카이브를 만들 수 있고, 다른 사람은 각 파일에 여러 계층의 디렉토리가 있는 수백 개의 파일이 포함된 수십 개의 ZIP 파일을 만들 수 있습니다. 

전자의 경우 수동으로 ZIP 파일을 다운로드하고 열고 액세스하는 것이 상당히 효율적입니다. 결국 이는 제한된 사용 사례일 뿐이며 단일 ZIP 아카이브를 다운로드하고 추출(또는 단순히 저장)하는 데 걸리는 몇 초가 다른 작업에 대한 부담이나 방해가 되지 않습니다. 그러나 후자의 경우에는 더 복잡한 문제가 있습니다. ZIP 파일 공유를 포함한 모든 종류의 대규모 파일 공유는 즉시 수동 파일 처리의 효율성을 떨어 뜨립니다. 게다가 이러한 파일의 특정 조직이 더 큰 역할을 하기 시작합니다. 넓은 ZIP 아카이브에는 종종 해당 정보를 보낸 사람과 관련된 계층을 기반으로 구성되고 수신자와 반드시 관련되지 않은 내부 디렉토리와 하위 디렉토리가 포함됩니다. 예를 들어, ZIP 아카이브가 별도의 스토리지 액세스 권한을 가진 여러 개별 이해 관계자와 관련된 디렉토리를 포함하여 공유되면 각 파일을 새 집으로 보내는 과정이 부담이 됩니다. 파일을 추출, 전환 및 저장(또는 새 아카이브로 다시 압축)해야 하며 이는 재생 중인 압축 파일의 볼륨을 고려할 때 상당한 시간이 걸릴 수 있습니다.

다행히 ZIP 아카이브 내에서 실행되는 간단한 디렉토리 계층을 고려할 때 API 자동화는 이러한 파일을 대용량으로 처리할 수 있는 훌륭한 솔루션입니다. ZIP 파일의 내용을 프로그래밍 방식으로 열고, 추출하고, 전환하는 것은 매우 간단합니다. ZIP 파일이 처리되고 API 응답을 통해 해당 내용이 노출되면 개발자는 스크립트를 생성하여 특정 하위 디렉토리나 파일 인코딩을 보낼 위치를 사용자 정의할 수 있습니다. 이러한 압축 해제된 내용은 올바른 대상에 빠르게 도달하여 수신자와 더 관련이 있는 새 아카이브에 수동으로(또는 프로그래밍 방식으로) 다시 압축될 수 있습니다.

 

 

Java : ZIP 파일 추출 및 암호 보호 제거 방법

 

 

시연

이 글에서는 ZIP 아카이브의 내용을 프로그래밍적으로 추출하는 데 사용할 수 있는 두 가지 API를 강조하겠습니다. API 모두 자유 계층 Cloudmersive API 키로 무료(월 최대 800개의 API 호출)로 사용할 수 있으며, 페이지 아래에 제공된 실행 준비가 완료된 Java 코드 예제를 사용하여 쉽게 구현할 수 있습니다.

이 두 API 중 첫 번째 API는 일반 ZIP 아카이브(활성 암호화 또는 암호 보호가 없는 파일)를 추출하고 압축을 풀도록 설계되었습니다. API의 응답은 특정 디렉토리에 첨부되지 않은 "느슨한 리프" 파일부터 시작하여 입력 ZIP 파일 내에 포함된 모든 관련 디렉토리 및 문서를 디렉토리 계층과 관련하여 반환합니다. 각 파일의 이름은 해당 파일의 인코딩을 포함하는 문자열과 함께 반환되므로 위의 모든 내용을 원하는 저장 위치로 쉽게 전달할 수 있습니다. 아래에는 이 정보가 표시되는 방식을 설명하기 위해 예제 JSON 응답 모델을 포함했습니다:

{
  "Successful": true,
  "FilesInZip": [
    {
      "FileName": "string",
      "FileContents": "string"
    }
  ],
  "DirectoriesInZip": [
    {
      "DirectoryName": "string",
      "DirectoriesInDirectory": [
        null
      ],
      "FilesInDirectory": [
        {
          "FileName": "string",
          "FileContents": "string"
        }
      ]
    }
  ]
}

 

 

두 번째 API를 사용하여 활성 보안 조치가 적용된 ZIP 파일의 암호를 해독하고 암호 보호를 제거할 수 있습니다.

API를 호출하려면 입력 파일과 유효한 암호만 필요하며, 응답 본문에는 암호 보호가 제거된 복호화된 ZIP 파일 인코딩이 포함됩니다. 이 파일은 추출 및 압축 해제를 위해 앞에서 설명한 API에 의해 후속적으로 처리될 수 있습니다.

API 호출 구조화를 시작하려면 먼저 Java SDK를 설치해야 합니다. 메이븐을 사용하여 설치하려면 먼저 pom.xml의 저장소에 다음 참조를 추가하십시오:

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

 

 

그런 다음 pom.xml에 종속성에 대한 참조를 추가합니다:

<dependencies>
<dependency>
    <groupId>com.github.Cloudmersive</groupId>
    <artifactId>Cloudmersive.APIClient.Java</artifactId>
    <version>v4.25</version>
</dependency>
</dependencies>

 

Gradle을 사용하여 설치하려면 리포지토리 끝에 있는 루트 build.gradle에 추가합니다:

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}

 

그런 다음 build.gradle에 종속성을 추가합니다:

dependencies {
        implementation 'com.github.Cloudmersive:Cloudmersive.APIClient.Java:v4.25'
}

 

설치가 중단된 상태에서 다음 단계는 각 API 요청을 구조화하는 것입니다. "ZIP 보관소에서 폴더 추출, 압축 해제" 반복을 호출하려면 아래에 제공된 코드 예제에서 복사 및 붙여넣기:

// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.ZipArchiveApi;

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");

ZipArchiveApi apiInstance = new ZipArchiveApi();
File inputFile = new File("/path/to/inputfile"); // File | Input file to perform the operation on.
try {
    ZipExtractResponse result = apiInstance.zipArchiveZipExtract(inputFile);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ZipArchiveApi#zipArchiveZipExtract");
    e.printStackTrace();
}

 

"암호 해독 및 암호 제거" 반복을 호출하려면 다음 코드 예제에서 복사하여 붙여넣습니다:

// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.ZipArchiveApi;

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");

ZipArchiveApi apiInstance = new ZipArchiveApi();
File inputFile = new File("/path/to/inputfile"); // File | Input file to perform the operation on.
String zipPassword = "zipPassword_example"; // String | Required; Password for the input archive
try {
    Object result = apiInstance.zipArchiveZipDecrypt(inputFile, zipPassword);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ZipArchiveApi#zipArchiveZipDecrypt");
    e.printStackTrace();
}

 

 

API 호출을 모두 완료하는 데 필요한 코드는 여기까지입니다. ZIP 파일은 사이버 공격에서 멀웨어를 전달하거나 시스템에서 데이터를 빼내는 데 자주 사용되기 때문에 신뢰할 수 있는 소스에서 철저하게 조사된 파일의 압축을 풀기 위해서만 이러한 API를 사용해야 합니다.

반응형