diff --git a/src/main/java/com/kamco/cd/kamcoback/common/utils/FIleChecker.java b/src/main/java/com/kamco/cd/kamcoback/common/utils/FIleChecker.java new file mode 100644 index 00000000..e36f2edd --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/common/utils/FIleChecker.java @@ -0,0 +1,67 @@ +package com.kamco.cd.kamcoback.common.utils; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class FIleChecker { + + public static boolean isValidFile(String pathStr) { + + Path path = Paths.get(pathStr); + + if (!Files.exists(path)) { + return false; + } + + if (!Files.isRegularFile(path)) { + return false; + } + + if (!Files.isReadable(path)) { + return false; + } + + try { + if (Files.size(path) <= 0) { + return false; + } + } catch (IOException e) { + return false; + } + + return true; + } + + + public static boolean verifyFileIntegrity(Path path, String expectedHash) + throws IOException, NoSuchAlgorithmException { + + // 1. 알고리즘 선택 (SHA-256 권장, MD5는 보안상 비추천) + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + + try (InputStream fis = Files.newInputStream(path)) { + byte[] buffer = new byte[8192]; // 8KB 버퍼 + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + digest.update(buffer, 0, bytesRead); + } + } + + // 3. 계산된 바이트 배열을 16진수 문자열로 변환 + StringBuilder sb = new StringBuilder(); + for (byte b : digest.digest()) { + sb.append(String.format("%02x", b)); + } + String actualHash = sb.toString(); + + return actualHash.equalsIgnoreCase(expectedHash); + } + +}