2010-01-14 80 views
6

Tôi đã được giao nhiệm vụ ghi đè tất cả dung lượng trống trên một vài máy tính xách tay 3 lần. Tôi biết có một số lựa chọn thay thế nhưng tôi muốn biết làm thế nào những thứ làm việc và nếu tôi có thể làm điều đó bản thân mình với C#.Xóa dung lượng trống trên ổ đĩa cứng bằng C#

1) vâng, tôi biết có rất nhiều các ứng dụng phần mềm miễn phí mà sẽ làm điều này

2) không, chúng ta không cần phải phù hợp với bất kỳ chính phủ cụ thể tiêu chuẩn

đâu Tôi tìm ý tưởng về cách bắt đầu điều này?

Cảm ơn bạn có thể chỉ cho tôi đúng hướng hay không.

Có thể đạt được bằng C# không? Nếu vậy, làm thế nào?

+4

Có vẻ như không cần ghi đè nhiều lần http://hostjury.com/blog/view/195/the-great-zero-challenge-remains-unaccepted http://stackoverflow.com/questions/59656/why-overwrite-a-file-more-than-once-to-secure-delete-all-dấu vết-of-a-file –

Trả lời

3

đơn giản thuật toán: (.. Tốt nhất để sử dụng một tập tin trước khi tạo ra thay vì tái sinh ngẫu nhiên vì lý do hiệu suất Kiểm tra nó ra)

  • Tạo một tập tin văn bản lớn đầy đủ các văn bản tùy ý
  • Tạo một thông minh lược đồ đặt tên tệp và thư mục để có thể theo dõi các tệp. Bạn cũng nên theo dõi các tập tin với ứng dụng của bạn, nhưng nếu nó bị treo, đặc biệt là gần cuối của một vài thử nghiệm đầu tiên chạy, bạn sẽ muốn có thể dễ dàng tìm và làm sạch công việc tiện dụng của bạn.
  • Viết nó vào HDD cho đến khi nó đầy đủ
  • Xóa các tập tin mà bạn đã tạo
  • Lặp lại trên bước thêm hai lần

Cập nhật: More xem xét tiên tiến trên lau mỗi cuộc thảo luận tiếp theo:

  • Trên tệp ghi đầu tiên có giá trị 0x0000 (tất cả các bit tắt)
  • Trên giây s viết tất cả các bit là 0xFFFF (tất cả các bit trên)
  • On cuối cùng vượt qua lặp lại với 0x0000

Trên đây bỏ qua một vài ý tưởng như kích thước tốt nhất của tập tin là gì, phụ thuộc vào hệ thống tập tin của bạn anyway. Bạn cũng có thể nhận được các hành vi khác nhau từ hệ điều hành khi bạn ở gần một ổ cứng đầy ...

+0

Điều này có thể là một cách tốt hơn nhiều so với tôi để xử lý việc thực hiện đơn giản mà anh đang tìm kiếm. Như tôi đã nói, tôi không có chuyên gia nào trong lĩnh vực này;) – hackerhasid

+0

Tôi sẽ chỉ thêm vào, việc ghi số không vào tệp thậm chí còn tốt hơn (không cần thêm văn bản vào nó). – gbianchi

+0

@gbianchi: Có lẽ ... Đó là lý do nó lý thuyết hơn một chút. Liệu văn bản ngẫu nhiên có tốt hơn trong việc làm hư hỏng các tên trộm dữ liệu không? Có lẽ, có lẽ không. Cũng có thể thực sự tốt hơn để chuyển đổi giữa 0 và 1 để buộc một chút lật để thực sự "lung" ra các dữ liệu trước đó. –

0

Bạn sẽ phải thực hiện một số thao tác ở mức độ thấp, vì vậy chắc chắn bạn sẽ phải nói chuyện với API Win32. Tôi đã không làm điều này loại, vì vậy tôi không thể cung cấp cho bạn chi tiết cụ thể, nhưng một nơi tốt để bắt đầu tìm kiếm có thể là tham khảo API Win32: http://msdn.microsoft.com/en-us/library/aa383749%28VS.85%29.aspx

