程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 移動存儲安全

移動存儲安全

編輯:關於VC++

摘要:實現對移動存儲設備的加密,保護信息隱蔽,防止隱私洩露。

關鍵字:移動存儲設備加密安全

當你的U盤,移動硬盤遺失了,被盜了,或者是遺忘在公共場所,裡面的資料就會完全被別人窺探,如果涉及一些隱私,機密,那後果是很嚴重的。本課題就是在這樣一個情況下產生的。這裡剖析的只是一個最初的演示原型,詳細設計,以及一些細節可以參考源代碼。源代碼在WinXP,VC6.0編譯通過。

1、訪問注冊表讀取計算機上的移動存儲設備

在注冊表

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum

下面可以看到計算機當前的狀態,這裡可以看到所有的存儲設備的情況,包括計算機的硬盤,通過情況下,名稱為0的是計算機硬盤,所以在列出的選擇設備時,會把名稱為0的屏蔽,不然太危險,一旦造成系統的破壞,後果會很麻煩。對注冊表的讀寫:

HKEY hkey;
char sz[256];
DWORD dwtype,sl = 256;
for(int i=1;i<8;i++)
{
  if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum",\
    NULL, KEY_ALL_ACCESS, &hkey)==ERROR_SUCCESS)
  {
    CString id;
    id.Format("%d",i);
    if(RegQueryValueEx(hkey,id,NULL,&dwtype,(LPBYTE)sz,&sl)==ERROR_SUCCESS)
    {
      CString str=(CString)sz;
      m_select.AddString(sz);
    }
  }
}
RegCloseKey(hkey);

2、對磁盤的扇區的操作

Windows 操作系統在很大程度上采取了訪問安全保護機制(例如,在Windows操作系統下不能直接訪問物理內存、不能使用各種DOS、BIOS中斷等等),其實Windows在采取“實保護”措施的同時也提供了另外的一種有別於在DOS下訪問硬件設備的方法,即把所有的硬件設備全部看做“文件”,並允許按照對文件的讀寫方式來對其進行數據存取訪問。對於磁盤扇區的讀寫,可以通過C++的CreateFile()函數來實現。由MSDN可查詢到該函數原型:

HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile );

由於訪問的是事實上已經存在的磁盤扇區,因此只能以OPEN_EXISTING標志設置dwCreationDisposition參數指出將要打開已經存在的文件(設備)。至於其他參數的使用與操作普通文件時的用法相同。

使用的時候,如果需要定位到某一個具體的扇區,可以使用SetFilePointer()函數:

DWORD SetFilePointer(HANDLE hFile,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod);

在定位到要訪問的扇區開始位置後就可以通過ReadFile()或WriteFile()函數實施相應的讀寫訪問了,具體操作與文件讀寫並沒有什麼太大的差別。最後,在完成訪問操作後以CloseHandle()關閉文件句柄釋放資源,從而完成一次完整的磁盤扇區數據訪問操作。

int ReadDisk(CString driver,unsigned char *Buf,long addr)
{
  HANDLE hDevice;
  BOOL bResult;
  DWORD bytesread;

  hDevice=CreateFile(driver,GENERIC_READ|GENERIC_WRITE,
    FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
  if(hDevice==INVALID_HANDLE_VALUE)
  {
    AfxMessageBox("Error!");
    return 0;
  }
  if(addr!=0)
  {
    SetFilePointer(hDevice,512*addr,NULL,NULL);
  }

  bResult=ReadFile(hDevice,Buf,512,&bytesread,NULL);
  if((bResult==FALSE)||(bytesread<512))
  {
    AfxMessageBox("Error!");
    return 0;
  }
  CloseHandle(hDevice);
  return 1;
}

3、用RC4加密算法對磁盤加密。

/* RC4加密,KEY是密鑰,此處Key[]="MobileStorageSecurity",後期可以用戶輸入的密碼作為密鑰 */
RC4_KEY rc4_key;
build_rc4_key(Key,strlen((char*)Key),&rc4_key);
rc4_handler(MBRBuf,strlen((char*)MBRBuf),&rc4_key);

4、U盤插入計算機時的自動感知

LRESULT CRawDiskDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
  if ( WM_DEVICECHANGE == message && FALSE == bCopy )
  {
    //刷新設備列表
  }
  return CDialog::WindowProc(message, wParam, lParam);
}

後期改進

這樣就必須要求在電腦上有這個程序,所以在後期采用同樣的原理,將這個程序放在U盤裡,在加密的時候實現對自身的屏蔽,這樣大大提高程序的易用性。

可以讓用戶輸入密碼,將密碼作為密鑰去加密和解密。

這個只是對一個磁盤最初的512字節加密,後期可以通過對扇區的定位和計算,對目錄表及數據加密。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved