Java 加密文件数据并将其写入同一个文件
Java encrypt file data and write it on same file
我正在处理 Encrypt/Decrypt 个文件的项目。因为这是我第一次,我想知道我是否做对了。到目前为止,我对加密的想法是:
Select 一个文件 -> 读取其所有字节并将其添加到字节数组 -> 加密字节数组-> 将加密字节写入同一个文件。
请注意,在此项目中,输出文件与输入文件相同。所以我决定在写入加密字节之前先清除文件。
这可能很愚蠢(这就是我寻求帮助的原因),所以这是我的方法
public class Encryptor {
File file;
SecretKeySpec secretKeySpec;
public void setFile(String filePath) throws Exception {
this.file = new File(filePath);
if(!file.isFile()){
throw new Exception("The file you choosed is not valid");
}
}
public void setKey(String keyword){
try {
MessageDigest sha = MessageDigest.getInstance("SHA-256");
sha.update(keyword.getBytes("UTF-8"));
byte[] key = sha.digest();
secretKeySpec = new SecretKeySpec(key, "AES");
} catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
public void encrypt(){
byte[] bFile = new byte[(int) file.length()];
try {
//adding portocol bytes to the file bytes
//String portcol = "encryptor portocol";
//byte[] decPortocol = portcol.getBytes();
//convert file into array of bytes
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
bufferedInputStream.read(bFile);
bufferedInputStream.close();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//outputStream.write(decPortocol);
outputStream.write(bFile);
byte[] cryptedFileBytes = outputStream.toByteArray();
//Cipher and encrypting
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encryptedBytes = cipher.doFinal(cryptedFileBytes);
//Write Encrypted File
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file,false));
bufferedOutputStream.write(encryptedBytes);
bufferedOutputStream.flush();
bufferedOutputStream.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
主要问题
是否有其他方法可以同时对同一个文件进行读-加密-写?比如一部分一部分地读取字节,同时加密那部分并用加密的字节覆盖它。
你能帮我更多吗?
还有关于如何使我的加密文件更安全的任何信息也会有所帮助。
我的程序会杀死 RAM 吗?!
(注意) 由于某些原因,我在同一个文件上写入加密数据。我不太熟悉硬盘驱动器的工作原理。我的原因之一是防止文件以后被恢复。有什么我必须知道的吗?我正在做的事情会阻止以后恢复未加密的文件吗?
编辑
@erickson 在他的回答中指出了一些重要的事情。我知道这种加密文件的方式并不安全。我正在考虑防止 too,是防止文件以后被恢复。我的意思是,如果您曾经在那里未加密文件,那么加密文件并将其保存在硬盘中是没有意义的!根据我的经验,每次我恢复文件时,我都会到达它的最后编辑,但我永远无法获得更改历史记录。我认为如果我一开始没有错的话,这一定是一样的。那么我该如何帮助防止数据恢复?!
您需要在阅读完文件后关闭 reader。您目前正在这一行中进行操作:
bufferedInputStream.close();
所以没关系。
然后,不用清除文件,您只需使用以下命令简单地覆盖它:
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(filename, false);
希望对您有所帮助:)
边读边写文件可以,但很容易引入会损坏文件的错误。为了安全起见,写入临时文件可能会更好,然后删除原始文件并替换为临时文件。这样一来,所有文件内容始终安全地保存在至少一个文件中。
关于此的一个警告是,如果您加密现有文件,则无法保证原始文件不会仍记录在磁盘上。即使您在读取时写入同一个文件,同一存储是否被加密数据覆盖也将取决于底层文件系统。
如果原始文件以加密形式写入会更好。即使写作应用程序不支持加密,大多数操作系统都支持创建加密文件系统,以便任何应用程序都可以保密文件。
我正在处理 Encrypt/Decrypt 个文件的项目。因为这是我第一次,我想知道我是否做对了。到目前为止,我对加密的想法是:
Select 一个文件 -> 读取其所有字节并将其添加到字节数组 -> 加密字节数组-> 将加密字节写入同一个文件。
请注意,在此项目中,输出文件与输入文件相同。所以我决定在写入加密字节之前先清除文件。
这可能很愚蠢(这就是我寻求帮助的原因),所以这是我的方法
public class Encryptor {
File file;
SecretKeySpec secretKeySpec;
public void setFile(String filePath) throws Exception {
this.file = new File(filePath);
if(!file.isFile()){
throw new Exception("The file you choosed is not valid");
}
}
public void setKey(String keyword){
try {
MessageDigest sha = MessageDigest.getInstance("SHA-256");
sha.update(keyword.getBytes("UTF-8"));
byte[] key = sha.digest();
secretKeySpec = new SecretKeySpec(key, "AES");
} catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
public void encrypt(){
byte[] bFile = new byte[(int) file.length()];
try {
//adding portocol bytes to the file bytes
//String portcol = "encryptor portocol";
//byte[] decPortocol = portcol.getBytes();
//convert file into array of bytes
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
bufferedInputStream.read(bFile);
bufferedInputStream.close();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//outputStream.write(decPortocol);
outputStream.write(bFile);
byte[] cryptedFileBytes = outputStream.toByteArray();
//Cipher and encrypting
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encryptedBytes = cipher.doFinal(cryptedFileBytes);
//Write Encrypted File
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file,false));
bufferedOutputStream.write(encryptedBytes);
bufferedOutputStream.flush();
bufferedOutputStream.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
主要问题
是否有其他方法可以同时对同一个文件进行读-加密-写?比如一部分一部分地读取字节,同时加密那部分并用加密的字节覆盖它。
你能帮我更多吗?
还有关于如何使我的加密文件更安全的任何信息也会有所帮助。
我的程序会杀死 RAM 吗?!
(注意) 由于某些原因,我在同一个文件上写入加密数据。我不太熟悉硬盘驱动器的工作原理。我的原因之一是防止文件以后被恢复。有什么我必须知道的吗?我正在做的事情会阻止以后恢复未加密的文件吗?
编辑 @erickson 在他的回答中指出了一些重要的事情。我知道这种加密文件的方式并不安全。我正在考虑防止 too,是防止文件以后被恢复。我的意思是,如果您曾经在那里未加密文件,那么加密文件并将其保存在硬盘中是没有意义的!根据我的经验,每次我恢复文件时,我都会到达它的最后编辑,但我永远无法获得更改历史记录。我认为如果我一开始没有错的话,这一定是一样的。那么我该如何帮助防止数据恢复?!
您需要在阅读完文件后关闭 reader。您目前正在这一行中进行操作:
bufferedInputStream.close();
所以没关系。 然后,不用清除文件,您只需使用以下命令简单地覆盖它:
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(filename, false);
希望对您有所帮助:)
边读边写文件可以,但很容易引入会损坏文件的错误。为了安全起见,写入临时文件可能会更好,然后删除原始文件并替换为临时文件。这样一来,所有文件内容始终安全地保存在至少一个文件中。
关于此的一个警告是,如果您加密现有文件,则无法保证原始文件不会仍记录在磁盘上。即使您在读取时写入同一个文件,同一存储是否被加密数据覆盖也将取决于底层文件系统。
如果原始文件以加密形式写入会更好。即使写作应用程序不支持加密,大多数操作系统都支持创建加密文件系统,以便任何应用程序都可以保密文件。