본문 바로가기
Java

[JAVA] poi에서 암호화 추가에 따른 버전 업그레이드(SXSSF)

by 콧등치기국수 2023. 9. 23.

엑셀 파일을 다운로드할 때 관리자가 암호를 설정하여 암호화된 엑셀 파일을 다운로드받고 싶다는 요청이 들어왔다.

현재 엑셀 다운로드 모듈에서는 SXSSF방식을 사용하고 그에 따라 .xlsx 형식을 파일을 생성한다. 

.xlsx 은 바이너리 포맷이 아닌 xml 포맷이라서 그에 맞는 암호화 방식을 사용해줘야 하기 때문에

새로 코드를 작성해야 했다. 

 

SXSSF는 아래 [이미지 1] 에서 보이는 XSSF와 동일선상이므로 표에서 Yes로 보이는 방식을 사용해주면 된다.

[이미지 1] 암호화 방식

아래 [이미지 2]가 암호화 코드다. 코드가 길고 복잡할까 싶었는데 의외로 단순하다.

rc4방식은 취약점이 있고 찾아보니 대부분 agile encryption 방식을 사용하는 것 같아 적용해 보았다.

[이미지 2] xml based format 암호화 방식

 

"아무 문제 없겠지" 란 마음으로 복붙했는데 현재 프로젝트에 있는 poi 에는 암호화에 필수적인 EncryptionMode(enum)과 Encryptor (클래스)가 없었다... 현재 poi 버전의 소스코드를 보니 진짜로 없었다ㅠㅠ

[이미지 3] 클래스, enum 없음
[이미지 4] EncryptionInfo 클래스만 있는 모습

 

그래서 위험 부담이 있지만 어쩔 수 없이 버전 업그레이드를 하기로 했다.

poi 버전을 변경하고 싶은데 SXSSF 를 사용하는 경우 꽤 많은 의존성이 필요하기 때문에 poi.jar 하나만 변경하는 게 아니라 관련된 lib를 다 변경해줘야 한다.

 

poi-**.jar

poi-ooxml-**.jar

poi-ooxml-schemas-**.jar

poi-scratchpad-**.jar

poi-exmaples-**.jar

poi-excelant-**.jar

commons-collecrtions4-4.1jar

 

이렇게 총 7개의 라이브러리를 새롭게 추가해주면 된다.

SXSSF 에 필요한 암호화에 필요한 클래스 등은 3.16 버전부터 쓸 수 있는 것 같아 버전을 선택한 후 해당 버전의 라이브러리에 대해 소스코드를 통해 존재 여부를 정확히 보고 변경해줬다.

[이미지 5] 3.16에는 있다 (참고.2)

 

이제 암호화만 하면 끝나는 줄 알았더니 deprecated된 것들이 너무 많아서 다 변경하고 테스트해야했다...

이에 관한 내용도 길지 않고, 현재 이 글도 길지 않지만

변경사항들은 일단 노션에 작성해두고 다음 글로 정리할 예정이다.

 

 

 

 

참고

1. https://devdoc.net/apache/poi-3.13/encryption.html 

2. https://jar-download.com/artifacts/org.apache.poi/poi/3.16/source-code

 

'Java' 카테고리의 다른 글

[java.lang.ClassNotFoundException] 오류 해결  (0) 2022.09.09
JVM 이란?  (0) 2022.04.04
[Java] 예외처리  (0) 2021.05.25