Why overwrite a file more than once to securely delete all traces of a file?

前端 未结 13 1739
自闭症患者
自闭症患者 2020-12-08 16:32

Erasing programs such as Eraser recommend overwriting data maybe 36 times.

As I understand it all data is stored on a hard drive as 1s or 0s.

If an overwrite

13条回答
  •  隐瞒了意图╮
    2020-12-08 17:05

    Here's a Gutmann erasing implementation I put together. It uses the cryptographic random number generator to produce a strong block of random data.

    public static void DeleteGutmann(string fileName)
    {
        var fi = new FileInfo(fileName);
    
        if (!fi.Exists)
        {
            return;
        }
    
        const int GutmannPasses = 35;
        var gutmanns = new byte[GutmannPasses][];
    
        for (var i = 0; i < gutmanns.Length; i++)
        {
            if ((i == 14) || (i == 19) || (i == 25) || (i == 26) || (i == 27))
            {
                continue;
            }
    
            gutmanns[i] = new byte[fi.Length];
        }
    
        using (var rnd = new RNGCryptoServiceProvider())
        {
            for (var i = 0L; i < 4; i++)
            {
                rnd.GetBytes(gutmanns[i]);
                rnd.GetBytes(gutmanns[31 + i]);
            }
        }
    
        for (var i = 0L; i < fi.Length;)
        {
            gutmanns[4][i] = 0x55;
            gutmanns[5][i] = 0xAA;
            gutmanns[6][i] = 0x92;
            gutmanns[7][i] = 0x49;
            gutmanns[8][i] = 0x24;
            gutmanns[10][i] = 0x11;
            gutmanns[11][i] = 0x22;
            gutmanns[12][i] = 0x33;
            gutmanns[13][i] = 0x44;
            gutmanns[15][i] = 0x66;
            gutmanns[16][i] = 0x77;
            gutmanns[17][i] = 0x88;
            gutmanns[18][i] = 0x99;
            gutmanns[20][i] = 0xBB;
            gutmanns[21][i] = 0xCC;
            gutmanns[22][i] = 0xDD;
            gutmanns[23][i] = 0xEE;
            gutmanns[24][i] = 0xFF;
            gutmanns[28][i] = 0x6D;
            gutmanns[29][i] = 0xB6;
            gutmanns[30][i++] = 0xDB;
            if (i >= fi.Length)
            {
                continue;
            }
    
            gutmanns[4][i] = 0x55;
            gutmanns[5][i] = 0xAA;
            gutmanns[6][i] = 0x49;
            gutmanns[7][i] = 0x24;
            gutmanns[8][i] = 0x92;
            gutmanns[10][i] = 0x11;
            gutmanns[11][i] = 0x22;
            gutmanns[12][i] = 0x33;
            gutmanns[13][i] = 0x44;
            gutmanns[15][i] = 0x66;
            gutmanns[16][i] = 0x77;
            gutmanns[17][i] = 0x88;
            gutmanns[18][i] = 0x99;
            gutmanns[20][i] = 0xBB;
            gutmanns[21][i] = 0xCC;
            gutmanns[22][i] = 0xDD;
            gutmanns[23][i] = 0xEE;
            gutmanns[24][i] = 0xFF;
            gutmanns[28][i] = 0xB6;
            gutmanns[29][i] = 0xDB;
            gutmanns[30][i++] = 0x6D;
            if (i >= fi.Length)
            {
                continue;
            }
    
            gutmanns[4][i] = 0x55;
            gutmanns[5][i] = 0xAA;
            gutmanns[6][i] = 0x24;
            gutmanns[7][i] = 0x92;
            gutmanns[8][i] = 0x49;
            gutmanns[10][i] = 0x11;
            gutmanns[11][i] = 0x22;
            gutmanns[12][i] = 0x33;
            gutmanns[13][i] = 0x44;
            gutmanns[15][i] = 0x66;
            gutmanns[16][i] = 0x77;
            gutmanns[17][i] = 0x88;
            gutmanns[18][i] = 0x99;
            gutmanns[20][i] = 0xBB;
            gutmanns[21][i] = 0xCC;
            gutmanns[22][i] = 0xDD;
            gutmanns[23][i] = 0xEE;
            gutmanns[24][i] = 0xFF;
            gutmanns[28][i] = 0xDB;
            gutmanns[29][i] = 0x6D;
            gutmanns[30][i++] = 0xB6;
        }
    
        gutmanns[14] = gutmanns[4];
        gutmanns[19] = gutmanns[5];
        gutmanns[25] = gutmanns[6];
        gutmanns[26] = gutmanns[7];
        gutmanns[27] = gutmanns[8];
    
        Stream s;
    
        try
        {
            s = new FileStream(
                fi.FullName,
                FileMode.Open,
                FileAccess.Write,
                FileShare.None,
                (int)fi.Length,
                FileOptions.DeleteOnClose | FileOptions.RandomAccess | FileOptions.WriteThrough);
        }
        catch (UnauthorizedAccessException)
        {
            return;
        }
        catch (IOException)
        {
            return;
        }
    
        using (s)
        {
            if (!s.CanSeek || !s.CanWrite)
            {
                return;
            }
    
            for (var i = 0L; i < gutmanns.Length; i++)
            {
                s.Seek(0, SeekOrigin.Begin);
                s.Write(gutmanns[i], 0, gutmanns[i].Length);
                s.Flush();
            }
        }
    }
    

提交回复
热议问题