当前位置:编程学习 > VC++ >>

VC++信息安全编程(11)安全删除NTFS磁盘数据文件

 


 

很多时候,为了保护商业秘密,一些文件仅仅许可出现一次,就必须删除。

 

但是Windows的删除是不完善的,可以通过回收站找回,即使Windows的彻底删除,也不是彻底删除。也可以通过数据恢复软件找回,

 

我们如何实现彻底删除,用二进制数据填充磁盘,来彻底清除相关数据呢

 

我们来亲身实践360自带的功能。

 

详细类源码如下,请见源码分析,安全删除NTFS

 

#include "stdafx.h"

 

#include "SecureDelNTFS.h"

#include <time.h>

 

 

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

#define OVERWRITE_PASSES 1

#define BUFFER_SIZE 1024

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

CSecureDelNTFS::CSecureDelNTFS()

{

       Recurse = true;

       ZapFreeSpace = true;

       CleanCompressedFiles = FALSE;

       NumPasses = 1;

       FilesFound = 0;

       firstCall = false;

       deleteDirectories = false;

       //  以系统时间为种子构造随机数

       srand( (unsigned)time( NULL ));

}

 

CSecureDelNTFS::~CSecureDelNTFS()

{

 

}

 

/////////////////////////////////////////////////////////////////////////////

// 函数名:  OverwriteFileName( PTCHAR FileName, PTCHAR LastFileName )

// 参数列表:PTCHAR FileName

//                   PTCHAR LastFileName

// 函数功能:该函数的功能是安全删除文件名

/////////////////////////////////////////////////////////////////////////////

VOID CSecureDelNTFS::OverwriteFileName( PTCHAR FileName, PTCHAR LastFileName )

{

       TCHAR          newName[MAX_PATH];

       PTCHAR        lastSlash;

       DWORD        i, j, index;

 

       _tcscpy( LastFileName, FileName );

       lastSlash = _tcsrchr( LastFileName, _T('\\'));

       index = (lastSlash - LastFileName)/sizeof(TCHAR);

       //  产生一个新的名称

       CString sz="abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";

       if(index>125)

              sz=sz.Left((130-(index-125)));

       CString NewName=((CString) LastFileName).Left(index)+"\\"+CryptString(sz);

       sprintf(LastFileName,"%s",NewName);

       MoveFile( FileName, NewName );

      

       _tcscpy( LastFileName, NewName );

       lastSlash = _tcsrchr( LastFileName, _T('\\'));

       index = (lastSlash - LastFileName)/sizeof(TCHAR);

       int k=_tcsclen( LastFileName );

 

       _tcscpy( newName, NewName );

       int number=rand()*20/32767+2;

       for( i = 0; i < number; i++ )

       {

              //     用随机产生的符号替换文件名中非'.'符号

              for( j = index+1 ; j < _tcsclen( LastFileName ); j++ )

              {

                     if( LastFileName[j] != _T('.'))      

                     {

                            int random=int((rand()*74/32767));

                            if(random>=10 && random<=16)random=17;

                            if(random>=43 && random<=48)random=49;

                            newName[j] = (TCHAR) random + _T('0'); 

                     }

              }

              //     用产生的新名称重命名

              MoveFile( LastFileName, newName );

              _tcscpy( LastFileName, newName );

       }

}

 

/////////////////////////////////////////////////////////////////////////////

// 函数名:  OverwriteDirectoryName( PTCHAR FileName, PTCHAR LastFileName )

// 参数列表:PTCHAR FileName

//                   PTCHAR

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,