Tôi thực sự không phải là một chuyên gia trong lĩnh vực này ở tất cả , nhưng có vẻ như sự hiểu biết ngây thơ của tôi rằng bạn sẽ cần: 1) nhận thông tin về nơi hệ thống tệp bắt đầu & dừng 2) bằng cách sử dụng các tệp không bị xóa làm tham chiếu, nhận danh sách vị trí thực tế miễn phí không gian 3) viết 0 cho những địa điểm

Có lẽ đây không phải là một câu trả lời tuyệt vời vì tôi không phải là chuyên gia trong lĩnh vực này, nhưng nó quá dài để nhận xét;) Tôi hy vọng sẽ giúp ít.

-1

Kiểm tra tài liệu SDelete, có thể bạn có thể tìm được đầu mối ở đó.

+1

có sẵn bằng tiếng Anh không? – hackerhasid

+1

oops, xin lỗi, đã thay đổi thành en-us – jmservera

1

Mã này là từ The Code Project Tôi nghĩ vậy. Tôi không chắc chắn nơi bài viết orignal là, nhưng nó làm những gì bạn yêu cầu:

Dựa trên ý kiến ​​của tôi rõ ràng cần phải spoonfeed hơn một chút ..

Bạn có thể làm điều này rất đơn giản, dựa trên yêu cầu của bạn .

  1. Tạo 1 tệp lớn làm đầy kích thước miễn phí còn lại trên ổ đĩa của bạn. Sau đó, chỉ cần xóa tệp này.

  2. Tạo một số tệp cho đến khi ổ của bạn đầy. (Điều này có thể tốt hơn nếu bạn muốn sử dụng máy trong khi nó đang diễn ra). Sau đó, bạn có thể bắt đầu xóa từng tập tin, do đó, trong tổng thời gian hệ thống có một ổ đĩa cứng đầy đủ là nhỏ hơn so với sử dụng phương pháp 1. Nhưng nó có thể sẽ chậm hơn một chút và sử dụng mã nhiều hơn một chút.

Lợi thế của việc sử dụng là một số ít, mã dễ sử dụng. Bạn không phải chơi với các API cấp thấp sẽ làm bạn thất vọng.

using System; 
using System.IO; 
using System.Security.Cryptography; 

namespace QuickStarterShared 
{ 
    public class Wipe 
    { 
     /// <summary> 
     /// Deletes a file in a secure way by overwriting it with 
     /// random garbage data n times. 
     /// </summary> 
     /// <param name="filename">Full path of the file to be deleted</param> 
     /// <param name="timesToWrite">Specifies the number of times the file should be overwritten</param> 
     public void WipeFile(string filename, int timesToWrite) 
     { 
#if !DEBUG 
      try 
      { 
#endif 
       if (File.Exists(filename)) 
       { 
        // Set the files attributes to normal in case it's read-only. 
        File.SetAttributes(filename, FileAttributes.Normal); 

        // Calculate the total number of sectors in the file. 
        double sectors = Math.Ceiling(new FileInfo(filename).Length/512.0); 

        // Create a dummy-buffer the size of a sector. 
        byte[] dummyBuffer = new byte[512]; 

        // Create a cryptographic Random Number Generator. 
        // This is what I use to create the garbage data. 
        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 

        // Open a FileStream to the file. 
        FileStream inputStream = new FileStream(filename, FileMode.Open); 
        for (int currentPass = 0; currentPass < timesToWrite; currentPass++) 
        { 
         // Go to the beginning of the stream 
         inputStream.Position = 0; 

         // Loop all sectors 
         for (int sectorsWritten = 0; sectorsWritten < sectors; sectorsWritten++) 
         { 
          // Fill the dummy-buffer with random data 
          rng.GetBytes(dummyBuffer); 
          // Write it to the stream 
          inputStream.Write(dummyBuffer, 0, dummyBuffer.Length); 
         } 
        } 
        // Truncate the file to 0 bytes. 
        // This will hide the original file-length if you try to recover the file. 
        inputStream.SetLength(0); 
        // Close the stream. 
        inputStream.Close(); 

        // As an extra precaution I change the dates of the file so the 
        // original dates are hidden if you try to recover the file. 
        DateTime dt = new DateTime(2037, 1, 1, 0, 0, 0); 
        File.SetCreationTime(filename, dt); 
        File.SetLastAccessTime(filename, dt); 
        File.SetLastWriteTime(filename, dt); 

        File.SetCreationTimeUtc(filename, dt); 
        File.SetLastAccessTimeUtc(filename, dt); 
        File.SetLastWriteTimeUtc(filename, dt); 

        // Finally, delete the file 
        File.Delete(filename); 
       } 
#if !DEBUG 
      } 
      catch(Exception e) 
      { 

      } 
#endif 
     } 
    } 

