File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
2024-11-14
File name
Commit message
Commit date
File name
Commit message
Commit date
package itn.let.utl.sim.service;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.security.MessageDigest;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Base64인코딩/디코딩 방식을 이용한 데이터를 암호화/복호화하는 Business Interface class
* @author 공통서비스개발팀 박지욱
* @since 2009.01.19
* @version 1.0
* @see
*
* <pre>
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2009.01.19 박지욱 최초 생성
* 2011.08.31 JJY 경량환경 템플릿 커스터마이징버전 생성
*
* </pre>
*/
public class EgovFileScrty {
private static final Logger LOGGER = LoggerFactory.getLogger(EgovFileScrty.class);
// 파일구분자
static final char FILE_SEPARATOR = File.separatorChar;
// 버퍼사이즈
static final int BUFFER_SIZE = 1024;
/**
* 파일을 암호화하는 기능
*
* @param String source 암호화할 파일
* @param String target 암호화된 파일
* @return boolean result 암호화여부 True/False
* @exception Exception
*/
public static boolean encryptFile(String source, String target) throws Exception {
// 암호화 여부
boolean result = false;
String sourceFile = source.replace('\\', FILE_SEPARATOR).replace('/', FILE_SEPARATOR);
String targetFile = target.replace('\\', FILE_SEPARATOR).replace('/', FILE_SEPARATOR);
File srcFile = new File(sourceFile);
BufferedInputStream input = null;
BufferedOutputStream output = null;
byte[] buffer = new byte[BUFFER_SIZE];
try {
if (srcFile.exists() && srcFile.isFile()) {
input = new BufferedInputStream(new FileInputStream(srcFile));
output = new BufferedOutputStream(new FileOutputStream(targetFile));
int length = 0;
while ((length = input.read(buffer)) >= 0) {
byte[] data = new byte[length];
System.arraycopy(buffer, 0, data, 0, length);
output.write(encodeBinary(data).getBytes());
output.write(System.getProperty("line.separator").getBytes());
}
result = true;
}
} finally {
if (input != null) {
try {
input.close();
} catch (Exception ignore) {
LOGGER.debug("IGNORE: {}", ignore);
}
}
if (output != null) {
try {
output.close();
} catch (Exception ignore) {
LOGGER.debug("IGNORE: {}", ignore);
}
}
}
return result;
}
/**
* 파일을 복호화하는 기능
*
* @param String source 복호화할 파일
* @param String target 복호화된 파일
* @return boolean result 복호화여부 True/False
* @exception Exception
*/
public static boolean decryptFile(String source, String target) throws Exception {
// 복호화 여부
boolean result = false;
String sourceFile = source.replace('\\', FILE_SEPARATOR).replace('/', FILE_SEPARATOR);
String targetFile = target.replace('\\', FILE_SEPARATOR).replace('/', FILE_SEPARATOR);
File srcFile = new File(sourceFile);
BufferedReader input = null;
BufferedOutputStream output = null;
//byte[] buffer = new byte[BUFFER_SIZE];
String line = null;
try {
if (srcFile.exists() && srcFile.isFile()) {
input = new BufferedReader(new InputStreamReader(new FileInputStream(srcFile)));
output = new BufferedOutputStream(new FileOutputStream(targetFile));
while ((line = input.readLine()) != null) {
byte[] data = line.getBytes();
output.write(decodeBinary(new String(data)));
}
result = true;
}
} finally {
if (input != null) {
try {
input.close();
} catch (Exception ignore) {
LOGGER.debug("IGNORE: {}", ignore);
}
}
if (output != null) {
try {
output.close();
} catch (Exception ignore) {
LOGGER.debug("IGNORE: {}", ignore);
}
}
}
return result;
}
/**
* 데이터를 암호화하는 기능
*
* @param byte[] data 암호화할 데이터
* @return String result 암호화된 데이터
* @exception Exception
*/
public static String encodeBinary(byte[] data) throws Exception {
if (data == null) {
return "";
}
return new String(Base64.encodeBase64(data));
}
/**
* 데이터를 암호화하는 기능
*
* @param String data 암호화할 데이터
* @return String result 암호화된 데이터
* @exception Exception
*/
public static String encode(String data) throws Exception {
return encodeBinary(data.getBytes());
}
/**
* 데이터를 복호화하는 기능
*
* @param String data 복호화할 데이터
* @return String result 복호화된 데이터
* @exception Exception
*/
public static byte[] decodeBinary(String data) throws Exception {
return Base64.decodeBase64(data.getBytes());
}
/**
* 데이터를 복호화하는 기능
*
* @param String data 복호화할 데이터
* @return String result 복호화된 데이터
* @exception Exception
*/
public static String decode(String data) throws Exception {
return new String(decodeBinary(data));
}
/**
* 비밀번호를 암호화하는 기능(복호화가 되면 안되므로 SHA-256 인코딩 방식 적용).
*
* deprecated : 보안 강화를 위하여 salt로 ID를 지정하는 encryptPassword(password, id) 사용
*
* @param String data 암호화할 비밀번호
* @return String result 암호화된 비밀번호
* @exception Exception
*/
@Deprecated
public static String encryptPassword(String data) throws Exception {
if (data == null) {
return "";
}
byte[] plainText = null; // 평문
byte[] hashValue = null; // 해쉬값
plainText = data.getBytes();
MessageDigest md = MessageDigest.getInstance("SHA-256");
// 변경 시 기존 hash 값에 검증 불가.. => deprecated 시키고 유지
/*
// Random 방식의 salt 추가
SecureRandom ng = new SecureRandom();
byte[] randomBytes = new byte[16];
ng.nextBytes(randomBytes);
md.reset();
md.update(randomBytes);
*/
hashValue = md.digest(plainText);
/*
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(hashValue);
*/
return new String(Base64.encodeBase64(hashValue));
}
/**
* 비밀번호를 암호화하는 기능(복호화가 되면 안되므로 SHA-256 인코딩 방식 적용)
*
* @param password 암호화될 패스워드
* @param id salt로 사용될 사용자 ID 지정
* @return
* @throws Exception
*/
public static String encryptPassword(String password, String id) throws Exception {
if (password == null) {
return "";
}
byte[] hashValue = null; // 해쉬값
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.reset();
md.update(id.getBytes());
hashValue = md.digest(password.getBytes());
return new String(Base64.encodeBase64(hashValue));
}
/**
* 비밀번호를 암호화하는 기능(복호화가 되면 안되므로 SHA-256 인코딩 방식 적용)
* @param data 암호화할 비밀번호
* @param salt Salt
* @return 암호화된 비밀번호
* @throws Exception
*/
public static String encryptPassword(String data, byte[] salt) throws Exception {
if (data == null) {
return "";
}
byte[] hashValue = null; // 해쉬값
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.reset();
md.update(salt);
hashValue = md.digest(data.getBytes());
return new String(Base64.encodeBase64(hashValue));
}
/**
* 비밀번호를 암호화된 패스워드 검증(salt가 사용된 경우만 적용).
*
* @param data 원 패스워드
* @param encoded 해쉬처리된 패스워드(Base64 인코딩)
* @return
* @throws Exception
*/
public static boolean checkPassword(String data, String encoded, byte[] salt) throws Exception {
byte[] hashValue = null; // 해쉬값
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.reset();
md.update(salt);
hashValue = md.digest(data.getBytes());
return MessageDigest.isEqual(hashValue, Base64.decodeBase64(encoded.getBytes()));
}
}