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
补充:综合编程 , 安全编程 ,
- 更多VC++疑问解答:
- VC++ 算法。
- MFC CListCtrl获取列数出错了,怎么回事?
- 谁有VC++6.0企业版中文版的下载地址
- vc++,关于TextOut的一个小问题
- 定义一个三维的CStringArray//一定要使用CArray模板?那操作的时候,使用那个类的函数对数组进行操作呢?
- 关于mfc消息映射的问题
- MFC中用TextOut输出的问题
- 请问如何在VC6.0里MFC下对万年历进行编程
- iArray.Add(iValue);//Add函数的参数不可以用CArray模板???
- 'USES_CONVERSION' : undeclared identifier;'A2W' : undeclared identifier
- vc6.0能不能用CImage,能的话给个例子,以及atlimage.h,
- VC 对话框 标题栏 怎么变成这个样子????如图!
- spin控件的UDN_DELTAPOS消息//下面代码什么作用? [
- VC修改DNF
- vc 套接字 struct
部分文章来自网络,