[英]Encrypting a file data in Java to the same file
我正在開發一個應該接受用戶名和密碼的簡單應用程序,數據保存在一個 CSV 文件中。
我希望對這些數據進行加密,以便沒有人可以簡單地打開它並讀取其中列出的用戶名和密碼,我在網上挖掘並找到了一種對我的應用程序非常有效的好方法,只是它創建了一個帶有加密的新文件數據,原來的還在。
我試圖修改代碼以將加密文件保存在原始文件上,但它給了我一個普通文件,當然,所有數據都丟失了。
這是我的代碼
public static void encryptDecrypt (String key, int cipherMode, File in, File out)
throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IOException
{
FileInputStream fileInputStream = new FileInputStream(in);
FileOutputStream fileOutputStream = new FileOutputStream(out);
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec);
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
if(cipherMode == Cipher.ENCRYPT_MODE) {
cipher.init(Cipher.ENCRYPT_MODE, secretKey, SecureRandom.getInstance("SHA1PRNG"));
CipherInputStream cipherInputStream = new CipherInputStream(fileInputStream, cipher);
write(cipherInputStream, fileOutputStream);
}
else if (cipherMode == Cipher.DECRYPT_MODE){
cipher.init(Cipher.DECRYPT_MODE, secretKey, SecureRandom.getInstance("SHA1PRNG"));
CipherOutputStream cipherOutputStream = new CipherOutputStream(fileOutputStream, cipher);
write(fileInputStream, cipherOutputStream);
}
}
public static void write(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[64];
int numOfByteRead;
while ((numOfByteRead = in.read(buffer)) != -1){
out.write(buffer, 0, numOfByteRead);
}
out.close();
in.close();
}
並且應用程序上的關閉按鈕應該加密包含用戶名和密碼列表的文件,所以我做了以下
public void setCancelButton(){
File login = new File("D:\\Users\\login.csv");
File encrypted = new File("D:\\Users\\login.csv");
try {
encryptDecrypt("12345678", Cipher.ENCRYPT_MODE, login, encrypted);
System.out.println("File Encrypted");
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
Stage stage = (Stage) cancelButton.getScene().getWindow();
stage.close();
}
結果是一個只有一個單元被加密的文件,當試圖反轉解密它產生的同一個文件和空文件的過程時。
除了異常糟糕的加密代碼和異常處理之外,問題在於您打開文件進行寫入,並在此過程中刪除文件。 這就是new FileOutputStream
默認所做的。 所以你首先清除文件,然后輸入流找不到文件,但仍然寫入一個空的填充消息:一個 8 字節的塊。
您實際上可以通過加密明文塊來覆蓋文件,但是您必須使用內存映射文件來執行此操作,這在 Java 的 NIO2 框架中指定。 有關於如何使用內存映射文件的教程。 使用流式傳輸,您必須重寫文件或附加到文件中,這兩種方法都無濟於事。
請注意,如果您的程序中途停止,則您有一個半加密的文件,這可能意味着您被搞砸了。 副本並不總是那么糟糕。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.