    # region Events 
    # region PassInfo 
    public delegate void PassInfoEventHandler(PassInfoEventArgs e); 
    public class PassInfoEventArgs : EventArgs 
    { 
     private readonly int cPass; 
     private readonly int tPass; 

     public PassInfoEventArgs(int currentPass, int totalPasses) 
     { 
      cPass = currentPass; 
      tPass = totalPasses; 
     } 

     /// <summary> Get the current pass </summary> 
     public int CurrentPass { get { return cPass; } } 
     /// <summary> Get the total number of passes to be run </summary> 
     public int TotalPasses { get { return tPass; } } 
    } 
    # endregion 

    # region SectorInfo   
    public delegate void SectorInfoEventHandler(SectorInfoEventArgs e); 
    public class SectorInfoEventArgs : EventArgs 
    { 
     private readonly int cSector; 
     private readonly int tSectors; 

     public SectorInfoEventArgs(int currentSector, int totalSectors) 
     { 
      cSector = currentSector; 
      tSectors = totalSectors; 
     } 

     /// <summary> Get the current sector </summary> 
     public int CurrentSector { get { return cSector; } } 
     /// <summary> Get the total number of sectors to be run </summary> 
     public int TotalSectors { get { return tSectors; } } 
    } 
    # endregion 

    # region WipeDone   
    public delegate void WipeDoneEventHandler(WipeDoneEventArgs e); 
    public class WipeDoneEventArgs : EventArgs 
    { 
    } 
    # endregion 

    # region WipeError 
    public delegate void WipeErrorEventHandler(WipeErrorEventArgs e); 
    public class WipeErrorEventArgs : EventArgs 
    { 
     private readonly Exception e; 

     public WipeErrorEventArgs(Exception error) 
     { 
      e = error; 
     } 

     public Exception WipeError{get{ return e;}} 
    } 
    # endregion 
    # endregion 
} 
+0

Thao tác này sẽ xóa một tệp riêng lẻ. Câu hỏi đặt ra là xóa sạch tất cả dung lượng trống trên ổ cứng ... chứa các tệp đã bị xóa/bị xóa có thể được một số bên thứ ba thu hồi. –

+0

Điều này là để ghi đè an toàn tệp hiện có. Anh ấy đang tìm cách xóa sạch không gian trống trên ổ đĩa của mình. – hackerhasid

+3

Đây không phải là những gì tôi yêu cầu trong OP nhưng cảm ơn vẫn rất thú vị – Crash893

-1
System.Diagonstics.Process.Start("chipher.exe /WC:\"); 

này là không đồng bộ theo mặc định, bạn sẽ có được ý tưởng.

2

Đây là thực sự nguy hiểm nhưng ..

Bạn có thể sử dụng Defrag APIs (here's a C# wrapper) để có được giữ của ổ 'bản đồ' và đặc biệt nhắm vào freespace và viết rác cho những bộ phận của đĩa.

+0

Nếu bạn lấp đầy tất cả không gian trống cùng một lúc với các tệp, bạn có thể gây ra sự cố nếu có bất cứ điều gì khác cố gắng ghi vào đĩa hoặc bộ nhớ ảo cố mở rộng. Nếu bạn sử dụng API Defrag, ít nhất bạn có thể xóa không gian trống mà không gây ra sự cố, giả sử bạn làm đúng. –

Các vấn đề liên quan