Мне нужно зашифровать файл при загрузке и расшифровать файл при загрузке.
Я написал логику для загрузки и скачивания файла в приложении REST spring, но не смог зашифровать и расшифровать. пожалуйста, проверьте мой код
Контроллер - логика загрузки
@CrossOrigin(maxAge = 4800, allowCredentials = "false")
@RequestMapping(value = "/multipleSave/{module}/{reminderId}", method = RequestMethod.POST)
public @ResponseBody String uploadMultiple(@RequestParam("file") MultipartFile[] files,
@PathVariable String module,@PathVariable int reminderId,
HttpSession session, HttpServletResponse response, HttpServletRequest request) {
long limit = 2 * 1024 * 1024;
String fileName = null;
String msg = "";
String modulePath="";
modulePath = path+"/"+module;
if(files.length > 5){
throw new FileUploadException("Max number of Files to upload is 5");
}
if (files != null && files.length > 0) {
for (int i = 0; i < files.length; i++) {
try {
if(files[i].getSize() > limit){
throw new FileUploadException("File upload Limit is 2 mb, please check the size");
}
fileName = files[i].getOriginalFilename();
String ext = fileName.substring(fileName.lastIndexOf('.') + 1);
String dateTime = getCurrentDateTime();
String localDate = dateTime.toString().replaceAll("[^0-9]", "");
String renameFile = fileName.substring(0,fileName.lastIndexOf('.'))+"_"+localDate.toString()+"."+ext;
NRICSecurity sec = new NRICSecurity();
sec.encrypt(renameFile,modulePath+"/"+renameFile+".enc");
} catch (Exception e) {
//Exception
}
}
}
}
renameFile дает FileNotFoundException, как я могу определить весь путь из MultipartFile
Сервис - логика загрузки
public void downloadFile(HttpServletResponse response, int fileId) throws FileNotFoundException, IOException {
FileUpload fileUpload = fileDAO.getFileByFileId(fileId);
if (fileUpload != null) {
try{
new NRICSecurity().decrypt(fileUpload.getFilePath()+"/"+fileUpload.getFileNameOrg()+".enc", fileUpload.getFileName());
}catch(Exception e){
}
Path file = Paths.get(fileUpload.getFilePath(), fileUpload.getFileNameOrg());
if (Files.exists(file)) {
try {
String contentType = Files.probeContentType(file);
response.setContentType(contentType);
response.setHeader("Content-disposition", "attachment; filename=" + fileUpload.getFileName());
Files.copy(file, response.getOutputStream());
response.getOutputStream().flush();
} catch (IOException ex) {
}
} else {
response.sendError(404, new FileNotFoundException().getMessage());
}
} else {
response.sendError(404, new FileNotFoundException().getMessage());
}
}
метод шифрования и дешифрования с использованием RSA
//------File Encryption and Decryption---------
/**
* Encrypt file
* @param filename
* @param outFile
*/
public void encrypt(String fileName, String outFile){
String publickeyFile = mybundle.getString("r365.private.key");
try{
PublicKey publicKey = readPublicKey(publickeyFile);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
processFile(cipher,fileName,outFile);
}catch(Exception e){
e.printStackTrace();
}
}
/**
* Decrypt File
* @param filename
* @param outFile
*/
public void decrypt(String fileName, String outFile){
String privateKeyFile = mybundle.getString("r365.private.key");
try{
PrivateKey privateKey = readPrivateKey(privateKeyFile);
Cipher decryptChiper = Cipher.getInstance("RSA");
decryptChiper.init(Cipher.DECRYPT_MODE, privateKey);
processFile(decryptChiper,fileName,outFile);
}catch(Exception e){
e.printStackTrace();
}
}
private void processFile(Cipher ci,InputStream in,OutputStream out)
throws javax.crypto.IllegalBlockSizeException,
javax.crypto.BadPaddingException,
java.io.IOException
{
byte[] ibuf = new byte[1024];
int len;
while ((len = in.read(ibuf)) != -1) {
byte[] obuf = ci.update(ibuf, 0, len);
if ( obuf != null ) out.write(obuf);
}
byte[] obuf = ci.doFinal();
if ( obuf != null ) out.write(obuf);
}
private void processFile(Cipher ci,String inFile,String outFile)
throws javax.crypto.IllegalBlockSizeException,
javax.crypto.BadPaddingException,
java.io.IOException
{
try (FileInputStream in = new FileInputStream(inFile);
FileOutputStream out = new FileOutputStream(outFile)) {
processFile(ci, in, out);
}
}
метод шифрования и дешифрования работает, если я передаю inFile и outFile с полным путем, при загрузке я не могу получить путь из файла MultiPartFile [], и если я пытаюсь скачать его, он просто загружается в браузер, а не в расположение сервера.