簡體   English   中英

將Java中的文件數據加密到同一個文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM