확장 Spring - 외부 속성 파일 보안 (2)
상기 분석 을 통 해 저 희 는 암호 화 속성 파일 을 지원 하 는 증강 형 Property Placeholder Configurer 를 설계 합 니 다. 그 코드 는 다음 과 같 습 니 다.
코드 목록 2
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.Key;
import java.util.Properties;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.core.io.Resource;
import org.springframework.util.DefaultPropertiesPersister;
import org.springframework.util.PropertiesPersister;
public class DecryptPropertyPlaceholderConfigurer
extends PropertyPlaceholderConfigurer ...{
private Resource[] locations; //①
private Resource keyLocation; //②
public void setKeyLocation(Resource keyLocation) ...{
this.keyLocation = keyLocation;
}
public void setLocations(Resource[] locations) ...{
this.locations = locations;
}
public void loadProperties(Properties props) throws IOException ...{
if (this.locations != null) ...{
PropertiesPersister propertiesPersister = new DefaultPropertiesPersister();
for (int i = 0; i < this.locations.length; i++) ...{
Resource location = this.locations[i];
if (logger.isInfoEnabled()) ...{
logger.info("Loading properties file from " + location);
}
InputStream is = null;
try ...{
is = location.getInputStream();
//③
Key key = DESEncryptUtil.getKey(keyLocation.getInputStream());
//④
is = DESEncryptUtil.doDecrypt(key, is);
//⑤ props
if(fileEncoding != null)...{
propertiesPersister.load(props,
new InputStreamReader(is,fileEncoding));
}else...{
propertiesPersister.load(props ,is);
}
} finally ...{
if (is != null)
is.close();
}
}
}
}
}
}
locations 가 지정 한 속성 파일 흐름 데 이 터 를 추가 로 복호화 하고 복호화 한 후 props 에 불 러 옵 니 다.Property Placeholder Configurer 보다 추가 적 인 일 만 했 습 니 다. 불 러 오기 전에 속성 자원 을 복호화 합 니 다.
코드 목록 2 의 ③ 과 ④ 에서 저 희 는 DES 복호화 도구 류 를 사용 하여 암호 화 된 속성 파일 흐름 을 복호화 합 니 다.
파일 을 대칭 적 으로 암호 화 하 는 알고리즘 이 많 습 니 다. 보통 DES 대칭 암호 화 알고리즘 을 사용 합 니 다. 속도 가 빠 르 고 해결 이 어렵 기 때문에 DESEncryptUtil 은 DES 복호화 기능 을 제공 할 뿐만 아니 라 DES 암호 화 기능 도 제공 합 니 다. 속성 파일 은 배치 하기 전에 항상 암호 화 되 어야 하기 때 문 입 니 다.
코드 목록 3 암호 화 복호화 도구 클래스
public class DESEncryptUtil ...{
public static Key createKey() throws NoSuchAlgorithmException {//
Security.insertProviderAt(new com.sun.crypto.provider.SunJCE(), 1);
KeyGenerator generator = KeyGenerator.getInstance("DES");
generator.init(new SecureRandom());
Key key = generator.generateKey();
return key;
}
public static Key getKey(InputStream is) {
try ...{
ObjectInputStream ois = new ObjectInputStream(is);
return (Key) ois.readObject();
} catch (Exception e) ...{
e.printStackTrace();
throw new RuntimeException(e);
}
}
private static byte[] doEncrypt(Key key, byte[] data) {//
try {
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] raw = cipher.doFinal(data);
return raw;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static InputStream doDecrypt(Key key, InputStream in) {//
try {
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] tmpbuf = new byte[1024];
int count = 0;
while ((count = in.read(tmpbuf)) != -1) {
bout.write(tmpbuf, 0, count);
tmpbuf = new byte[1024];
}
in.close();
byte[] orgData = bout.toByteArray();
byte[] raw = cipher.doFinal(orgData);
ByteArrayInputStream bin = new ByteArrayInputStream(raw);
return bin;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static void main(String[] args) throws Exception {// Java
if (args.length == 2 && args[0].equals("key")) {//
Key key = DESEncryptUtil.createKey();
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(args[1]));
oos.writeObject(key);
oos.close();
System.out.println(" 。");
} else if (args.length == 3 && args[0].equals("encrypt")) {//
File file = new File(args[1]);
FileInputStream in = new FileInputStream(file);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] tmpbuf = new byte[1024];
int count = 0;
while ((count = in.read(tmpbuf)) != -1) {
bout.write(tmpbuf, 0, count);
tmpbuf = new byte[1024];
}
in.close();
byte[] orgData = bout.toByteArray();
Key key = getKey(new FileInputStream(args[2]));
byte[] raw = DESEncryptUtil.doEncrypt(key, orgData);
file = new File(file.getParent() + "\\en_" + file.getName());
FileOutputStream out = new FileOutputStream(file);
out.write(raw);
out.close();
System.out.println(" , :"+file.getAbsolutePath());
} else if (args.length == 3 && args[0].equals("decrypt")) {//
File file = new File(args[1]);
FileInputStream fis = new FileInputStream(file);
Key key = getKey(new FileInputStream(args[2]));
InputStream raw = DESEncryptUtil.doDecrypt(key, fis);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] tmpbuf = new byte[1024];
int count = 0;
while ((count = raw.read(tmpbuf)) != -1) {
bout.write(tmpbuf, 0, count);
tmpbuf = new byte[1024];
}
raw.close();
byte[] orgData = bout.toByteArray();
file = new File(file.getParent() + "\\rs_" + file.getName());
FileOutputStream fos = new FileOutputStream(file);
fos.write(orgData);
System.out.println(" , :"+file.getAbsolutePath());
}
}
}
복호화 작업 은 주로 두 가지 종류의 Cipher 와 Key 와 관련 이 있 습 니 다. 전 자 는 암호 화 장치 입 니 다. init () 방법 으로 작업 모드 와 키 를 설정 할 수 있 습 니 다. 여기 서 저 희 는 복호화 작업 모드 로 설정 합 니 다: Cipher. DECRYPTMODE。Cipher 는 doFinal () 방법 을 통 해 바이트 배열 을 암호 화하 거나 복호화 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.